51单片机独立按键程序处理,我单击发送A,再次单击发送B,再次单击发送C,长按则发送F,请问这个程序如何实现?
51单片机独立按键程序处理,我单击发送A,再次单击发送B,再次单击发送C,长按则发送F,请问这个程序如何实现?
[解决办法]
现成的代码没有,《按键漫谈》可以帮助你
[解决办法]
请参考下面程序的框架。
//#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中断,在中断里将该标志设为1void 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