vb2002 发表于 2025-1-1 14:44:37

新的一年,祝大家新年快乐,祝Ai更加强大,登顶世界第一,也祝自己学到更多东西

新的一年,祝大家新年快乐,
祝Ai更加强大,登顶世界第一,
也祝自己学到更多知识

同时附上自己新年第一天刚整出来的按键多复用代码
单击,双击,三击,长按,单击加长按,双击加长按(晚点实现)

void Key_Scan(void)
{
    static u8 KeyState = 0; //按键状态(必须为静态"static"变量)
    static u8 KeyTime = 0;//计时(必须为静态"static"变量)
      
    switch(KeyState)//0=初始状态,1=确认状态,2=短按/长按判断状态,3=单击/双击判断状态,88=释放状态
    {
    case 0://进入按键"初始"状态
      if (!key)//如有按键按下
      {
            KeyState = 1;//转到按键"确认"状态
      }
      break;//按键"初始"状态结束
         
    case 1://进入按键"确认"状态(消抖)
      if (!key)//如按键仍按下
      {
            KeyTime = 0;//计时清零(准备计时)
            KeyState = 2;//转到"短按/长按"判断状态
      }
      else//否则, (按键已松开)
      {
            Key_value = 0;//是"无键"
            KeyState = 0;//转到按键"初始"状态
      }
      break;//按键"确认"状态结束
         
    case 2://进入按键"短按/长按"判断状态
      if ( key)//如按键已松开
      {
            KeyState = 3;//转到按键"单击/双击"判断状态,(即第一次单击不作反应,待后面来判断是否有双击)
      }
      else//否则, (按键仍按下)
      {
            if(++KeyTime >= 30)//如"长按"计时到, ("长按"的保持时间,可调整)
            {
                KeyTime = 0;//计时清零
                Key_value = 2;//是"长按"
                KeyState = 88;//转到按键"释放"状态
            }
      }
      break;
         
    case 3:
      if (!key)
      {
                  KeyTime = 0;//重置计时器
                  KeyState = 4;//进入case4


      
         
      }
      else
      {
            if(++KeyTime >= 27)   
            {
                KeyTime = 0;   
                Key_value = 1;   
                KeyState = 0;
            }
      }
      break;

    case 4:
      if (key)   
      {

                KeyTime = 0;//计时清零

                KeyState = 5;//转到按键"初始"状态


      }
      else//否则, (按键按下)
      {
                if (++KeyTime >= 27)
                {
            Key_value = 5;   
            KeyState = 88;   
                }
      }
      break;

    case 5://进入按键"三击/双击"判断状态
      if (!key)//如果第三次没有按下,等带判定双击
      {

                KeyTime = 0;//计时清零
                Key_value = 4;//如果有按键三击
                KeyState = 88;//转到按键"初始"状态


      }
      else
      {
                if (++KeyTime >= 27)
                {
            Key_value = 3;
            KeyState = 88;   
                }
      }
      break;//
         
    case 88://进入按键"释放"状态
      if ( key)//如按键已松开
      {
            KeyState = 0;//转到按键初始状态
      }
      break;//按键"释放"状态结束
    }
}








xxkj2010 发表于 2025-1-1 15:50:51

谢谢分享!祝新年快乐!

邮箱 发表于 2025-1-1 17:47:26

{:4_250:}

wlhet 发表于 2025-1-1 22:15:12

{:shengli:}

lgnstar 发表于 2025-1-2 15:37:00

{:qiang:}

zhaoye818 发表于 2025-1-3 13:32:32

感谢分享!

DIY365 发表于 2025-1-3 14:04:54

加油吧

vb2002 发表于 2025-1-3 17:15:21

DIY365 发表于 2025-1-3 14:04
加油吧

一起加油!{:4_196:}

xshui 发表于 2025-1-10 09:23:24

