一.写在前面
对于需要大量按键的应用场景就不能一个GPIO一个按键来控制了,由此我们引入扫描键盘概念。
本次测试使用P0口的高四位和低四位组成4*4键盘矩阵共十六个按键。基本思路:先置P0低四位高电平读行数,再置P0高四位高电平读列数。最后将读取到的行数和列数对应的键值由数码管显示出来。本次测试原理比较简单,在此就不多赘述了。
二.代码
/* Main.c file generated by New Project wizard
*
* Created: 周五 6月 21 2019
* Processor: AT89C51
* Compiler: Keil for 8051
*/
#include <reg51.h>
#include <stdio.h>
#define SEG P1
typedef unsigned char uint8_t;
// 0~F 数字字模
const uint8_t n[4][4] = {
{0x40, 0x79, 0x24, 0x30},
{0x19, 0x12, 0x02, 0x78},
{0x00, 0x10, 0x08, 0x03},
{0x46, 0x21, 0x06, 0x0E}
};
uint8_t col;
uint8_t row;
void main(void)
{
// Write your code here
while(1){
//行选,列选归位
row = 0xFF;
col = 0xFF;
//置P0低四位高电平读行数
P0 = 0x0F;
switch(P0){
case 0x0E:row = 0;break;
case 0x0D:row = 1;break;
case 0x0B:row = 2;break;
case 0x07:row = 3;break;
}
//置P0高四位高电平读列数
P0 = 0xF0;
switch(P0){
case 0xE0:col = 0;break;
case 0xD0:col = 1;break;
case 0xB0:col = 2;break;
case 0x70:col = 3;break;
}
//判断读到的数字并由SEG显示
if(col != 0xFF && row != 0xFF){
SEG = n[row][col];
}
}
}
三.电路图及结果