找回密码
 立即注册
查看: 217|回复: 2

布丁橘长的按键程序问题,什么时间赋值的

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:34
  • 最近打卡:2025-03-16 18:14:50

6

主题

6

回帖

228

积分

中级会员

积分
228
发表于 2025-1-10 14:36:47 | 显示全部楼层 |阅读模式
unsigned char key_multi(void)
{
        static unsigned char key_state;                                                                         //按键状态变量
        static unsigned int key_time;                                                                                 //按键计时变量
        static unsigned char key_press_nums;                                                        //按键次数变量               
        static unsigned int key_time_double;                                                        //按键双击时间
        static unsigned char keynum;                                                                                        //键值
        static unsigned char new_keynum;                                                                        //新的键值
        unsigned char key_press, key_return;                                                        //键值和返回值
       
        key_return = None_click;                                                                         //清除返回按键值
        key_delayms(10);
        switch(keyscan())
        {
                case 1:key_press = KEY1;new_keynum = 1;break;                //!!!修改此处,可以增加/减少按键数量
                case 2:key_press = KEY2;new_keynum = 2;break;                //!!!修改此处,可以增加/减少按键数量
                case 3:key_press = KEY3;new_keynum = 3;break;                //!!!修改此处,可以增加/减少按键数量
                case 4:key_press = KEY4;new_keynum = 4;break;                //!!!修改此处,可以增加/减少按键数量
                default:key_press = 1;break;
        }
        if(key_press_nums > 0)                                                                                 //按键次数大于0,说明有按键
        {
                key_time_double++;                                                                                        //双击计时
                if(key_time_double >= DOUBLE_KEY_TIME && key_time_double < LONG_KEY_TIME) key_state = KEY_STATE_2;//在长按时间和双击时间设定范围内,到状态2
        }
        switch (key_state)
        {
                case KEY_STATE_0:                                                                                         //按键状态0:判断有无按键按下
                {
                        if (!key_press)                                                                                         //有按键按下
                        {
                                key_time = 0;                                                                                         //清零时间间隔计数
                                key_state = KEY_STATE_1;                                                 //然后进入 按键状态1
                        }
                }break;
                case KEY_STATE_1:                                                                                         //按键状态1:软件消抖(确定按键是否有效,而不是误触)。按键有效的定义:按键持续按下超过设定的消抖时间。
                {
                        if (!key_press)
                        {
                                key_time++;                                                                                                 //一次10ms
                                if(key_time>=SINGLE_KEY_TIME)                         //消抖时间为:SINGLE_KEY_TIME*10ms = 10ms;
                                {
                                        key_state = KEY_STATE_2;                                         //如果按键时间超过 消抖时间,即判定为按下的按键有效。进入按键状态2,继续判定到底是单击、双击还是长按
                                        key_press_nums++;                                                                        //按键次数+1
                                }
                        }
                        else key_state = KEY_STATE_0;                                 //如果按键时间没有超过,判定为误触,按键无效,返回 按键状态0,继续等待按键
                }break;
                case KEY_STATE_2:                                                                                         //按键状态2:判定按键有效的种类:是单击,双击,还是长按
                {
                        if(key_press)                                                                                                 //如果按键在 设定的双击时间内释放,则判定为单击/双击
                        {
                                if(key_time_double < DOUBLE_KEY_TIME ) key_state = KEY_STATE_0;                                                        //双击时间达到前,再次扫描按键
                                if(key_time_double >= DOUBLE_KEY_TIME && key_time_double < LONG_KEY_TIME)         //达到双击设定时间后
                                {
                                        if(key_press_nums == 1) key_return = Single_click + new_keynum*10;                                 //返回有效按键值:单击
                                        else if(key_press_nums ==2 && new_keynum == keynum) key_return = Double_click + new_keynum*10;         //返回有效按键值:双击
                                        key_state = KEY_STATE_0;                                         //返回 按键状态0,继续等待按键
                                        key_press_nums = 0;                                                                //清空按键次数
                                        key_time_double = 0;                                                        //清空双击计时
                                }
                        }
                        else
                        {       
                                key_time++;                                                                                                        //按键一直按着的话,长按计时
                                if(key_time >= LONG_KEY_TIME)                         //如果按键时间超过 设定的长按时间(LONG_KEY_TIME*10ms=80*10ms=800ms), 则判定为 长按
                                {
                                        key_return = Long_click + new_keynum*10;         //返回有效键值值:长按
                                        key_state = KEY_STATE_3;                                         //去状态3,等待按键释放
                                }
                        }
                }break;
                case KEY_STATE_3:                                                                                         //等待按键释放
                {
                        if (key_press)
                        {
                                key_state = KEY_STATE_0;                                                 //按键释放后,进入 按键状态0 ,进行下一次按键的判定
                                key_press_nums = 0;                                                                        //清空按键次数
                                key_time_double = 0;                                                                //清空双击计时
                        }
                }break;
                default:key_state = KEY_STATE_0;break;        //特殊情况:key_state是其他值得情况,清零key_state。这种情况一般出现在 没有初始化key_state,第一次执行这个函数的时候
        }
        keynum = new_keynum;                                                                                        //将新获取的键值赋值给键值
        return key_return;                                                                                                 //返回 按键值
}
void  key_delayms(unsigned int ms)                //简单延时函数,自适应主频,1毫秒*ms
{
        unsigned int i;
        do{
                        i = MAIN_Fosc / 6000;
                        while(--i);
                }while(--ms);
}
这几个是什么时间赋值的看不懂

static unsigned char key_state;                                                                         //按键状态变量
        static unsigned int key_time;                                                                                 //按键计时变量
        static unsigned char key_press_nums;                                                        //按键次数变量               
        static unsigned int key_time_double;                                                        //按键双击时间
        static unsigned char keynum;                                                                                        //键值

截图202501101431194401.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:108
  • 最近打卡:2025-04-28 08:34:00
已绑定手机

5

主题

118

回帖

674

积分

高级会员

积分
674
发表于 2025-1-10 15:21:40 | 显示全部楼层
这注释都写这么清楚了,居然还看不懂
高级软件工程师-唐工
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-05-01 06:53:32
已绑定手机

4

主题

339

回帖

1558

积分

金牌会员

积分
1558
发表于 2025-1-10 15:28:23 | 显示全部楼层
你查找下每个变量名,看看在哪里出现赋值
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:19 , Processed in 0.119502 second(s), 64 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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