天使之翼 发表于 2013-4-30 23:22:03

4X4矩阵键盘无阻塞扫描方法一

按键扫描代码:
void KEY4X4_IO_Scan(void)
{
    unsigned int KEY_Value_Temp = 0;
    KEY4X4_IO_Init();

    ROW_SCAN_IO(ROW0_INDEX);
    if(COL_SCAN_IO(COL0_INDEX)) KEY_Value_Temp = 1;
    if(COL_SCAN_IO(COL1_INDEX)) KEY_Value_Temp = 2;
    if(COL_SCAN_IO(COL2_INDEX)) KEY_Value_Temp = 3;
    if(COL_SCAN_IO(COL3_INDEX)) KEY_Value_Temp = 4;

    //Delay_ms(100);
    ROW_SCAN_IO(ROW1_INDEX);
    if(COL_SCAN_IO(COL0_INDEX)) KEY_Value_Temp = 5;
    if(COL_SCAN_IO(COL1_INDEX)) KEY_Value_Temp = 6;
    if(COL_SCAN_IO(COL2_INDEX)) KEY_Value_Temp = 7;
    if(COL_SCAN_IO(COL3_INDEX)) KEY_Value_Temp = 8;
    //Delay_ms(100);
/**/
    ROW_SCAN_IO(ROW2_INDEX);
    if(COL_SCAN_IO(COL0_INDEX)) KEY_Value_Temp = 9;
    if(COL_SCAN_IO(COL1_INDEX)) KEY_Value_Temp = 10;
    if(COL_SCAN_IO(COL2_INDEX)) KEY_Value_Temp = 11;
    if(COL_SCAN_IO(COL3_INDEX)) KEY_Value_Temp = 12;

    ROW_SCAN_IO(ROW3_INDEX);
    if(COL_SCAN_IO(COL0_INDEX)) KEY_Value_Temp = 13;
    if(COL_SCAN_IO(COL1_INDEX)) KEY_Value_Temp = 14;
    if(COL_SCAN_IO(COL2_INDEX)) KEY_Value_Temp = 15;
    if(COL_SCAN_IO(COL3_INDEX)) KEY_Value_Temp = 16;

    gKEY_Value = KEY_Value_Temp;
}
仿真效果:

键值用PORTA端口显示
程序代码:

foxpro2005 发表于 2013-4-30 23:33:10

LZ可以去看看马老师状态机按键的资料...

可以完成,短按、长按、连发、 组合等更复杂的功能....

richyhuang 发表于 2013-4-30 23:33:23

楼主,关键代码没给出来吧,
无阻塞主要的不是怎么烧苗这一块,而是状态(states)变化那一部分的处理

天使之翼 发表于 2013-4-30 23:37:53

richyhuang 发表于 2013-4-30 23:33 static/image/common/back.gif
楼主,关键代码没给出来吧,
无阻塞主要的不是怎么烧苗这一块,而是状态(states)变化那一部分的处理 ...

代码在附件里

天使之翼 发表于 2013-4-30 23:39:09

foxpro2005 发表于 2013-4-30 23:33 static/image/common/back.gif
LZ可以去看看马老师状态机按键的资料...

可以完成,短按、长按、连发、 组合等更复杂的功能.... ...

有思想,什么都能实现。我现在只做其础的,给入门的人提供一种方法

天使之翼 发表于 2013-4-30 23:40:39

richyhuang 发表于 2013-4-30 23:33 static/image/common/back.gif
楼主,关键代码没给出来吧,
无阻塞主要的不是怎么烧苗这一块,而是状态(states)变化那一部分的处理 ...

状态机是好,但他会把一个问题复杂化,有时有简单的方法。但都会用很复杂的方法去实现它。

xunke 发表于 2013-5-1 10:57:55

foxpro2005 发表于 2013-4-30 23:33 static/image/common/back.gif
LZ可以去看看马老师状态机按键的资料...

可以完成,短按、长按、连发、 组合等更复杂的功能.... ...

在那个网页?

sf49ers 发表于 2013-5-1 11:41:00

xunke 发表于 2013-5-1 10:57 static/image/common/back.gif
在那个网页?

有个“马潮AVR”专栏,推荐主题里能看到4*4按键

Scarlette 发表于 2013-5-1 13:07:16

4x4键盘用异步状态机完成无阻塞很容易,真正难解决的是"幽灵键"问题,能把这个搞定才牛{:titter:}

cyr_hongfeng 发表于 2013-5-1 13:26:48

Scarlette 发表于 2013-5-1 13:07 static/image/common/back.gif
4x4键盘用异步状态机完成无阻塞很容易,真正难解决的是"幽灵键"问题,能把这个搞定才牛 ...

