vb2002 发表于 2024-9-28 19:31:33

代码已经加上双击和长按了.但是不能保存双击那个操作(已解决)

本帖最后由 vb2002 于 2024-9-30 13:06 编辑


之前双击和长按,没有调用io口操作,导致io口复位。不能推挽输出,双击长按打开推挽就好了

已经接近理想状态了. 感谢小飞飞大佬提供的代码.. 键值的代码参照 布丁橘长 的教程.
现在功能是单击打开LED (三秒内按下换下一个数组的值,也就是pwm亮度. 3 三秒后按下关闭LED,并保存当前亮度.下次打开就是关闭前的亮度),
今天加上了双击 极亮(pwm全输出.) 但是现在有两个问题.
一 不能保存那个极亮. 二.关机进入掉电模式后,不能双击极亮
关机后,不能双击极亮,或者长按进入低亮模式,.应该是和状态机那里有关.

// 定时器0中断服务程序
void Timer0_Isr(void) interrupt 1 {
    static unsigned char key_sta;               // 按键状态机变量

    // 按键状态机
    switch(key_sta) {
      case 0:                                 // 状态0:等待按键
            if (KEY1 == 0) key_sta++;            // 如果按键按下,进入状态1
            break;
      case 1:                                 // 状态1:确认按键
            if (KEY1 == 0) key_sta++;            // 如果按键持续按下,进入状态2
            else key_sta = 0;                   // 否则返回状态0
            break;
      case 2:                                 // 状态2:等待按键释放
            if (KEY1 == 1) key_sta++;            // 如果按键释放,进入状态3
            break;
      case 3:                                 // 状态3:按键完成
            key_flag = 1;                     // 设置按键标志位
            key_sta = 0;                        // 重置状态机
            break;
      default:                              // 默认状态,重置状态机
            key_sta = 0;
            break;
    }

    if (time_out < 30) time_out++;            // 如果未超时,增加超时计数器
}

while(1)
{            
               keyvalue = key_multi();                //读取键值(键值和长按短按双击的复合键值)
         
         
                if(keyvalue == Key1_Single_Click);                   //KEY1短按,点亮LED1
                if(keyvalue == Key1_Long_Click) {CCAP1H=2; PWM_MODE=1 ;}                        //KEY1长按,熄灭LED1
                if(keyvalue == Key1_Double_Click)                                                               //KEY1双击,点亮LED1、LED2,再次双击熄灭LED1、LED2
                {
                        Key1_nums++;                //KEY1双击次数
                        if(Key1_nums%2 == 1)                //奇数次双击,点亮LED1、LED2
                        {
                        CCAP1H = 255;   
                        }
                        if(Key1_nums%2 == 0)                //偶数次双击,熄灭LED1、LED2
                        {
                        CCAP1H = 255;   
                        }
                        if(Key1_nums >= 99) Key1_nums = 0;                //防止KEY1双击次数溢出,清零
                }
         
         
         if(keyvalue == Key1_Single_Click)
               {                        // 如果有按键事件

            key_flag = 0;                     // 清除按键标志位

            if (time_out < 30) {                // 如果按键没有超时
                PWM_MODE++;                     // 增加PWM模式
                if(PWM_MODE > (sizeof(pwm_levels)/sizeof(pwm_levels))) // 防止超出数组范围
                  PWM_MODE = 1;               // 循环回第一个模式
               
                PWM_updata(pwm_levels); // 更新PWM占空比
                  
                time_out = 0;                   // 重置超时计数器
            
                } else {                            // 如果按键超时
                if(PWM_MODE) {                  // 如果有输出状态
                  PWM_SAVE = PWM_MODE;      // 保存当前PWM模式
               
                                                         
                  PWM_MODE = 0;               // 清空PWM模式
                  PWM_updata(0);            // 关闭PWM输出

                } else {                        // 如果处于关闭状态
                  
                            if(PWM_SAVE == 0) PWM_SAVE = 1; // 首次按键启动最低亮度
                  PWM_MODE = PWM_SAVE;      // 恢复之前的PWM模式
                  time_out = 0;               // 重置超时计数器
                   PWM_updata(pwm_levels);    // 更新PWM占空比(此处的PWM_MODE*20可能是错误的,应该使用pwm_levels数组)
               


                  }
                  if(CCAPM1 ==0x00)
                              PCON=0x02;_nop_();_nop_();_nop_();_nop_();
            }
               
      }


wangkgg 发表于 2024-10-28 07:52:42

发个代码一,可否? key_multi.h   key_multi.C    QQ792960740邮箱

vb2002 发表于 2024-10-28 09:54:49

wangkgg 发表于 2024-10-28 07:52
发个代码一,可否? key_multi.h   key_multi.C    QQ792960740邮箱

上面这个就是代码呀..

wangkgg 发表于 2024-12-10 21:03:46

wangkgg 发表于 2024-10-28 07:52
发个代码一,可否? key_multi.h   key_multi.C    QQ792960740邮箱

通过学习AI8051U第三集点亮一个灯, 参考上贴   完成对按键识别,成功亮了二个灯,并可调节亮度



页: [1]
查看完整版本: 代码已经加上双击和长按了.但是不能保存双击那个操作(已解决)