首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

51单片机独立按键程序处理,小弟我单击发送A,再次单击发送B,再次单击发送C,长按则发送F,请教这个程序怎么实现

2012-02-04 
51单片机独立按键程序处理,我单击发送A,再次单击发送B,再次单击发送C,长按则发送F,请问这个程序如何实现?5

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中断,在中断里将该标志设为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

热点排行