完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
以下按键程序,以前在51用过的,没问题,用到stm8s就不能正常使用了,长按很正常,单击就没有反应了。请大神花点时间帮忙看下,,,,主要是key_driver()的返回值key_return一直不会返回“单击”长按状态就正常,单击就不正常,用串口看了,偶尔有一个“单击”信息,但是板上就是没有反应, keyscan()也没有反应
用的是tiM4定时器 10ms轮询的,放在TIM4的中断里处理的 u8 buttonflay(void) //按键状态 { if(GPIO_ReadInputPin(GPIOA,GPIO_PIN_3)==RESET) return key1_prss; //1 else if(GPIO_ReadInputPin(GPIOD,GPIO_PIN_3)==RESET) return key2_prss; //2 else if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_5)==RESET) return key3_prss; //3 else return RESET; //0 } u8 key_driver(void) { static u8 key_state = key_state_0, key_time = 0; u8 key_return = N_key,key_press=SET; key_press_flay=buttonflay();//读取按键状态 if(key_press_flay!=RESET) //判断按键是否按下 key_press=SET; //有按键按下 else key_press=RESET; //有按键按下 switch (key_state) { case key_state_0: // 按键初始态 if (key_press==SET) key_state = key_state_1; // 键被按下,状态转换到按键消抖和确认状态 break; case key_state_1: // 按键消抖与确认态 if (key_press==SET) { key_time = RESET; key_state = key_state_2; // 按键仍然处于按下,消抖完成,状态转换到按下键时间的计时状态,但返回的还是无键事件 } else key_state = key_state_0; // 按键已抬起,转换到按键初始态。此处完成和实现软件消抖,其实按键的按下和释放都在此消抖的。 break; case key_state_2: if(key_press==RESET) { key_return = S_key; // 此时按键释放,说明是产生一次短操作,回送S_key key_state = key_state_0; // 转换到按键初始态 } else if (++key_time >= 100) // 继续按下,计时加10ms(10ms为本函数循环执行间隔) { key_return = L_key; // 按下时间>1000ms,此按键为长按操作,返回长键事件 key_state = key_state_3; // 转换到等待按键释放状态 } break; case key_state_3: // 等待按键释放状态,此状态只返回无按键事件 if (key_press==1) key_state = key_state_0; //按键已释放,转换到按键初始态 break; } return key_return; } u8 keyscan() //四个按键,返回的是不同按键的不同值 { buttonreturn=key_driver(); //判断是 单击 还是 长按 keychose=buttonflay(); //判断是哪个按键按下 if((buttonreturn==L_key)&&(keychose==key1_prss)) return long_key1; //长按 button 1 else if((buttonreturn==S_key)&&(keychose==key1_prss)) return click_key1;//单击 button 1 else if((buttonreturn==S_key)&&(keychose==key2_prss)) return click_key2;//单击 button 2 else if((buttonreturn==L_key)&&(keychose==key2_prss)) return long_key2; //长按 button 2 else if((buttonreturn==S_key)&&(keychose==key3_prss)) return click_key3;//单击 button 3 else if((buttonreturn==L_key)&&(keychose==key3_prss)) return long_key3; //长按 button 3 else return N_key; // N_key=0; } |
|
相关推荐
2个回答
|
|
路过的大神看一下嘛,程序不难看的啦。谢谢
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
4058 浏览 1 评论
1639 浏览 0 评论
3524 浏览 1 评论
【⌈嵌入式机电一体化系统设计与实现⌋阅读体验】+磁力输送机系统设计的创新与挑战
1752 浏览 0 评论
4461 浏览 2 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 08:33 , Processed in 0.632739 second(s), Total 75, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号