完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
unsigned char scan_key()
{ /* 值key_return如下: 1---------单击 2---------双击 3---------长按 */ static unsigned char key_state=0; //按键状态 static unsigned char state=0; static unsigned char time,time1,time2; static unsigned char key_up_flag=0; //按键弹起标志位 static unsigned char key_return; // key 表示按键的那个IO口电平 1没有按下 0按下去了 if(Key==0) //按键按下消抖 { delay(50); if(Key==0) { key_state=0; //按下 } } else { delay(50); //按键松开消抖 if(Key==1) { key_state=1; //弹起 key_up_flag=0; } } if((state==0)&&(key_state==0)&&(key_up_flag==0)) //这里主要防止,按键在识别长按后,又会执行一遍单击操作 { state=1; time=key_time; //记录按键按下的时间为多少,做标记 } if(state==1) { time1=key_time; time2=time1-time; //计算按键按下时长 if(time2>50) //长按判断 { state=2; } if(key_state==1) //按键弹起 { state=3; time=key_time; //标志什么时间按键弹起的 } } if(state==2) //长按 { state=0; //重置状态 key_up_flag=1; key_return=3; } if((state==3)&&(key_up_flag==0)) { time1=key_time; time2=time1-time; //计算按键弹起后时间 if(time2>6) //判断按键弹起后的时间,超过300ms,则说明为单击 { state=0; key_return=1; } else if(key_state==0) //按键弹起后,300ms内又有按键按下 { state=4; } } if(state==4) { if(key_state==1) //按键弹起 { state=0; key_return=2; } } return key_return; } void timer0() interrupt 1 //定时器T0中断函数入口 { TH0=0X9E; //初值重载 TL0=0X57; //定时50ms=50000us; 50000/2=25000 key_time++; //50MS++ } |
|
相关推荐
1 个讨论
|
|
|
一直摁着不松手,返回什么值?
|
|
|
|
|
|
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 17:26 , Processed in 0.693800 second(s), Total 54, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2692