51单片机独立按键程序处理,小弟我单击发送A,再次单击发送B,再次单击发送C,长按则发送F,请教这个程序怎么实现
51单片机独立按键程序处理,我单击发送A,再次单击发送B,再次单击发送C,长按则发送F,请问这个程序如何实现?
51单片机独立按键程序处理,我单击发送A,再次单击发送B,再次单击发送C,长按则发送F,请问这个程序如何实现?
------解决方案--------------------
现成的代码没有,《按键漫谈》可以帮助你
------解决方案--------------------
请参考下面程序的框架。
51单片机独立按键程序处理,我单击发送A,再次单击发送B,再次单击发送C,长按则发送F,请问这个程序如何实现?
------解决方案--------------------
现成的代码没有,《按键漫谈》可以帮助你
------解决方案--------------------
请参考下面程序的框架。
- C/C++ code
//#include "*.h" const unsigned char U8SENDSTATUS_INIT = 0; const unsigned char U8SENDSTATUS_SEND_A = 1; const unsigned char U8SENDSTATUS_SEND_B = 2; const unsigned char U8SENDSTATUS_SEND_C = 3; const unsigned char U8SENDSTATUS_SEND_F = 4; unsigned char u8SendStatus = U8SENDSTATUS_INIT; //用来表示当前是要发哪个按键 unsigned char bSwitchShortPressFlag = 0; unsigned char bSwitchLongPressFlag = 0; unsigned char b10msFlag = 0; //启动一个定时器,产生10ms中断,在中断里将该标志设为1 void SendDataTask() { switch(u8SendStatus) { case U8SENDSTATUS_INIT: { if(bSwitchShortPressFlag) { bSwitchShortPressFlag = 0; //清除标志 sendData('A'); u8SendStatus = U8SENDSTATUS_SEND_A; } if(bSwitchLongPressFlag) { bSwitchLongPressFlag = 0; //清除标志 sendData('F'); u8SendStatus = U8SENDSTATUS_SEND_F; } break; } case U8SENDSTATUS_SEND_A: { if(bSwitchShortPressFlag) { bSwitchShortPressFlag = 0; //清除标志 sendData('B'); u8SendStatus = U8SENDSTATUS_SEND_B; } if(bSwitchLongPressFlag) { bSwitchLongPressFlag = 0; //清除标志 sendData('F'); u8SendStatus = U8SENDSTATUS_SEND_F; } break; } case U8SENDSTATUS_SEND_B: { //.... break; } case U8SENDSTATUS_SEND_C: { //.... break; } case U8SENDSTATUS_SEND_F: { if(bSwitchShortPressFlag) { bSwitchShortPressFlag = 0; //清除标志 sendData('A'); u8SendStatus = U8SENDSTATUS_SEND_A; } if(bSwitchLongPressFlag) { bSwitchLongPressFlag = 0; //清除标志 sendData('F'); } break; } default: { break; } } } void sendData(char ch) { //发送A,B,C出去的函数 } void ReadSwitchStatus() { //读取要采集按键的状态 } void JudgeLongOrShortPress() { //判断按键是长按还是短按,设置标志 bSwitchShortPressFlag = 1或者bSwitchLongPressFlag = 1; } void main(void) { for(;;) { if(b10msFlag) { b10msFlag = 0; ReadSwitchStatus() JudgeLongOrShortPress() SendDataTask(); } } }
------解决方案--------------------
记录按键按下的时间 记录按键抬起的时间
------解决方案--------------------
设置两个变量:
SUM累积有键时的扫描次数;NUMB代表键号;
利用定时中断,每10毫秒扫描一次按键;
当有按键压下时,每次扫描,SUM加1;
当按键抬起后,SUM停止加1,然后:
(1)判断SUM,是大数值,为长键,发送F;
(2)否则是短键,键号NUMB加1,大于2清0;根据NUMB是0,1,2,相应发送A,B,C