完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#include int main() { printf("Hello world!n"); return 0; } 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++ } --------------------------------------------------分割线------------------------------------------------------------------ //⑥外部中断 2 服务程序 void EXTI2_IRQHandler(void) { if(GPIO_ReadInputPin(GPIOE,GPIO_PIN_2)==0) //按键 KEY2 { key_fall_flag = 1;//生成按键按下标志 } EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE2 上的中断标志位 } void TIM3_IRQHandler(void) //TIM3 中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查 TIM3 更新中断发生与否 { if(key_fall_flag==1)//发生按键按下事件 { if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//按键持续按下 { if(key_holdon_ms <= 2000) { key_holdon_ms++; } else //按键按下到2000ms就判断长按时间成立,生成长按标志 { key_holdon_ms = 0; short_key_flag=0;//清短按键标志 key_long_down = 1;//长按键标志置位 key_fall_flag = 0;//清按键按下标志 } } else //按键抬起 { if(key_holdon_ms>50)//按下时间大于50ms,生成单击标志 { key_holdon_ms=0; short_key_flag=1; key_long_down =0; key_fall_flag=0; //距离上次单击时间在100~500ms之间,则认为发生连击事件 if(keyupCnt>100 && keyupCnt<500) { doubleClick = TRUE; short_key_flag=0; } keyUpFlag = TRUE;//单击抬起按键后,生成按键抬起标志 } else //按键持续时间小于50ms,忽略 { key_holdon_ms=0; short_key_flag=0; long_key_flag=0; key_fall_flag=0; } } } if(keyUpFlag)//单击抬起后,启动计数,计数到500ms keyupCnt++; if(keyupCnt>500) { keyupCnt = 0; keyUpFlag = FALSE; } } TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除 TIM3 更新中断标志 } |
|
相关推荐
4个回答
|
|
1、硬件delay,差评
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
969 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
954 浏览 2 评论
2066 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1162 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1587 浏览 1 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 11:22 , Processed in 0.720261 second(s), Total 68, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号