一,矩阵键盘
本次学习的显示都基于LCD1602来显示结果
1.矩阵键盘的介绍
2.矩阵键盘原理图
3.扫描的概念
由于按行扫描会受共用端口影响,所以这次选择按列扫描
二,实例操作
(1)读取矩阵键盘的键码值
点第几个按键,键盘上显示第几个按键所代表的键位,显示在LCD1602上
1.新建工程以后将LCD1602调试文件和延迟函数都放入新文件中,写好头文件和基础代码
2.MATRIXKEY函数
#include <REGX52.H>
#include "Delay.h"
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_7==0);Delay(20);KeyNumber=5;}
if(P1_5==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=9;}
if(P1_4==0){Delay(20);while(P1_7==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_7==0);Delay(20);KeyNumber=6;}
if(P1_5==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=10;}
if(P1_4==0){Delay(20);while(P1_7==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_7==0);Delay(20);KeyNumber=7;}
if(P1_5==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=11;}
if(P1_4==0){Delay(20);while(P1_7==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_7==0);Delay(20);KeyNumber=8;}
if(P1_5==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=12;}
if(P1_4==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=16;}
return KeyNumber;
}
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
unsigned char KeyNum;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"MatrixKey!");
while(1)
{
KeyNum=MatrixKey();
if(KeyNum)
{
LCD_ShowNum(2,1,KeyNum,2);
}
}
}
最终效果
(2)矩阵键盘的应用—电子密码锁
需要定义一些按键的功能
S1-S9是输入密码的1-9,S10定义为0,S11为确认建,S12为取消键,其他键位暂时不用
在上面代码的基础上对main函数部分增加一些密码的算法
#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)
{ Delay(150);
KeyNum=MatrixKey();
if(KeyNum)
{
if(KeyNum<=10) //1-10为密码区,如果按键按下,可以输入密码
{
if(Count<4) //如果输入次数小于4
{
Password*=10; //密码左移一位
Password+=KeyNum%10; //获取一位密码
Count++; //计次加一
}
LCD_ShowNum(2,1,Password,4); //更新显示
}
if(KeyNum==11)
{
if(Password==2345)
{
LCD_ShowString(1,14,"OK ");
Password=0; //计次清零
Count=0;
LCD_ShowNum(2,1,Password,4); //更新显示
}
else
{
LCD_ShowString(1,14,"ERR");
Password=0; //计次清零
Count=0;
LCD_ShowNum(2,1,Password,4); //更新显示
}
}
if(KeyNum==12)
{
Password=0;
Count=0;
LCD_ShowNum(2,1,Password,4);
}
}
}
}
效果显示