找回密码
 立即注册
查看: 2122|回复: 3

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:396
  • 最近打卡:2025-06-17 00:04:36
已绑定手机

142

主题

1688

回帖

2563

积分

金牌会员

积分
2563
发表于 2024-9-28 19:31:33 | 显示全部楼层 |阅读模式
本帖最后由 vb2002 于 2024-9-30 13:06 编辑


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

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

  1. // 定时器0中断服务程序
  2. void Timer0_Isr(void) interrupt 1 {
  3.     static unsigned char key_sta;               // 按键状态机变量
  4.     // 按键状态机
  5.     switch(key_sta) {
  6.         case 0:                                 // 状态0:等待按键
  7.             if (KEY1 == 0) key_sta++;            // 如果按键按下,进入状态1
  8.             break;
  9.         case 1:                                 // 状态1:确认按键
  10.             if (KEY1 == 0) key_sta++;            // 如果按键持续按下,进入状态2
  11.             else key_sta = 0;                   // 否则返回状态0
  12.             break;
  13.         case 2:                                 // 状态2:等待按键释放
  14.             if (KEY1 == 1) key_sta++;            // 如果按键释放,进入状态3
  15.             break;
  16.         case 3:                                 // 状态3:按键完成
  17.             key_flag = 1;                       // 设置按键标志位
  18.             key_sta = 0;                        // 重置状态机
  19.             break;
  20.         default:                                // 默认状态,重置状态机
  21.             key_sta = 0;
  22.             break;
  23.     }
  24.     if (time_out < 30) time_out++;              // 如果未超时,增加超时计数器
  25. }
复制代码

  1. while(1)
  2. {            
  3.                  keyvalue = key_multi();                //读取键值(键值和长按短按双击的复合键值)
  4.          
  5.          
  6.                 if(keyvalue == Key1_Single_Click);                   //KEY1短按,点亮LED1
  7.                 if(keyvalue == Key1_Long_Click) {CCAP1H=2; PWM_MODE=1 ;}                        //KEY1长按,熄灭LED1
  8.                 if(keyvalue == Key1_Double_Click)                                                                 //KEY1双击,点亮LED1、LED2,再次双击熄灭LED1、LED2
  9.                 {
  10.                         Key1_nums++;                //KEY1双击次数
  11.                         if(Key1_nums%2 == 1)                //奇数次双击,点亮LED1、LED2
  12.                         {
  13.                         CCAP1H = 255;   
  14.                         }
  15.                         if(Key1_nums%2 == 0)                //偶数次双击,熄灭LED1、LED2
  16.                         {
  17.                         CCAP1H = 255;   
  18.                         }
  19.                         if(Key1_nums >= 99) Key1_nums = 0;                //防止KEY1双击次数溢出,清零
  20.                 }
  21.          
  22.          
  23.          if(keyvalue == Key1_Single_Click)  
  24.                  {                          // 如果有按键事件
  25.             key_flag = 0;                       // 清除按键标志位
  26.             if (time_out < 30) {                // 如果按键没有超时
  27.                 PWM_MODE++;                     // 增加PWM模式
  28.                 if(PWM_MODE > (sizeof(pwm_levels)/sizeof(pwm_levels[0]))) // 防止超出数组范围
  29.                     PWM_MODE = 1;               // 循环回第一个模式
  30.                
  31.                 PWM_updata(pwm_levels[PWM_MODE - 1]); // 更新PWM占空比
  32.                     
  33.                 time_out = 0;                   // 重置超时计数器
  34.             
  35.                 } else {                            // 如果按键超时
  36.                 if(PWM_MODE) {                  // 如果有输出状态
  37.                     PWM_SAVE = PWM_MODE;        // 保存当前PWM模式
  38.                  
  39.                                                          
  40.                     PWM_MODE = 0;               // 清空PWM模式
  41.                     PWM_updata(0);              // 关闭PWM输出
  42.                 } else {                        // 如果处于关闭状态
  43.                     
  44.                             if(PWM_SAVE == 0) PWM_SAVE = 1; // 首次按键启动最低亮度
  45.                     PWM_MODE = PWM_SAVE;        // 恢复之前的PWM模式
  46.                     time_out = 0;               // 重置超时计数器
  47.                    PWM_updata(pwm_levels[PWM_MODE - 1]);    // 更新PWM占空比(此处的PWM_MODE*20可能是错误的,应该使用pwm_levels数组)
  48.                
  49.                     }
  50.                     if(CCAPM1 ==0x00)
  51.                               PCON=0x02;_nop_();_nop_();_nop_();_nop_();
  52.             }
  53.                
  54.         }
复制代码



回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-02 20:59:17
已绑定手机

1

主题

22

回帖

139

积分

注册会员

积分
139
发表于 2024-10-28 07:52:42 | 显示全部楼层
发个代码一,可否? key_multi.h   key_multi.C    QQ792960740邮箱
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:396
  • 最近打卡:2025-06-17 00:04:36
已绑定手机

142

主题

1688

回帖

2563

积分

金牌会员

积分
2563
发表于 2024-10-28 09:54:49 | 显示全部楼层
wang*** 发表于 2024-10-28 07:52
发个代码一,可否? key_multi.h   key_multi.C    QQ792960740邮箱

上面这个就是代码呀..
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-02 20:59:17
已绑定手机

1

主题

22

回帖

139

积分

注册会员

积分
139
发表于 2024-12-10 21:03:46 | 显示全部楼层
wang*** 发表于 2024-10-28 07:52
发个代码一,可否? key_multi.h   key_multi.C    QQ792960740邮箱

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

3.jpg

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-17 15:29 , Processed in 0.184682 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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