IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM32按键的使用 -> 正文阅读

[嵌入式]基于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;
	

注意细节处理 多看几次 
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:15:52  更:2022-04-01 00:16:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:31:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码