完善资料让更多小伙伴认识你,还能领取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 个讨论
|
|
一直摁着不松手,返回什么值?
|
|
|
|
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
780 浏览 1 评论
1776 浏览 1 评论
1508 浏览 1 评论
MCU友好过渡MPU,米尔基于STM32MP135开发板裸机开发应用笔记
686 浏览 0 评论
自定义系统时钟频率后,用库函数和微带两种方式点亮LED灯,为什么灯的闪烁频率不一致?
1999 浏览 2 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-5-9 18:44 , Processed in 0.568546 second(s), Total 56, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号