矩阵键盘
矩阵键盘¶
当键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成举着你形式
采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态
逐行扫描:先取一行,接地,看成独立键盘,检测每“列”的I/O口。对于第一行,将P17接地,检测P13、P12、P11、P10
逐列扫描:……
扫描¶
- 数码管扫描【输出扫描】
原理:显示第1位->显示第2位->……,快速循环整个过程,最终实现所有数码管同时显示的效果
- 矩阵键盘扫描【输入扫描】
原理:读取第1行(列)->读取第2行(列)……,快速循环这个过程,最终实现所有按键同时检测的效果
I/O口¶
一种弱上拉模式,准双向口
输出高电平的I/O口与低电平直接相连,不会短路。因为输出能力有限,输入能力强。
对于STC89C52而言,P1-3都是弱上拉,P0是开漏输出
因此在按键检测中,输出高电平一头接地;假如输出低电平一头接VCC,会产生很大电流。
读入键盘数值并显示在显示屏上¶
// 核心代码
#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); Delay(20);KeyNumber=1;}
if(P1_6 == 0){Delay(20); while(!P1_6); Delay(20);KeyNumber=5;}
if(P1_5 == 0){Delay(20); while(!P1_5); Delay(20);KeyNumber=9;}
if(P1_4 == 0){Delay(20); while(!P1_4); Delay(20);KeyNumber=13;}
P1 = 0xFF;
P1_2 = 0;
if(P1_7 == 0){Delay(20); while(!P1_7); Delay(20);KeyNumber=2;}
if(P1_6 == 0){Delay(20); while(!P1_6); Delay(20);KeyNumber=6;}
if(P1_5 == 0){Delay(20); while(!P1_5); Delay(20);KeyNumber=10;}
if(P1_4 == 0){Delay(20); while(!P1_4); Delay(20);KeyNumber=14;}
P1 = 0xFF;
P1_1 = 0;
if(P1_7 == 0){Delay(20); while(!P1_7); Delay(20);KeyNumber=3;}
if(P1_6 == 0){Delay(20); while(!P1_6); Delay(20);KeyNumber=7;}
if(P1_5 == 0){Delay(20); while(!P1_5); Delay(20);KeyNumber=11;}
if(P1_4 == 0){Delay(20); while(!P1_4); Delay(20);KeyNumber=15;}
P1 = 0xFF;
P1_0 = 0;
if(P1_7 == 0){Delay(20); while(!P1_7); Delay(20);KeyNumber=4;}
if(P1_6 == 0){Delay(20); while(!P1_6); Delay(20);KeyNumber=8;}
if(P1_5 == 0){Delay(20); while(!P1_5); Delay(20);KeyNumber=12;}
if(P1_4 == 0){Delay(20); while(!P1_4); Delay(20);KeyNumber=16;}
return KeyNumber;
}
矩阵键盘密码锁¶
// 主函数
// 核心代码如上不变
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "Matrixkey.h"
unsigned char KeyNum, count = 0;
unsigned int Password;
void main(){
LCD_Init();
while(1){
KeyNum = Matrixkey();
if(KeyNum){
if(KeyNum <= 10){
// 输入密码
if(count < 4){
Password *= 10;
Password += KeyNum % 10;
count++;
}
LCD_ShowNum(2,1,Password,4);
}
if(KeyNum == 11){
if(Password == 2345){
LCD_ShowString(1,3, "success");
Password=count=0;
LCD_ShowNum(2,1,Password,4);
}
else{
LCD_ShowString(1,3, "fail");
Password=count=0;
LCD_ShowNum(2,1,Password,4);
}
}
if(KeyNum == 12){
Password=count=0;
LCD_ShowNum(2,1,Password,4);
}
}
}
}