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端口显示
程序代码:
LZ可以去看看马老师状态机按键的资料...
可以完成,短按、长按、连发、 组合等更复杂的功能.... 楼主,关键代码没给出来吧,
无阻塞主要的不是怎么烧苗这一块,而是状态(states)变化那一部分的处理 richyhuang 发表于 2013-4-30 23:33 static/image/common/back.gif
楼主,关键代码没给出来吧,
无阻塞主要的不是怎么烧苗这一块,而是状态(states)变化那一部分的处理 ...
代码在附件里 foxpro2005 发表于 2013-4-30 23:33 static/image/common/back.gif
LZ可以去看看马老师状态机按键的资料...
可以完成,短按、长按、连发、 组合等更复杂的功能.... ...
有思想,什么都能实现。我现在只做其础的,给入门的人提供一种方法 richyhuang 发表于 2013-4-30 23:33 static/image/common/back.gif
楼主,关键代码没给出来吧,
无阻塞主要的不是怎么烧苗这一块,而是状态(states)变化那一部分的处理 ...
状态机是好,但他会把一个问题复杂化,有时有简单的方法。但都会用很复杂的方法去实现它。 foxpro2005 发表于 2013-4-30 23:33 static/image/common/back.gif
LZ可以去看看马老师状态机按键的资料...
可以完成,短按、长按、连发、 组合等更复杂的功能.... ...
在那个网页? xunke 发表于 2013-5-1 10:57 static/image/common/back.gif
在那个网页?
有个“马潮AVR”专栏,推荐主题里能看到4*4按键 4x4键盘用异步状态机完成无阻塞很容易,真正难解决的是"幽灵键"问题,能把这个搞定才牛{:titter:} Scarlette 发表于 2013-5-1 13:07 static/image/common/back.gif
4x4键盘用异步状态机完成无阻塞很容易,真正难解决的是"幽灵键"问题,能把这个搞定才牛 ...
幽灵键 什么意思,说出来大家讨论一下 Scarlette 发表于 2013-5-1 13:07 static/image/common/back.gif
4x4键盘用异步状态机完成无阻塞很容易,真正难解决的是"幽灵键"问题,能把这个搞定才牛 ...
这个不太清楚,只是没事就写了一些小程序 cyr_hongfeng 发表于 2013-5-1 13:26 static/image/common/back.gif
幽灵键 什么意思,说出来大家讨论一下
看图,不多说了,呵呵 mark看大侠讨论 Scarlette 发表于 2013-5-2 00:25 static/image/common/back.gif
看图,不多说了,呵呵
这个应该算是组合键吧? 我的键值是用的unsigned int型,其实就是为了后面对每个键值处理。如果需要更多的键值信息,到时还会每4位一个按值。 Scarlette 发表于 2013-5-2 00:25 static/image/common/back.gif
看图,不多说了,呵呵
矩阵是扫描的,你那一种情况就不成立了? 呵呵,骚年,自己搭个试一下嘛,SW11、SW12、SW22都按住的时候,看看你能不能正确读到SW21的状态{:titter:} Scarlette 发表于 2013-5-2 10:54 static/image/common/back.gif
呵呵,骚年,自己搭个试一下嘛,SW11、SW12、SW22都按住的时候,看看你能不能正确读到SW21的状态 ...
试了一下,是有点问题
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;
} 正准备做矩阵键盘{:lol:} 这是我的仿真例程:
mark,观摩中 学习学习。。。。
页:
[1]