一、矩阵键盘简介
矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
每一行或列检测时对应0,其余3行或列为1,则按键按下后0就可以传输,,不按下0就不会传输。
注意:
逐行扫描时由于P15连接到BZ(位于步进电机,相当于驱动器)进而连接到无源蜂鸣器,此时频率一会高一会低,所以蜂鸣器回响。所以采取逐列扫描的方式
扫描:
注意:
单片机的1驱动能力弱,0驱动能力强,但有上限,不会造成短路。
二、初步运用
创建一个有返回值的函数,返回值是按键的键码,以此来判断按下的是哪个按键。
#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_4=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;
}
用一个变量接受返回值,并输出。
unsigned char KeyNum;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"MatrixKey:");
while(1){
KeyNum=MatrixKey();
if(KeyNum!=0)
{
LCD_ShowNum(2,1,KeyNum,2);
}
}
}
二、矩阵键盘密码锁
对应按键按下输入密码,每次输入时,上一次输入的要向左进一位,然后按下S11时为确定键,判读是否与设定的密码相等,相等则显示OK同时密码清零重新输入,错误则显示ERR并重新输入,如若按下S12,则所有清零,重新输入。在这里面设定密码为4位(因为unsigned int类型的变量只从0到65535)所以要设立一个变量count若count==4,则继续输入就没用了。
unsigned char KeyNum;
unsigned int Passwordd,Count;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"Password:");
while(1){
KeyNum=MatrixKey();
if(KeyNum)
{
if(KeyNum<=10)
{
if(Count<4)
{
Password*=10;
Password+=KetNum%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);
}
}
}