矩阵键盘介绍
- 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式
- 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态
扫描的概念
-
数码管扫描(输出扫描)
原理:显示第1位→显示第2位→显示第3位→……,然后快速循环这个过程,最终实现所有数码管同时显示的效果 -
矩阵键盘扫描(输入扫描)
原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果
以上两种扫描方式的共性:节省I/O口
matrixkey.c:
#include <REGX52.H>
#include "Delay.h"
unsigned char matrixkey()
{
unsigned char number=0;
P1=0xff;
P1_7=0;
if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);number=1;}
if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);number=2;}
if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);number=3;}
if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);number=4;}
P1=0xff;
P1_6=0;
if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);number=5;}
if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);number=6;}
if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);number=7;}
if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);number=8;}
P1=0xff;
P1_5=0;
if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);number=9;}
if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);number=10;}
if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);number=11;}
if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);number=12;}
P1=0xff;
P1_4=0;
if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);number=13;}
if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);number=14;}
if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);number=15;}
if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);number=16;}
return number;
}
main.c:
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "matrixkey.h"
unsigned char key;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"matrixkey:");
while(1)
{
key=matrixkey();
if(key!=0)
LCD_ShowNum(2,1,key,2);
}
}
注释
/**
* @brief 解释代码作用
* @param 参数说明
* @param 参数说明
* @param 参数说明
...
* @retval 返回值
*/
/**
* @brief 在LCD1602指定位置开始以二进制显示所给数字
* @param Line 起始行位置,范围:1~2
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~1111 1111 1111 1111
* @param Length 要显示数字的长度,范围:1~16
* @retval 无
*/