前言
按键无非就是 0 或者1 是浮空状态 有效就是1或者0
浮空是0 有效就是 1 反之 也成立。
一 按键扫描函数
按键函数 写法很多 下面讲解我习惯性的用法
unsigned char key_scan()
{
static unsigned char PWMkey_up=0;
switch(PWMkey_up)
{
case 0: if((KEY1==0)||(KEY2==0)||(KEY3==0)||(KEY4==0)){
PWMkey_up = 1;
}
break;
case 1 : if((KEY1==0)||(KEY2==0)||(KEY3==0)||(KEY4==0)){
PWMkey_up = 2;
if(KEY1==0){return '1';}
if(KEY2==0){return '2';}
if(KEY3==0){return '3';}
if(KEY4==0){return '4';}
} break;
case 2 : if((KEY1!=0)&&(KEY2!=0)&&(KEY3!=0)&&(KEY4!=0)){
PWMkey_up = 0;
}
break;
}
return 99;
}
讲解 1: 标志位的定义 (重要***********)
static unsigned char PWMkey_up=0;
标志位:触发事情的标记 可以把它想成一个每个事件对应的 地址
|| &&
||:逻辑或 只能满足 其一 的条件 就会执行函数体的内容
&& :逻辑与 :同时满足所有条件 才会执行函数体的内容.
|| :强调是单一(含以上)的条件就行 &&:强调 的是 多个条件 同时 成立。
1扫描函数 加入标志位的跳转 过程
前言 两种按键判断函数
第一种
格式1: ccc:是按键扫描返回值
switch(ccc){
case 4:函数体; break;
deflut:break;
}
例如:
1 switch(XXX){
case 0: hhhh;break;
case 1:aaaa;break;
case 2:vvvv;break;
case 3:ffff;break;
case 4:qqqq;break;
deflut:break;
}
第二种 :
if(按键1按下){
}
else if(按键2按下)
{
}
else{
}
{ 1 } 定义一个静态标志位(静态位:一直让他保持赋值不变)
static unsigned char PWMkey_up=0;
事件 0开始 -->>并产生事件1的标记
switch(PWMkey_up)
{
case 0: if((KEY1==0)||(KEY2==0)||(KEY3==0)||(KEY4==0)){
PWMkey_up = 1;
}
第0次按下 并且其一的条件满足 就会有事件1 的标记
触发了事件1的标记 现在不为0了
case 1 : if((KEY1==0)||(KEY2==0)||(KEY3==0)||(KEY4==0)){
PWMkey_up = 2;
if(KEY1==0){return '1';}
if(KEY2==0){return '2';}
if(KEY3==0){return '3';}
if(KEY4==0){return '4';}
} break;
并且会标记事件 2 等待下次触发 触发的时候 就变化了
现在开始变化
case 2 : if((KEY1!=0)&&(KEY2!=0)&&(KEY3!=0)&&(KEY4!=0)){
PWMkey_up = 0;
}
break;
注意的流程
第o次按下 {标记事件 1} -->>第二次按下{标记事件2 } -->浮空状态 {标记事件0}
第0次按下 相当于触发了事件0的标记 第1次按下 相当于触发了事件1的标记
第2次按下 相当于触发了事件2的标记
这样就形成了循环 不管在哪个状态 按下都是有效的.
在标记的时候 并没有起到作用 ,起到作用的时候是 在触发阶段.
二 加入细节处理
1)实现切屏
void lcd_xianshiconfig(void)
{
if(show==1)
{
LCD_SetTextColor(White);
LCD_SetBackColor(Black);
LCD_DisplayStringLine(Line1,(unsigned char *)" Data ");
LCD_DisplayStringLine(Line0,(unsigned char *)" ");
LCD_DisplayStringLine(Line2,(unsigned char *)" ");
}
if(show==2)
{
LCD_SetTextColor(White);
LCD_SetBackColor(Black);
LCD_DisplayStringLine(Line1,(unsigned char *)" Para ");
LCD_DisplayStringLine(Line0,(unsigned char *)" ");
LCD_DisplayStringLine(Line2,(unsigned char *)" ");
}
}
这里用了一个两个事件对应了 两个屏幕的显示(因为要切换不同屏幕) 按键判断代码
case 'A':
if(key_lcds==2){
show=1;
lcd_xianshiconfig();
key_lcds=10;
}
else if( key_lcds==10){
show=2;
lcd_xianshiconfig();
key_lcds=2;
} break;
==:事件 = :标记
这里多了 一个标志位 可以理解为他是按键的发生事件的标记
一次按下 (页面一 )
case 'A':
if(key_lcds==2){
show=1;
lcd_xianshiconfig();
key_lcds=10;
}
第二次按下 触发了按键标记事件10(页面二)
else if( key_lcds==10){
show=2;
lcd_xianshiconfig();
key_lcds=2;
} break;
//标记了 按键标记1 当再一次按键 又回到了页面一 因为触发了按键标记事件2
case 'A':
if(key_lcds==2){
show=1;
lcd_xianshiconfig();
key_lcds=10;
}
这样就形成了循环.
2)实现锁屏
不让他切屏就是锁屏
第一次按下的按键标记为 key_lcds=10; 并且 第一次的 标记为2 (复位标记)
我让触发 触发之后就变不为2的标记 就行了 第二次按下 回到复位 就是解锁
case 'D':
if(key_lcds==10){
key_lcds=5;
show=1;
}
else if(key_lcds==5){
key_lcds=2;
}break;
注意细节处理 多看几次
|