1.原理图
2.矩阵键盘介绍
矩阵键盘和独立键盘一样,单片机检测其是否被按下的依据都是检测与该键对应I/O口是否为低电平。
3.矩阵键盘扫描(输入扫描)
(1)原理:
读取第1行(列)->读取第2行(列)->读取第3行(列)->......,然后快速循环这个过程,最终实现所有按键同时检测的效果。
(2)按行
将P17接低电平,即为0,P16-P14接高电平,即为1。然后进行判断,如果P13为0,则S1按下,以此类推。有些型号的单片机,如果按行,P15端口会发生冲突,P15与蜂鸣器相接,蜂鸣器可能会响。
(3)按列
给P13-P10赋值,读取P17-P14,原理和按行类似
4.keil软件的自定义,方便编程
步骤如下:
(1)点开如下图所示的模块
(2)在空白处右键,选择如下图的选项
(3)此时进入自定义的模板
(4)将格式输入其中,然后点击ok,下次输入时,直接双击即可
5.矩阵键盘应用
(1)读取矩阵键盘,在LCD1602上显示
步骤:
创建如图所示的文件
在MatrixKey.c文件中创建如下代码,注释如下:
#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_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;
}
在MatrixKey.h中添加如下声明:
#ifndef __MatrixKey_H__
#define __MatrixKey_H__
unsigned char MatrixKey();
#endif
在主函数中
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
void main()
{
unsigned char KeyNum;
LCD_Init();//初始化
LCD_ShowString(1,1,"MatrixKey:");
while(1)
{
KeyNum=MatrixKey();
if(KeyNum)
{
LCD_ShowNum(2,1,KeyNum,3);
}
}
}
其他的延时函数和LCD1602的头文件和.c文件代码见前几章,或者评论区百度网盘提取
效果:
普中51单片机矩阵键盘
(2)矩阵键盘密码锁
步骤:
按键分布
S1-S9 | 1-9 |
S10 | 0 |
S11 | 确认 |
S12 | 取消 |
S13 | 退格 |
工程文件布局
文件细分
1)主函数(有代码注释)
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
void main()
{
unsigned char KeyNum;
unsigned int Passward,Count;
LCD_Init();//初始化
LCD_ShowString(1,1,"Passward:");
while(1)
{
KeyNum=MatrixKey();
if(KeyNum)
{
if(KeyNum<=10)//S1-S10,密码区
{
if(Count<4)//记录次数,4次
{
Passward*=10;//左移,0000->首先按下1,0001->0010
//->按下2,0012,以此类推
Passward+=KeyNum%10;//传回按键10,取余就是0
//获取一位密码
Count++;//次数增加
}
LCD_ShowNum(2,1,Passward,4);//显示更新
}
if(KeyNum==11)//S11,确认
{
if(Passward==1212)//输入的密码等于正确的密码
{
LCD_ShowString(1,14,"OK!");//凑成三个,不然会变成okR
Passward=0;//密码清零
Count=0;//计数清零
LCD_ShowNum(2,1,Passward,4);//显示更新,不然不会显示0000
}
else //密码不正确
{
LCD_ShowString(1,14,"ERR");
Passward=0;//密码清零
Count=0;//计数清零
LCD_ShowNum(2,1,Passward,4);//显示更新,不然不会显示0000
}
}
if(KeyNum==12)//S12,取消
{
Passward=0;//密码清零
Count=0;//计数清零
LCD_ShowNum(2,1,Passward,4);//显示更新
}
if(KeyNum==13)//S13,退格
{
Passward=Passward/10;
Count--;
LCD_ShowNum(2,1,Passward,4);//显示更新
}
}
}
}
2)其他.c文件和头文件
延时函数、LCD1602、还有就是示例一中的MatrixKey.c和MatrixKey.h,大家需要的话,评论区领取。
效果如下:
普中51单片机矩阵键盘密码锁