幽灵键 什么意思,说出来大家讨论一下

天使之翼 发表于 2013-5-1 21:15:11

Scarlette 发表于 2013-5-1 13:07 static/image/common/back.gif
4x4键盘用异步状态机完成无阻塞很容易,真正难解决的是"幽灵键"问题,能把这个搞定才牛 ...

这个不太清楚,只是没事就写了一些小程序

Scarlette 发表于 2013-5-2 00:25:54

cyr_hongfeng 发表于 2013-5-1 13:26 static/image/common/back.gif
幽灵键 什么意思,说出来大家讨论一下

看图,不多说了,呵呵

943941946 发表于 2013-5-2 09:44:56

mark看大侠讨论

天使之翼 发表于 2013-5-2 10:39:16

Scarlette 发表于 2013-5-2 00:25 static/image/common/back.gif
看图,不多说了,呵呵

这个应该算是组合键吧?

天使之翼 发表于 2013-5-2 10:41:16

我的键值是用的unsigned int型,其实就是为了后面对每个键值处理。如果需要更多的键值信息,到时还会每4位一个按值。

天使之翼 发表于 2013-5-2 10:43:30

Scarlette 发表于 2013-5-2 00:25 static/image/common/back.gif
看图,不多说了,呵呵

矩阵是扫描的,你那一种情况就不成立了?

Scarlette 发表于 2013-5-2 10:54:09

呵呵,骚年,自己搭个试一下嘛,SW11、SW12、SW22都按住的时候,看看你能不能正确读到SW21的状态{:titter:}

天使之翼 发表于 2013-5-2 11:04:24

Scarlette 发表于 2013-5-2 10:54 static/image/common/back.gif
呵呵,骚年,自己搭个试一下嘛,SW11、SW12、SW22都按住的时候,看看你能不能正确读到SW21的状态 ...

试了一下,是有点问题

天使之翼 发表于 2013-5-2 11:04:54

void KEY4X4_IO_Scan(void)
{
    unsigned int KEY_Value_Temp = 0;
    KEY4X4_IO_Init();

    ROW_SCAN_IO(ROW0_INDEX);
    if(COL_SCAN_IO(COL0_INDEX)) KEY_Value_Temp |= BIT(0);
    if(COL_SCAN_IO(COL1_INDEX)) KEY_Value_Temp |= BIT(1);
    if(COL_SCAN_IO(COL2_INDEX)) KEY_Value_Temp |= BIT(2);
    if(COL_SCAN_IO(COL3_INDEX)) KEY_Value_Temp |= BIT(3);

    //Delay_ms(100);
    ROW_SCAN_IO(ROW1_INDEX);
    if(COL_SCAN_IO(COL0_INDEX)) KEY_Value_Temp |= BIT(4);
    if(COL_SCAN_IO(COL1_INDEX)) KEY_Value_Temp |= BIT(5);
    if(COL_SCAN_IO(COL2_INDEX)) KEY_Value_Temp |= BIT(6);
    if(COL_SCAN_IO(COL3_INDEX)) KEY_Value_Temp |= BIT(7);
    //Delay_ms(100);

    ROW_SCAN_IO(ROW2_INDEX);
    if(COL_SCAN_IO(COL0_INDEX)) KEY_Value_Temp |= BIT(8);
    if(COL_SCAN_IO(COL1_INDEX)) KEY_Value_Temp |= BIT(9);
    if(COL_SCAN_IO(COL2_INDEX)) KEY_Value_Temp |= BIT(10);
    if(COL_SCAN_IO(COL3_INDEX)) KEY_Value_Temp |= BIT(11);

    ROW_SCAN_IO(ROW3_INDEX);
    if(COL_SCAN_IO(COL0_INDEX)) KEY_Value_Temp |= BIT(12);
    if(COL_SCAN_IO(COL1_INDEX)) KEY_Value_Temp |= BIT(13);
    if(COL_SCAN_IO(COL2_INDEX)) KEY_Value_Temp |= BIT(14);
    if(COL_SCAN_IO(COL3_INDEX)) KEY_Value_Temp |= BIT(15);

    gKEY_Value = KEY_Value_Temp;
}

ITOP 发表于 2013-5-2 11:22:20

正准备做矩阵键盘{:lol:}

天使之翼 发表于 2013-5-2 11:24:23

这是我的仿真例程:

eleven_sue 发表于 2013-5-2 12:22:48

mark,观摩中

jz701209李 发表于 2013-5-2 21:24:13

学习学习。。。。
页: [1]
查看完整版本: 4X4矩阵键盘无阻塞扫描方法一