(E) 51 微控制器基础知识 - 矩阵式键盘
最编程
2024-04-14 07:53:09
...
矩阵键盘介绍:
- 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式
- 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态
扫描:
数码管扫描(输出扫描)
原理:显示第1位→显示第2位→显示第3位→……,然后快速循环这个过程,最终实现所有数码管同时显示的效果
矩阵键盘扫描(输入扫描)
原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果
以上两种扫描方式的共性:节省I/O口
因为51单片机自身电路(P15连到了蜂鸣器)的问题,我们不采用逐行扫描,我们采用逐列扫描的方式,通过给P10,P11,P12,P13,赋值,读取剩下四个引脚来实现使用矩阵键盘。具体实现,看以下代码:
#include <REGX52.H>
#include "Delay.h"
//可能代码比较多,但是思路比较清晰,先列再行
/**
* @brief 矩阵键盘读取按键键码
* @param 无
* @retval KeyNumber 按下的键码值
如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回0
*/
unsigned char MatrixKey(){
unsigned char KeyNumber = 0;
P1 = 0xFF;
P1_3 = 0;
if(P1_7 == 0){Delay(20);while(P1_7 == 0);KeyNumber = 1;}
if(P1_6 == 0){Delay(20);while(P1_6 == 0);KeyNumber = 5;}
if(P1_5 == 0){Delay(20);while(P1_5 == 0);KeyNumber = 9;}
if(P1_4 == 0){Delay(20);while(P1_4 == 0);KeyNumber = 13;}
P1 = 0xFF;
P1_2 = 0;
if(P1_7 == 0){Delay(20);while(P1_7 == 0);KeyNumber = 2;}
if(P1_6 == 0){Delay(20);while(P1_6 == 0);KeyNumber = 6;}
if(P1_5 == 0){Delay(20);while(P1_5 == 0);KeyNumber = 10;}
if(P1_4 == 0){Delay(20);while(P1_4 == 0);KeyNumber = 14;}
P1 = 0xFF;
P1_1 = 0;
if(P1_7 == 0){Delay(20);while(P1_7 == 0);KeyNumber = 3;}
if(P1_6 == 0){Delay(20);while(P1_6 == 0);KeyNumber = 7;}
if(P1_5 == 0){Delay(20);while(P1_5 == 0);KeyNumber = 11;}
if(P1_4 == 0){Delay(20);while(P1_4 == 0);KeyNumber = 15;}
P1 = 0xFF;
P1_0 = 0;
if(P1_7 == 0){Delay(20);while(P1_7 == 0);KeyNumber = 4;}
if(P1_6 == 0){Delay(20);while(P1_6 == 0);KeyNumber = 8;}
if(P1_5 == 0){Delay(20);while(P1_5 == 0);KeyNumber = 12;}
if(P1_4 == 0){Delay(20);while(P1_4 == 0);KeyNumber = 16;}
return KeyNumber;
}
这段代码就能确定我们是按下了哪个按键。
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
unsigned char KeyNum;
unsigned int Password,Count;
void main(){
LCD_Init();
LCD_ShowString(1, 1, "Password:");
while(1){
KeyNum = MatrixKey();
if(KeyNum)
{
if(KeyNum<=10) //如果S1~S10按下,输入密码
{
if(Count<4)//如果次数小于4才判断
{
Password*=10;//密码左移
Password += KeyNum%10; //获取一位密码
}
Count++;//计数输入的个数
}
LCD_ShowNum(2,1,Password,4);//更新显示
}
if(KeyNum == 11)//如果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)//如果12按下,取消
{
Password = 0;//密码清零
Count = 0;//计次清零
LCD_ShowNum(2,1,Password,4);//更新显示
}
}
}
这段代码实现了密码锁的功能,其中LCD_Show函数是用来调试的函数,其代码之后会讲,在此不做介绍,了解了矩阵键盘的使用就好。
实现效果如下所示:
https://live.****.net/v/embed/208482
矩阵键盘1
上一篇: [51 MCU] 矩阵键盘