
这几天 在看 按键检测。首先要感谢网上 的大牛们, 在这里 我做一下转载!!! 网上找到几个 帖子, 有兴趣的同学可以 学习一下。 这是第一个推荐学习的:(可惜阿莫论坛的账号 现在去不了!!!) http://www.amobbs.com/forum.php?mod=viewthread&tid=3264955 这个例子的代码写得很漂亮, 可以说爱不释手!!!!只可惜我还没参悟透 这个需要根据自己的硬件连接 来修改 Keyread 的 函数, 我还没参悟出 实际中 这个和实际按键连接 的关系是怎样? 但是可以看出作者很巧妙的把 第几个按键 和按键的 触发类型 融合成一个 char 字符 返回来!
1. 如果有能看透 注释的,希望分享一下。 本以为状态机 就是 最牛B的写法, 后面又看到了一个更牛B 精简的写法: http://blog.csdn.net/caiyunfreedom/article/details/6543256 这个帖子的大神 讲解得 很清楚。 但是存在一个问题,我正在思考中。 2. 就是按键在判断 长按的时候, 我们该如何处理 只执行一次? 如果一直长按不放的话, 那么 Long_Press_cnt 就一直加, 加完又清零。 然后你不放的话, 又一直加, 这样 就导致了 长按不放 那么 按键就一直 无限次的循环 。。 所以这里还有这个逻辑需要 在完善, 等我想出来 再共享!!!
再最最最最 后, 上面的一切其实都只是 方法, 最最最 重要的还是 分时复用的 思想!!!!如果彻底领悟了这个思想并灵活应用那么 单片机就真正的入门了。 关于这个 ,大家可以看看 《从单片机初学者迈向单片机工程师》 这篇文章 ! |
æ°å»ºææ¬ææ¡£.rar
2015-10-20 10:14 上传
点击文件名下载附件
1.87 KB, 下载次数: 35
unsigned char Trg;
unsigned char Cont;
void KeyRead( void )
{ //什么叫异或运算?:简单地说就是相同出0,不同出1.参与运算的两个值,如果两个相应的位bit
//相同,则结果为0;否则为1. 如:0^0=0;0^1=1; 1^0=1; 1^1=0;
unsigned char ReadData = PINB^0xff; // 1,读端口数据即端口字节值,异或运算(或->取反)
Trg = ReadData & (ReadData ^ Cont); // 2,触发即按下按键
Cont = ReadData; // 3,连续按下
}
但是如果是长按,如何 只让它触发一次, 直到松开手 下次长按再触发 呢???
目前长按 不放的 话, 会一直重复触发!
void tiem1(void) interrupt 3{
keyscan();
switch(Trg)
{ case 0x01:
break;
case 0x02:
break;
case 0x04:
break;
default :break;
}
display();
TH1 = 0x63;
TL1 = 0xc0;
}