本帖最后由 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[0]))) // 防止超出数组范围
- PWM_MODE = 1; // 循环回第一个模式
-
- PWM_updata(pwm_levels[PWM_MODE - 1]); // 更新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_MODE - 1]); // 更新PWM占空比(此处的PWM_MODE*20可能是错误的,应该使用pwm_levels数组)
-
-
-
- }
- if(CCAPM1 ==0x00)
- PCON=0x02;_nop_();_nop_();_nop_();_nop_();
- }
-
- }
复制代码
|