单片机按键单击、双击、长按功能实现(精品文档)_共4页
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
按键单击
按键长按
按键双击
在 STM8 单片机上面实现代码为:
//按键按下去会出现下降沿,设置按键 IO 口 GPIOB4 所在的外部端口 B 下降沿触发中断 void exit_init(void) {
EXTI_DeInit(); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB,EXTI_SENSITIVITY_FALL_ONLY); }
key_holdon_ms=0; short_key_flag=0; long_key_flag=0; key_fall_flag=0; } }
}wenku.baidu.com
if(keyUpFlag)//单击抬起后,启动计数,计数到 500ms keyupCnt++;
if(keyupCnt>500) {
keyupCnt = 0; keyUpFlag = FALSE; } }
单片机按键单击、双击、长按功能实现
由于项目产品的需要,只能设置一个按键,但是需要实现短按(即单击)切换工作模 式、长按开关机、双击暂停等复用功能。下图是三种情况下的按键波形。按键未按下时是 高电平,按下去是低电平。按键单击时,判断时间门槛设置为 50~2000ms;长按门槛为持 续按下 2000ms。双击可以视为时间间隔很短的俩次有效单击,从第一次单击上升沿到第二 次单击上升沿延时门槛为 100~500ms。
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;
if(key_fall_flag==1)//发生按键按下事件 {
if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//按键持续按下 {
if(key_holdon_ms <= 2000) {
key_holdon_ms++; } else //按键按下到 2000ms 就判断长按时间成立,生成长按标志 {
//按键按下中断服务程序 INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4) {
if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//是按键下降沿 {
key_fall_flag = 1;//生成按键按下标志 } }
//周期 1ms 的定时器中断服务程序 INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23) {
//距离上次单击时间在 100~500ms 之间,则认为发生连击事件 if(keyupCnt>100 && keyupCnt<500) {
doubleClick = TRUE; short_key_flag=0; }
keyUpFlag = TRUE;//单击抬起按键后,生成按键抬起标志 } else //按键持续时间小于 50ms,忽略 {
按键长按
按键双击
在 STM8 单片机上面实现代码为:
//按键按下去会出现下降沿,设置按键 IO 口 GPIOB4 所在的外部端口 B 下降沿触发中断 void exit_init(void) {
EXTI_DeInit(); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB,EXTI_SENSITIVITY_FALL_ONLY); }
key_holdon_ms=0; short_key_flag=0; long_key_flag=0; key_fall_flag=0; } }
}wenku.baidu.com
if(keyUpFlag)//单击抬起后,启动计数,计数到 500ms keyupCnt++;
if(keyupCnt>500) {
keyupCnt = 0; keyUpFlag = FALSE; } }
单片机按键单击、双击、长按功能实现
由于项目产品的需要,只能设置一个按键,但是需要实现短按(即单击)切换工作模 式、长按开关机、双击暂停等复用功能。下图是三种情况下的按键波形。按键未按下时是 高电平,按下去是低电平。按键单击时,判断时间门槛设置为 50~2000ms;长按门槛为持 续按下 2000ms。双击可以视为时间间隔很短的俩次有效单击,从第一次单击上升沿到第二 次单击上升沿延时门槛为 100~500ms。
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;
if(key_fall_flag==1)//发生按键按下事件 {
if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//按键持续按下 {
if(key_holdon_ms <= 2000) {
key_holdon_ms++; } else //按键按下到 2000ms 就判断长按时间成立,生成长按标志 {
//按键按下中断服务程序 INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4) {
if(GPIO_ReadInputPin(GPIOB,GPIO_PIN_4)==0)//是按键下降沿 {
key_fall_flag = 1;//生成按键按下标志 } }
//周期 1ms 的定时器中断服务程序 INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23) {
//距离上次单击时间在 100~500ms 之间,则认为发生连击事件 if(keyupCnt>100 && keyupCnt<500) {
doubleClick = TRUE; short_key_flag=0; }
keyUpFlag = TRUE;//单击抬起按键后,生成按键抬起标志 } else //按键持续时间小于 50ms,忽略 {