代码已经加上双击和长按了.但是不能保存双击那个操作(已解决)
本帖最后由 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_();
}
}
发个代码一,可否? key_multi.h key_multi.C QQ792960740邮箱 wangkgg 发表于 2024-10-28 07:52
发个代码一,可否? key_multi.h key_multi.C QQ792960740邮箱
上面这个就是代码呀.. wangkgg 发表于 2024-10-28 07:52
发个代码一,可否? key_multi.h key_multi.C QQ792960740邮箱
通过学习AI8051U第三集点亮一个灯, 参考上贴 完成对按键识别,成功亮了二个灯,并可调节亮度
页:
[1]