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

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:409
  • 最近打卡:2025-06-30 00:02:03
已绑定手机

144

主题

1704

回帖

2663

积分

金牌会员

积分
2663
发表于 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
  • 打卡总天数:580
  • 最近打卡:2025-06-30 07:45:48

116

主题

2038

回帖

5897

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:291
  • 最近打卡:2025-06-29 00:05:44

22

主题

282

回帖

1149

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:181
  • 最近打卡:2025-06-25 13:37:53
已绑定手机

15

主题

628

回帖

834

积分

高级会员

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:179
  • 最近打卡:2025-06-29 07:22:20
已绑定手机

2

主题

112

回帖

292

积分

中级会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:440
  • 最近打卡:2025-06-30 07:29:41
已绑定手机

10

主题

155

回帖

862

积分

高级会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-06-30 10:09:30
已绑定手机

2

主题

85

回帖

1359

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:409
  • 最近打卡:2025-06-30 00:02:03
已绑定手机

144

主题

1704

回帖

2663

积分

金牌会员

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

一起加油!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:147
  • 最近打卡:2025-06-30 07:05:44
已绑定手机

1

主题

30

回帖

93

积分

注册会员

积分
93
发表于 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-30 10:38 , Processed in 0.135858 second(s), 100 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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