(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)
目录
一、独立按键
1.按键介绍
轻触开关是一种电子开关,使用时,轻轻按开关按钮就可使开关接通,当松开手时,开关断开。我们使用的开关如下图:
2.独立按键原理
如下图所示:当k1按下以后,由于接地,IO接口和内部输入口就会变成低电平,当按键不按下且内部没有输出时,IO口默认为高电平
2.独立按键原理
如下图所示:当k1按下以后,由于接地,IO接口和内部输入口就会变成低电平,当按键不按下且内部没有输出时,IO口默认为高电平
硬件消抖电路:
3.编写独立按键控制程序
#include"reg51.h" #include<intrins.h> typedef unsigned char u8; typedef unsigned int u16; sbit led =P2^0; //如原理图所示:k1接的是RXD接口,而RXD接的是P3.1 sbit k1=P3^1; void delay(u16 i) //延时函数 { while(i--); //当i=1时,可以延时10微秒 } void keypros() { //判断按键是否按下 if(k1==0) { delay(1000); //通过延时时间实现消抖处理 if(k1==0) //判断是否按下 { //对其进行循环取反实现按键控制功能 led = ~led; } while(!k1);//判断按键是否松开 } } void main() { while(1) //通过循环实现按键控制LED { keypros(); } }
二、矩阵按键
1.矩阵按键的由来
由图可得:同样是8个IO接口,独立按键只能连接8个按钮,而矩阵键盘可以连接16个接口,所以矩阵键盘经常用于按键比较多的情况
2.矩阵按键扫描原理
方法一: 逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
方法二: 行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
3.编写矩阵按键控制程序
//通过行列扫描实现矩阵按键 #include"reg51.h" typedef unsigned char u8; typedef unsigned int u16; u8 code smgduan[16]={0x3f,0x05,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39 , 0x5e , 0x79 , 0x71}; //共阴 u8 KeyValue; //创建变量作为smgduan数组的下标 void delay(u16 i) { while(i--); } void KeyDown() { char a = 0; //首先使高四位全部输出低电平,低四位输出高电平 P1=0x0f; if(P1!=0x0f) //说明有按键按下 { delay(1000);//消除抖动 if(P1!=0x0f) { switch(P1) //对每一列进行测试 { case(0x07): //转换为二进制为00000111,说明P-13接口有按键按下 KeyValue=0; break; case(0x0b): //P-12接口有按键按下 KeyValue=1; break; case(0x0d): //P-11接口有按键按下 KeyValue=2; break; case(0x0e): //P-10接口有按键按下 KeyValue=3; break; } P1=0xf0; //高四位输出高电平,低四位输出低电平 switch(P1) //测试每一行 { //从每一列的测试跳出后,进入每一行的测试,此时的KeyValue为每一列的值,要想与每一行对应,只需要在每一行+4即可 case(0x70): //转换为二进制为01110000,说明P-17接口有按键按下 KeyValue=KeyValue; break; case(0xb0): //P-16接口有按键按下 KeyValue=KeyValue+4; break; case(0xd0): //P-15接口有按键按下 KeyValue=KeyValue+8; break; case(0xe0): //P-14接口有按键按下 KeyValue=KeyValue+16 ; break; } //按键松开的判断 while((a<50)&&(P1!=0xf0)) { delay(1000); a++; } } } } void main() { while(1) { KeyDown(); P0=~smgduan[KeyValue]; } }