一.矩阵键盘原理
矩阵键盘是这个东西:
电路原理图
矩阵键盘的判断方式是:逐行逐列扫描。
P10、P11、P12、P13为一组(记为A组),属于“列”;
P14、P15、P16、P17为一组(记为B组),属于“行”。
通过扫描,确定是哪一行哪一列的按键被按下了。
起初,先给全体赋予高电平1(P1=0xFF),然后每次赋予A组的其中一个端口为低电平0,随后再遍历判断B组所有端口的电平情况,如果出现一个端口为低电平0,说明这条线路导通了,那么就可以判断是哪个按键按下了。
说起来有点复杂,还是用程序来说话吧!
二.矩阵键盘扫描(用LCD1602显示)
我们将矩阵键盘每个电键看成一个数字(S1就是1,S2就是2),当我们按下时,我们用LCD1602来显示这个按键的值。这样就能测试我们遍历程序正确与否。
【顺便封装一下MatrixKey呗】
MatrixKey.h:
#ifndef __MatrixKey_H__
#define __MatrixKey_H__
int MatrixKey();
#endif
MareixKey.c:【遍历的程序在这】
#include<regx52.h>
void Delay(int x)
{
while(x!=0) {x--;}
}
int MatrixKey()
{
int keynumber=0;
P1=0xFF; //initialize:1111 1111
P1_3=0;
if(P1_7==0) {Delay(100); while(P1_7==0); Delay(100); keynumber=1;}
if(P1_6==0) {Delay(100); while(P1_6==0); Delay(100); keynumber=5;}
if(P1_5==0) {Delay(100); while(P1_5==0); Delay(100); keynumber=9;}
if(P1_4==0) {Delay(100); while(P1_4==0); Delay(100); keynumber=13;}
P1=0xFF; //initialize:1111 1111
P1_2=0;
if(P1_7==0) {Delay(100); while(P1_7==0); Delay(100); keynumber=2;}
if(P1_6==0) {Delay(100); while(P1_6==0); Delay(100); keynumber=6;}
if(P1_5==0) {Delay(100); while(P1_5==0); Delay(100); keynumber=10;}
if(P1_4==0) {Delay(100); while(P1_4==0); Delay(100); keynumber=14;}
P1=0xFF; //initialize:1111 1111
P1_1=0;
if(P1_7==0) {Delay(100); while(P1_7==0); Delay(100); keynumber=3;}
if(P1_6==0) {Delay(100); while(P1_6==0); Delay(100); keynumber=7;}
if(P1_5==0) {Delay(100); while(P1_5==0); Delay(100); keynumber=11;}
if(P1_4==0) {Delay(100); while(P1_4==0); Delay(100); keynumber=15;}
P1=0xFF; //initialize:1111 1111
P1_0=0;
if(P1_7==0) {Delay(10000); while(P1_7==0); Delay(100); keynumber=4;}
if(P1_6==0) {Delay(10000); while(P1_6==0); Delay(100); keynumber=8;}
if(P1_5==0) {Delay(10000); while(P1_5==0); Delay(100); keynumber=12;}
if(P1_4==0) {Delay(10000); while(P1_4==0); Delay(100); keynumber=16;}
return keynumber;
}
main:
#include<regx52.h>
#include"LCD1602.h"
#include"MatrixKey.h"
int number;
void main()
{
LCD_Init();
while(1)
{
number=MatrixKey();
if (number!=0)
{
LCD_ShowNum(1,1,number,3);
}
}
}
显示结果如下(当前按下S8):
三.矩阵键盘小应用——密码锁
学了矩阵键盘的扫描方法,不如来用用看吧~
规定S1~S10分别表示1,2,3,4,5,6,7,8,9,0。
另外,S11为“确认键”,S12为“回退键”(删除上一个输入的数字)。
请看代码:
#include<regx52.h>
#include"LCD1602.h"
#include"MatrixKey.h"
int keynumber;
int scanfpassword;
int staticpassword;
int ws;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"Password:");
ws=1;
//staticpassword=xxx; 先规定正确的密码
while(1)
{
keynumber=MatrixKey();
if (keynumber!=0)
{
if(ws==16) break; //输入的密码超出了LCD1602能显示的范围,清空区域
if (keynumber<=10)
{
LCD_ShowNum(2,ws++,keynumber,1);
if (keynumber!=10) scanfpassword=scanfpassword*10+keynumber; //看作多位整数,计算输入的密码
else scanfpassword=scanfpassword*10; //输入10,显示0,另作讨论
}
else if (keynumber==11) //S11确认,比较两数
{
if(scanfpassword==staticpassword) LCD_ShowString(2,1,"Right!");
else LCD_ShowString(2,1,"Wrong!");
while(1);
}
else if (keynumber==12) //S12回退
{
if(ws>=1) { LCD_ShowString(2,--ws," "); scanfpassword=scanfpassword/10; }
else ws=1; //当回退到头,ws不能再自减了
}
}
}
}