1. 51-microcontroler

51-microcontroler-第六话-键盘扫描

一.写在前面

对于需要大量按键的应用场景就不能一个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];
        }     
    }
}

三.电路图及结果