找回密码
 立即注册
查看: 322|回复: 8

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:398
  • 最近打卡:2025-06-19 00:05:30
已绑定手机

143

主题

1690

回帖

2578

积分

金牌会员

积分
2578
发表于 2025-1-1 14:44:37 | 显示全部楼层 |阅读模式
新的一年,祝大家新年快乐,
祝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;  //按键"释放"状态结束
    }
}








回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:568
  • 最近打卡:2025-06-18 08:11:24

114

主题

2028

回帖

5823

积分

论坛元老

积分
5823
发表于 2025-1-1 15:50:51 | 显示全部楼层
谢谢分享!祝新年快乐!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:281
  • 最近打卡:2025-06-18 04:46:12

22

主题

282

回帖

1099

积分

金牌会员

积分
1099
发表于 2025-1-1 17:47:26 来自手机 | 显示全部楼层
REMOVEUNUSED
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:178
  • 最近打卡:2025-06-12 08:44:23
已绑定手机

15

主题

628

回帖

822

积分

高级会员

积分
822
发表于 2025-1-1 22:15:12 | 显示全部楼层
STC 666 888
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:168
  • 最近打卡:2025-06-18 09:00:03
已绑定手机

2

主题

112

回帖

248

积分

中级会员

积分
248
发表于 2025-1-2 15:37:00 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:429
  • 最近打卡:2025-06-18 07:21:12
已绑定手机

10

主题

155

回帖

818

积分

高级会员

积分
818
发表于 2025-1-3 13:32:32 | 显示全部楼层
感谢分享!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:288
  • 最近打卡:2025-06-18 09:16:31
已绑定手机

2

主题

83

回帖

1319

积分

金牌会员

积分
1319
发表于 2025-1-3 14:04:54 | 显示全部楼层
加油吧
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:398
  • 最近打卡:2025-06-19 00:05:30
已绑定手机

143

主题

1690

回帖

2578

积分

金牌会员

积分
2578
发表于 2025-1-3 17:15:21 | 显示全部楼层

一起加油!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2025-06-18 06:16:32
已绑定手机

1

主题

28

回帖

41

积分

新手上路

积分
41
发表于 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;                                        //按键值为长按
                }
        }
}
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-19 03:49 , Processed in 0.150964 second(s), 100 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表