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