在线时间23 小时
UID409464
ST金币200
蝴蝶豆0
注册时间2015-3-24
该用户从未签到
中级会员
- 最后登录
- 2021-1-6
|
这几天 在看 按键检测。首先要感谢网上 的大牛们, 在这里 我做一下转载!!!
网上找到几个 帖子, 有兴趣的同学可以 学习一下。
这是第一个推荐学习的:(可惜阿莫论坛的账号 现在去不了!!!)
http://www.amobbs.com/forum.php?mod=viewthread&tid=3264955
这个例子的代码写得很漂亮, 可以说爱不释手!!!!只可惜我还没参悟透
这个需要根据自己的硬件连接 来修改 Keyread 的 函数, 我还没参悟出 实际中 这个和实际按键连接 的关系是怎样?
但是可以看出作者很巧妙的把 第几个按键 和按键的 触发类型 融合成一个 char 字符 返回来!
- /*
- 功能描述:读取按键状态, 根据不同按键电路和编号方式修改本函数
- 入口参数:无
- 出口参数:按键编号
- */
- static u8 KEY_Read(void)
- {
-
- u8 KCode = 0;
- /* u8 KMask;
- // 读引脚状态,取反后1表示键按下
- KMask = GPIO_ReadInputData(KEY_PORT) ^ 0xFF;
-
- // KEY_PORT上接8个独立式按键,从低到高编号为1~8
- while(KMask != 0)
- {
- KMask >>= 1;
- KCode++;
- }
- */
- if( GPIO_ReadInputPin(KEY_PORT, KEY_PIN) == RESET )
- KCode = 1;
- return KCode;
- }
复制代码
1. 如果有能看透 注释的,希望分享一下。
本以为状态机 就是 最牛B的写法, 后面又看到了一个更牛B 精简的写法:
http://blog.csdn.net/caiyunfreedom/article/details/6543256
这个帖子的大神 讲解得 很清楚。
但是存在一个问题,我正在思考中。
2. 就是按键在判断 长按的时候, 我们该如何处理 只执行一次?
如果一直长按不放的话, 那么 Long_Press_cnt 就一直加, 加完又清零。
然后你不放的话, 又一直加, 这样 就导致了 长按不放 那么 按键就一直 无限次的循环 。。
所以这里还有这个逻辑需要 在完善, 等我想出来 再共享!!!
- if( Cont&KEY_MODE )
- {
- LongPress_cnt++;
- if(LongPress_cnt >=100)//20ms*100 = 2S
- {
- LongPress_cnt=0;
- UART2_SendData8(0xee);
- }
- }
复制代码
再最最最最 后, 上面的一切其实都只是 方法, 最最最 重要的还是 分时复用的 思想!!!!如果彻底领悟了这个思想并灵活应用那么 单片机就真正的入门了。
关于这个 ,大家可以看看 《从单片机初学者迈向单片机工程师》 这篇文章 !
|
|