矩阵键盘
上图就是矩阵键盘的按键电路图,我们可以清除的看到只有八条线对16个按键进行控制,而且是通过P1口进行控制,其中P1_0 P1_1 P1_2 P1_3这四个输出口分别对纵向的四列按键的其中一个引脚进行连接,而P1_4 P1_5 P1_6 P1_7这四个输出口分别对横向的四行按键的其中一个引脚进行连接。在使用之前,我们得知道,单片机是通过扫描来对矩阵键盘进行读取的,如果是以列来扫描的话,单片机就会从第一列到最后一列,一列一列地去扫描。
矩阵键盘在LCD显示屏的简单应用
显示的内容主要是,让每个按键都有对应的数字。
主函数代码如下:
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
unsigned char KeyNum;
void main()
{
LCD_Init();//对LCD初始化
LCD_ShowString(1,1,"MatrixKey");//在LCD显示屏上,从第一行第一列开始
while(1)
{
KeyNum=MatrixKey();
if(KeyNum!=0)
{
LCD_ShowNum(2,1,KeyNum,2);//从LCD显示屏上,从第二行第一列开始
}
}
}
接着就是MatrixKey的模块代码:
#include <REGX52.H>
#include "Delay.h"
/**
* @brief 矩阵键盘读取按键键码
* @param 无
* @retval KeyNumber 按下键盘的键码值
如果按键按下不放,程序会停留在次函数,松手的一瞬间,返回按键的键码,没有按键按下时,返回0
*/
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
P1=0xFF;
P1_3=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
P1=0xFF;
P1_2=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
P1=0xFF;
P1_1=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
P1=0xFF;
P1_0=0;
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
return KeyNumber;
}
这个模块代码的主要思路是先让矩阵键盘的十六个键都是处于同一个状态,当按下其中一个键时,被按下的键就会改变状态,然后通过if语句的判断,就可以让LCD显示屏显示数字了。
矩阵键盘密码锁
为了更好的了解矩阵键盘,我们可以在上一个编写的代码上的基础上进行升级,让矩阵键盘可以解开自己设置的密码锁
主函数的代码如下:
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
unsigned char KeyNum;
unsigned int Password,Count;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"Password");
while(1)
{
KeyNum=MatrixKey();
if(KeyNum!=0)
{
if(KeyNum<=10) //如果s1~s10按键按下,输入密码
{
if(Count<4)//如果输入次数小于4
{
Password*=10; //密码左移一位
Password+=KeyNum%10; //获取一位密码
}
Count++; //计次加一
LCD_ShowNum(2,1,Password,4); //更新显示
}
if(KeyNum==11) //如果s11按键按下,确认
{
if(Password==2345) //如果密码等于正确密码
{
LCD_ShowString(1,14,"OK ");//显示OK
Password=0; //密码清零
Count=0; //计次清零
}
else //否则
{
LCD_ShowString(1,14,"ERR");//显示ERROR
Password=0; //密码清零
Count=0; //计次清零
LCD_ShowNum(2,1,Password,4); //更新显示
}
}
if(KeyNum==12) //如果s12按键按下,取消
{
Password=0; //密码清零
Count=0; //计次清零
LCD_ShowNum(2,1,Password,4); //更新显示
}
}
}
}
在这个代码中一共用到了12个按键,并用了多个多个if语句去对清除,确认,输入密码是否正确的显示等这些功能去进行判断。