if(key_sr3 == 1) //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位 { KeyLock3 = 0; //按键自锁标志清零 KeyTimeCnt3 = 0; //按键去抖动延时计数器清零,此行非常巧妙。 KeyCtntyCnt3 = 0; //连续累加的时间间隔延时计数器清零 } else if(KeyLock3 == 0) //有按键按下,且是第一次被按下 { KeyTimeCnt3++; //累加定时中断次数 if(KeyTimeCnt3 > CONST_KEY_TIMES) { KeyTimeCnt3 = 0; KeyLock3 = 1; //自锁按键置位,避免一直触发 KeySec = 3; //触发3号键 } } else if(KeyTimeCnt3 < CONST_TIME_1000MS) //按住累加到1秒 { KeyTimeCnt3++; } else //按住累加到2秒后仍然不放手,这个时候进入有节奏的连续触发 { KeyCtntyCnt3++; //连续触发延时计数器累加 if(KeyCtntyCnt3 > CONST_TIME_250MS) //按住没松手,每0.25秒就触发一次 { KeyCtntyCnt3 = 0; // KeySec = 3; //触发3号键 } }
时间: 2024-02-14 13:26:10 浏览: 11
这段代码是用来处理按键的逻辑。首先判断key_sr3是否为高电平,如果是高电平,说明按键没有被按下,需要清零一些标志位。如果key_sr3是低电平,并且KeyLock3为0,说明有按键按下且是第一次按下。此时累加KeyTimeCnt3,如果累加次数超过了CONST_KEY_TIMES,即达到了一定的延时时间,就将KeyLock3置位,避免一直触发,并且触发3号键操作。如果KeyTimeCnt3没有超过CONST_KEY_TIMES,继续累加KeyTimeCnt3。如果KeyTimeCnt3累加到了CONST_TIME_1000MS这个值,即按住累加到了1秒,还没有放手,就进入有节奏的连续触发。此时累加KeyCtntyCnt3,如果累加到了CONST_TIME_250MS,即每0.25秒触发一次。最后,如果KeyTimeCnt3累加到了2秒后仍然没有放手,就会不断触发3号键操作。
这段代码的作用是实现按键的去抖动和连续触发功能。通过设定一定的延时时间和连续触发时间间隔来控制按键的响应行为。
相关问题
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))//有按键被按下
这段代码是一个条件语句,用于检测是否有按键被按下。具体解释如下:
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
- `key_up` 是一个布尔变量,表示按键是否松开的状态。
- `KEY0==0||KEY1==0||KEY2==0||WK_UP==1` 是一个逻辑表达式,用于检测四个按键中是否有任意一个被按下。
- 如果 `key_up` 为真且逻辑表达式为真,则条件成立,表示有按键被按下。
相关问题:
1. 如何判断按键是否被按下?
2. 什么是逻辑表达式?
3. 如何使用条件语句进行条件判断?
4. 如何定义和使用布尔变量?
void main() { u8 key_temp=0; u8 save_value=0; u8 save_buf[3]; while(1) { key_temp=key_scan(1); //??????????? //?????? if(key_temp==KEY1_PRESS) { at24c02_write_one_byte(EEPROM_ADDRESS,save_value); } else if(key_temp==KEY2_PRESS) { save_value=at24c02_read_one_byte(EEPROM_ADDRESS); } else if(key_temp==KEY3_PRESS) { save_value++; if(save_value==255) { save_value=255; } } else if(key_temp==KEY4_PRESS) { save_value=0; } //?????? if(IND_KEY1==0) //??????????1 { save_value+=10; //?save_value??10 if(save_value>255) { save_value=255; } IND_KEY1=1; //??????1????? } else if(IND_KEY2==0) //??????????2 { save_value-=10; //?save_value??10 if(save_value<0) { save_value=0; } IND_KEY2=1; //??????2????? } else if(IND_KEY3==0) //??????????3 { save_value+=1; //?save_value??1 if(save_value==255) { save_value=255; } IND_KEY3=1; //??????3????? } else if(IND_KEY4==0) //??????????4 { save_value-=1; //?save_value??1 if(save_value<0) { save_value=0; } IND_KEY4=1; //??????4????? } //?????????? if(IND_KEY1==1 && IND_KEY2==1 && IND_KEY3==1 && IND_KEY4==1) { IND_KEY1=0; IND_KEY2=0; IND_KEY3=0; IND_KEY4=0; } //?save_value??????????? save_buf[0]=save_value/100; save_buf[1]=save_value%100/10; save_buf[2]=save_value%100%10; //???????save_value smg_display(save_buf,6); } }用独立按键K1,K2,K3分别控制三位数码管如何修改
可以将原来的IND_KEY1、IND_KEY2、IND_KEY3等变量改为k1_pressed、k2_pressed、k3_pressed等更具有意义的变量名。同时,可以在每次按键操作结束后,将对应的按键状态清零,避免影响下一次按键操作。
修改后的代码如下:
```c
void main() {
u8 key_temp=0;
u8 save_value=0;
u8 save_buf[3];
u8 k1_pressed=0, k2_pressed=0, k3_pressed=0;
while(1) {
key_temp=key_scan(1); //获取按键值
//按下K1,将当前值写入EEPROM中
if(key_temp==KEY1_PRESS) {
at24c02_write_one_byte(EEPROM_ADDRESS,save_value);
}
//按下K2,从EEPROM中读取上次保存的值并显示
else if(key_temp==KEY2_PRESS) {
save_value=at24c02_read_one_byte(EEPROM_ADDRESS);
save_buf[0]=save_value/100;
save_buf[1]=save_value%100/10;
save_buf[2]=save_value%100%10;
smg_display(save_buf,6);
}
//按下K3,将当前值加1并显示
else if(key_temp==KEY3_PRESS) {
save_value++;
if(save_value==255) {
save_value=255;
}
save_buf[0]=save_value/100;
save_buf[1]=save_value%100/10;
save_buf[2]=save_value%100%10;
smg_display(save_buf,6);
}
//按下K4,将当前值清零并显示
else if(key_temp==KEY4_PRESS) {
save_value=0;
save_buf[0]=0;
save_buf[1]=0;
save_buf[2]=0;
smg_display(save_buf,6);
}
//K1按下,将当前值加10并显示
if(k1_pressed == 1) {
save_value+=10;
if(save_value>255) {
save_value=255;
}
save_buf[0]=save_value/100;
save_buf[1]=save_value%100/10;
save_buf[2]=save_value%100%10;
smg_display(save_buf,6);
k1_pressed = 0;
}
//K2按下,将当前值减10并显示
else if(k2_pressed == 1) {
save_value-=10;
if(save_value<0) {
save_value=0;
}
save_buf[0]=save_value/100;
save_buf[1]=save_value%100/10;
save_buf[2]=save_value%100%10;
smg_display(save_buf,6);
k2_pressed = 0;
}
//K3按下,将当前值加1并显示
else if(k3_pressed == 1) {
save_value+=1;
if(save_value==255) {
save_value=255;
}
save_buf[0]=save_value/100;
save_buf[1]=save_value%100/10;
save_buf[2]=save_value%100%10;
smg_display(save_buf,6);
k3_pressed = 0;
}
//判断按键是否释放,释放后才能继续检测按键
if(k1_pressed==0 && IND_KEY1==0) {
k1_pressed = 1;
}
else if(k2_pressed==0 && IND_KEY2==0) {
k2_pressed = 1;
}
else if(k3_pressed==0 && IND_KEY3==0) {
k3_pressed = 1;
}
//释放所有按键
if(IND_KEY1==1 && IND_KEY2==1 && IND_KEY3==1 && IND_KEY4==1) {
IND_KEY1=0;
IND_KEY2=0;
IND_KEY3=0;
IND_KEY4=0;
}
}
}
```