基于STM32按键的使用


前言

按键无非就是 0 或者1 是浮空状态  有效就是1或者0 
浮空是0 有效就是 1 反之 也成立。

一 按键扫描函数

按键函数 写法很多 下面讲解我习惯性的用法

unsigned char  key_scan() 
{
	static unsigned char PWMkey_up=0; //static  静态局部变量 储存在全局数据区 值不变。
	     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; //static  静态局部变量 储存在全局数据区 值不变。
标志位:触发事情的标记  可以把它想成一个每个事件对应的 地址 

|| &&

||:逻辑或  只能满足 其一 的条件  就会执行函数体的内容
&& :逻辑与 :同时满足所有条件 才会执行函数体的内容.
|| :强调是单一(含以上)的条件就行  &&:强调 的是 多个条件 同时 成立。

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; //static  静态局部变量 储存在全局数据区 值不变。

事件 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)){  //当他抬起的时候 按下 就 标记 事件 0 等事件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){	//如果为按键事件2 	                        
			show=1;     //显示的标记1
			lcd_xianshiconfig();//触发了显示标记事件1  (== :事件 )
			key_lcds=10;	//标记了 按键标记10 还没起作用
		}

第二次按下 触发了按键标记事件10(页面二)

   else if( key_lcds==10){//如果为按键事件10	  
		show=2;  //显示的标记2
		lcd_xianshiconfig();//触发了显示标记事件2 (== :事件 )
		key_lcds=2;   //标记了 按键标记1 
	}	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;
	

注意细节处理 多看几次 
  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值