我也贴一个按键单击、双击、三击及长按的程序。
void KeyScan(void)                                        //按键扫描函数,放在1ms定时中断函数里
{
        //采用不返回参数方式,将按键值直接赋予全局变量"Gu8KeyValue"
        //0无按键,如11为按键1单击,12为按键1双击,13为按键1三击,15为按键1长按
        //0无按键,如21为按键2单击,22为按键2双击,23为按键2三击,25为按键2长按
        static unsigned int Su16Key1_PressCnt;                //按键1按下计时变量
        static unsigned int Su16Key1_ReleaseCnt;        //按键1松开计时变量
        static unsigned char Su8Key1_ClickNum;                //按键1单击次数变量
        static unsigned char Su8Key1_SingleLock;        //按键1单次锁变量

        static unsigned int Su16Key2_PressCnt;                //按键2按下计时变量
        static unsigned int Su16Key2_ReleaseCnt;        //按键2松开计时变量
        static unsigned char Su8Key2_ClickNum;                //按键2单击次数变量
        static unsigned char Su8Key2_SingleLock;        //按键2单次锁变量
       
        //KEY1(P32)按键检测
        if(KEY1 == 1)                                                //按键松开时
        {
                Su16Key1_PressCnt = 0;                        //清除变量
                Su8Key1_SingleLock = 0;                        //清除变量
                Su16Key1_ReleaseCnt ++;                        //按键松开计时变量累加
                if(Su8Key1_ClickNum == 1 && Su16Key1_ReleaseCnt >= 300)        //单击一次后松开时间超过300ms识别为单击
                {
                        Gu8KeyValue = 11;                                //按键值为单击
                        Su8Key1_ClickNum = 0;                //清除变量
                        Su16Key1_ReleaseCnt = 0;        //清除变量
                }
                if(Su8Key1_ClickNum == 2 && Su16Key1_ReleaseCnt >= 200)        //单击两次后松开时间超过200ms识别为双击
                {
                        Gu8KeyValue = 12;                                //按键值为双击
                        Su8Key1_ClickNum = 0;                //清除变量
                        Su16Key1_ReleaseCnt = 0;        //清除变量
                }
                if(Su8Key1_ClickNum == 3)                //在300ms时间内单击三次识别为三击
                {
                        Gu8KeyValue = 13;                                //按键值为三击
                        Su8Key1_ClickNum = 0;                //清除变量
                        Su16Key1_ReleaseCnt = 0;        //清除变量
                }
        }
        else if(Su8Key1_SingleLock == 0)                //按键按下且是第一次按下
        {
                Su16Key1_PressCnt ++;                                //按键按下计时变量累加
                if(Su16Key1_PressCnt == 20)                        //按下后20ms消抖时间到了识别为一次单击
                {
                        Su8Key1_ClickNum ++;                        //单击次数累加
                        Su16Key1_ReleaseCnt = 0;                //按键松开计时变量清0
                }                       
                if(Su16Key1_PressCnt >= 500)                //按下后超过500ms识别为长按
                {
                        Su8Key1_SingleLock = 1;                        //单次按键上锁,避免按久了多次触发
                        Su8Key1_ClickNum = 0;                        //单击次数清0
                        Gu8KeyValue = 15;                                        //按键值为长按
                }
        }

        //KEY2(P33)按键检测
        if(KEY2 == 1)                                                //按键松开时
        {
                Su16Key2_PressCnt = 0;                        //清除变量
                Su8Key2_SingleLock = 0;                        //清除变量
                Su16Key2_ReleaseCnt ++;                        //按键松开计时变量累加
                if(Su8Key2_ClickNum == 1 && Su16Key2_ReleaseCnt >= 300)        //单击一次后松开时间超过300ms识别为单击
                {
                        Gu8KeyValue = 21;                                //按键值为单击
                        Su8Key2_ClickNum = 0;                //清除变量
                        Su16Key2_ReleaseCnt = 0;        //清除变量
                }
                if(Su8Key2_ClickNum == 2 && Su16Key2_ReleaseCnt >= 200)        //单击两次后松开时间超过200ms识别为双击
                {
                        Gu8KeyValue = 22;                                //按键值为双击
                        Su8Key2_ClickNum = 0;                //清除变量
                        Su16Key2_ReleaseCnt = 0;        //清除变量
                }
                if(Su8Key2_ClickNum == 3)                //在300ms时间内单击三次识别为三击
                {
                        Gu8KeyValue = 23;                                //按键值为三击
                        Su8Key2_ClickNum = 0;                //清除变量
                        Su16Key2_ReleaseCnt = 0;        //清除变量
                }
        }
        else if(Su8Key2_SingleLock == 0)                //按键按下且是第一次按下
        {
                Su16Key2_PressCnt ++;                                //按键按下计时变量累加
                if(Su16Key2_PressCnt == 20)                        //按下后20ms消抖时间到了识别为一次单击
                {
                        Su8Key2_ClickNum ++;                        //单击次数累加
                        Su16Key2_ReleaseCnt = 0;                //按键松开计时变量清0
                }                       
                if(Su16Key2_PressCnt >= 500)                //按下后超过500ms识别为长按
                {
                        Su8Key2_SingleLock = 1;                        //单次按键上锁,避免按久了多次触发
                        Su8Key2_ClickNum = 0;                        //单击次数清0
                        Gu8KeyValue = 25;                                        //按键值为长按
                }
        }
}
页: [1]
查看完整版本: 新的一年,祝大家新年快乐,祝Ai更加强大,登顶世界第一,也祝自己学到更多东西