完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
12个回答
|
|
思路,定时器中断测定按压时长,从而执行特定动作。
|
|
|
|
你看看这个方案,说得很详细
|
|
|
|
这个我知道,我主要想知道连按是怎么实现的
|
|
|
|
《STM8L之自定义长短按键》:http://blog.csdn.net/feilusia/article/details/53154346
|
|
|
|
给你一个模板,可以实现你要的功能
void scan_key( u8 *key_val) { static u8 keyValue; static u8 tmp_keyValue; static u8 keyTrigger; static u8 keyKeep; static u16 keyDelayNum; static u16 keyDelayNumValue; u8 x; keyValue = getKeyState(); // 得到按键的物理状态 while(1) { if(keyValue != tmp_keyValue) { tmp_keyValue = keyValue; keyDelayNumValue = 10; //设置去抖节拍数 keyDelayNum = 0; keyTrigger = 0; keyKeep = 0; break; } else { if(keyDelayNum < keyDelayNumValue) { keyDelayNum++; break; } } keyTrigger = keyValue & (keyValue ^ keyKeep); keyKeep = keyValue; if(keyValue) { if(keyTrigger) { keyDelayNum = 0; keyDelayNumValue = 400;//设置长按键节拍数 //处理短按,得到键值*key_val = x; } else { //处理长按键和连按键,如果不需要,这里不添加代码 } } else { //处理释放后要的键值,如同鼠标单击功能,多击也在这里处理,不需要,直接清键值 *key_val = NULL; } break; } } |
|
|
|
谢谢大佬分享,不过小弟现在能力有限,暂时还没看懂
|
|
|
|
这个可以考虑,不过感觉好像比较复杂
|
|
|
|
谢谢分享
|
|
|
|
假设5MS扫描此函数一次
void scan_key( u8 *key_val) { static uchar keyValue; static uchar tmp_keyValue; static uchar keyTrigger; static uchar keyKeep; static u16 keyDelayNum; static u16 keyDelayNumValue; keyValue = ((GPIO_ReadInputData(GPIOC) >> 1) & 0x01) ^ 0x01; //只有一个按键,得到按键状态 while(1) { if(keyValue != tmp_keyValue) { tmp_keyValue = keyValue; keyDelayNumValue = 10; //去抖50MS keyDelayNum = 0; keyTrigger = 0; keyKeep = 0; break; } else { if(keyDelayNum < keyDelayNumValue) { keyDelayNum++; break; } } keyTrigger = keyValue & (keyValue ^ keyKeep); keyKeep = keyValue; if(keyValue) { if(keyTrigger) { keyDelayNum = 0; keyDelayNumValue = 200; //设置得到长按键的时间,1S *key_val = 0x01 ; //这里得到短按键值 } else { keyDelayNum = 0; keyDelayNumValue = 40; //如果需要连按,不要释放按键 //这里200MS就得到一次键值,实现连按,连按键是周期性的得到长按键 *key_val = 0x02; //如果5MS节拍,1S后得到长按键 } } else { *key_val = NULL; } break; } } |
|
|
|
static uchar keyValue;
static uchar tmp_keyValue; static uchar keyTrigger; static uchar keyKeep; static u16 keyDelayNum; static u16 keyDelayNumValue; 主要是这些函数的定义 |
|
|
|
|
|
http://blog.csdn.net/wuhenyouyuyouyu/article/details/77622340
|
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4084 浏览 18 评论
1169浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2331浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 21:05 , Processed in 1.399084 second(s), Total 102, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号