完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
用一个按键实现单击与双击的功能已经是很多嵌入式产品的常用手法。使用定时器的间隔定时来计算按键按下的时间是通用的做法,然而,使用普通的延时函数实现按键单击与双击的区分也是一个快速的处理手段。按键SW1单击的时候,切换D3灯的开关状态;按键SW1双击的时候,切换D4灯的开关状态。其中:
按键SW1--------P1_2 D3灯--------------P1_0(高电平点亮) D4灯--------------P1_1(高电平点亮) 【实现思路】 <1> 定义一个普通的延时函数Delay()、一个计算时间的变量count和一个延时阈值TT。 <2> 当SW1第一次按下的时候,等待按键松开后,只要count小于TT时,调用Delay()进行延时,然后累计count变量。 <3> 在count小于TT时,发现SW1按键再次按下,则为双击按键。 <4> 如果在count大于等于TT的延时过程中都没有第二次按键按下,则为单击按键。 【实现代码】 #include "ioCC2530.h" #define D3 P1_0 #define D4 P1_1 #define K1 P1_2 #define TT 2000 unsigned int count = 0; void Delay(unsigned int t) { while(t--); } void Init_Port() { P1SEL &= ~0x03; //将P1_0和P1_1设置为通用I/O端口 P1DIR |= 0x03; //将P1_0和P1_1设置为输出模式 P1SEL &= ~0x04; //将P1_2设置为通用I/O端口 P1DIR &= ~0x04; //将P1_2设置为输入模式 } void Scan_Keys() { if(K1 == 0) { Delay(100); //按键去抖动处理 if(K1 == 0) //确认有按键按下 { while(K1 == 0); while(count < TT) { Delay(100); count++; if(K1 == 0) //双击处理 { Delay(100); if(K1 == 0) { while(K1 == 0); D4 = ~D4; count = 0; break; } } } if(count >= TT) //单击处理 { D3 = ~D3; count = 0; } } } } void main() { Init_Port(); //初始化端口 D3 = 1; D4 = 1; Delay(50000); D3 = 0; D4 = 0; while(1) { Scan_Keys(); //扫描按键 } } |
|
|
|
只有小组成员才能发言,加入小组>>
3280 浏览 9 评论
2958 浏览 16 评论
3460 浏览 1 评论
9004 浏览 16 评论
4052 浏览 18 评论
1115浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1860浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 18:19 , Processed in 1.299280 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号