搜索
bottom↓
回复: 22

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

[复制链接]

出255入0汤圆

发表于 2013-4-30 23:22:03 | 显示全部楼层 |阅读模式
按键扫描代码:
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端口显示
程序代码:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入76汤圆

发表于 2013-4-30 23:33:10 | 显示全部楼层
LZ可以去看看马老师状态机按键的资料...

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

出0入0汤圆

发表于 2013-4-30 23:33:23 | 显示全部楼层
楼主,关键代码没给出来吧,
无阻塞主要的不是怎么烧苗这一块,而是状态(states)变化那一部分的处理

出255入0汤圆

 楼主| 发表于 2013-4-30 23:37:53 | 显示全部楼层
richyhuang 发表于 2013-4-30 23:33
楼主,关键代码没给出来吧,
无阻塞主要的不是怎么烧苗这一块,而是状态(states)变化那一部分的处理 ...

代码在附件里

出255入0汤圆

 楼主| 发表于 2013-4-30 23:39:09 | 显示全部楼层
foxpro2005 发表于 2013-4-30 23:33
LZ可以去看看马老师状态机按键的资料...

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

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

出255入0汤圆

 楼主| 发表于 2013-4-30 23:40:39 | 显示全部楼层
richyhuang 发表于 2013-4-30 23:33
楼主,关键代码没给出来吧,
无阻塞主要的不是怎么烧苗这一块,而是状态(states)变化那一部分的处理 ...

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

出0入112汤圆

发表于 2013-5-1 10:57:55 | 显示全部楼层
foxpro2005 发表于 2013-4-30 23:33
LZ可以去看看马老师状态机按键的资料...

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


在那个网页?

出0入0汤圆

发表于 2013-5-1 11:41:00 | 显示全部楼层
xunke 发表于 2013-5-1 10:57
在那个网页?

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

出0入0汤圆

发表于 2013-5-1 13:07:16 | 显示全部楼层
4x4键盘用异步状态机完成无阻塞很容易,真正难解决的是"幽灵键"问题,能把这个搞定才牛

出0入0汤圆

发表于 2013-5-1 13:26:48 | 显示全部楼层
Scarlette 发表于 2013-5-1 13:07
4x4键盘用异步状态机完成无阻塞很容易,真正难解决的是"幽灵键"问题,能把这个搞定才牛 ...

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

出255入0汤圆

 楼主| 发表于 2013-5-1 21:15:11 | 显示全部楼层
Scarlette 发表于 2013-5-1 13:07
4x4键盘用异步状态机完成无阻塞很容易,真正难解决的是"幽灵键"问题,能把这个搞定才牛 ...

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

出0入0汤圆

发表于 2013-5-2 00:25:54 | 显示全部楼层
cyr_hongfeng 发表于 2013-5-1 13:26
幽灵键 什么意思,说出来大家讨论一下

看图,不多说了,呵呵

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-5-2 09:44:56 来自手机 | 显示全部楼层
mark  看大侠讨论

出255入0汤圆

 楼主| 发表于 2013-5-2 10:39:16 | 显示全部楼层
Scarlette 发表于 2013-5-2 00:25
看图,不多说了,呵呵

这个应该算是组合键吧?

出255入0汤圆

 楼主| 发表于 2013-5-2 10:41:16 | 显示全部楼层
我的键值是用的unsigned int型,其实就是为了后面对每个键值处理。如果需要更多的键值信息,到时还会每4位一个按值。

出255入0汤圆

 楼主| 发表于 2013-5-2 10:43:30 | 显示全部楼层
Scarlette 发表于 2013-5-2 00:25
看图,不多说了,呵呵

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

出0入0汤圆

发表于 2013-5-2 10:54:09 | 显示全部楼层
呵呵,骚年,自己搭个试一下嘛,SW11、SW12、SW22都按住的时候,看看你能不能正确读到SW21的状态

出255入0汤圆

 楼主| 发表于 2013-5-2 11:04:24 | 显示全部楼层
Scarlette 发表于 2013-5-2 10:54
呵呵,骚年,自己搭个试一下嘛,SW11、SW12、SW22都按住的时候,看看你能不能正确读到SW21的状态 ...

试了一下,是有点问题

出255入0汤圆

 楼主| 发表于 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;
}

出0入0汤圆

发表于 2013-5-2 11:22:20 | 显示全部楼层
正准备做矩阵键盘

出255入0汤圆

 楼主| 发表于 2013-5-2 11:24:23 | 显示全部楼层
这是我的仿真例程:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-5-2 12:22:48 | 显示全部楼层
mark,观摩中

出0入0汤圆

发表于 2013-5-2 21:24:13 | 显示全部楼层
学习学习。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表