数码管扫描(输出扫描)
原理:显示第1位→显示第2位→显示第3位→……,然后快速循环这个过程,最终实现所有数码管同时显示的效果
矩阵键盘扫描(输入扫描)
原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果
以上两种扫描方式的共性:节省I/O口
1、获取矩阵按键值
#include <REGX52.H>
#include "Delay.h"
/**
* @brief 获取矩阵键盘的数值
* @param None
* @retval 按下的矩阵按键的值
*/
// 按列进行扫描
unsigned char getMatrixKey()
{
unsigned char Num = 0;
P1 = 0xFF;
P1_3 = 0;
if(P1_7==0) {Delay(20);while(P1_7==0);Delay(20);Num=1;}
if(P1_6==0) {Delay(20);while(P1_6==0);Delay(20);Num=5;}
if(P1_5==0) {Delay(20);while(P1_5==0);Delay(20);Num=9;}
if(P1_4==0) {Delay(20);while(P1_4==0);Delay(20);Num=13;}
P1 = 0xFF;
P1_2 = 0;
if(P1_7==0) {Delay(20);while(P1_7==0);Delay(20);Num=2;}
if(P1_6==0) {Delay(20);while(P1_6==0);Delay(20);Num=6;}
if(P1_5==0) {Delay(20);while(P1_5==0);Delay(20);Num=10;}
if(P1_4==0) {Delay(20);while(P1_4==0);Delay(20);Num=14;}
P1 = 0xFF;
P1_1 = 0;
if(P1_7==0) {Delay(20);while(P1_7==0);Delay(20);Num=3;}
if(P1_6==0) {Delay(20);while(P1_6==0);Delay(20);Num=7;}
if(P1_5==0) {Delay(20);while(P1_5==0);Delay(20);Num=11;}
if(P1_4==0) {Delay(20);while(P1_4==0);Delay(20);Num=15;}
P1 = 0xFF;
P1_0 = 0;
if(P1_7==0) {Delay(20);while(P1_7==0);Delay(20);Num=4;}
if(P1_6==0) {Delay(20);while(P1_6==0);Delay(20);Num=8;}
if(P1_5==0) {Delay(20);while(P1_5==0);Delay(20);Num=12;}
if(P1_4==0) {Delay(20);while(P1_4==0);Delay(20);Num=16;}
return Num;
}
#include <REGX52.H>
#include "LCD1602.h" // 上一章介绍了
#include "MatrixKey.h"
unsigned char num=0;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"Matrix Key:");
while(1)
{
num = getMatrixKey();
if(num) LCD_ShowNum(2,1,num,2);
}
}
2、矩阵按键 实现 四位密码锁
#include <REGX52.H>
#include "LCD1602.h"
#include "MatrixKey.h"
unsigned char num,count;
unsigned int password; // 用来保存输入的四位数密码
void main()
{
LCD_Init();
LCD_ShowString(1,1,"Matrix Key:");
while(1)
{
num = getMatrixKey();
if(num<=10 && num>0) {
if(count < 4){ // 如果输入次数小于4
password *= 10; //密码左移一位
password += num%10; // 获取一位密码
}
count ++;
}
if(num==11) //s11 按键 作为 确认
{
if(password == 2345){
LCD_ShowString(1,14,"OK "); // 输入密码正确显示OK
password = 0;
count = 0;
}
else{
LCD_ShowString(1,14,"ERR");// 输入密码错误显示ERR
password = 0;
count = 0;
}
}
if(num==12) //s12 按键 作为输入密码清零操作
{
password = 0;
count = 0;
}
LCD_ShowNum(2,1,password,4);
}
}