跳转至

矩阵键盘

矩阵键盘

当键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成举着你形式

采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态

image-20250107105808663

逐行扫描:先取一行,接地,看成独立键盘,检测每“列”的I/O口。对于第一行,将P17接地,检测P13、P12、P11、P10

逐列扫描:……

扫描

  • 数码管扫描【输出扫描】

原理:显示第1位->显示第2位->……,快速循环整个过程,最终实现所有数码管同时显示的效果

  • 矩阵键盘扫描【输入扫描】

原理:读取第1行(列)->读取第2行(列)……,快速循环这个过程,最终实现所有按键同时检测的效果

I/O口

一种弱上拉模式,准双向口

输出高电平的I/O口与低电平直接相连,不会短路。因为输出能力有限,输入能力强。

对于STC89C52而言,P1-3都是弱上拉,P0是开漏输出

因此在按键检测中,输出高电平一头接地;假如输出低电平一头接VCC,会产生很大电流。

读入键盘数值并显示在显示屏上

// 核心代码
#include <REGX52.H>
#include "Delay.h"

unsigned char Matrixkey(){
    unsigned char KeyNumber = 0;
    P1 = 0xFF;
    P1_3 = 0;
    if(P1_7 == 0){Delay(20); while(!P1_7); Delay(20);KeyNumber=1;}
    if(P1_6 == 0){Delay(20); while(!P1_6); Delay(20);KeyNumber=5;}
    if(P1_5 == 0){Delay(20); while(!P1_5); Delay(20);KeyNumber=9;}
    if(P1_4 == 0){Delay(20); while(!P1_4); Delay(20);KeyNumber=13;}

    P1 = 0xFF;
    P1_2 = 0;
    if(P1_7 == 0){Delay(20); while(!P1_7); Delay(20);KeyNumber=2;}
    if(P1_6 == 0){Delay(20); while(!P1_6); Delay(20);KeyNumber=6;}
    if(P1_5 == 0){Delay(20); while(!P1_5); Delay(20);KeyNumber=10;}
    if(P1_4 == 0){Delay(20); while(!P1_4); Delay(20);KeyNumber=14;}

    P1 = 0xFF;
    P1_1 = 0;
    if(P1_7 == 0){Delay(20); while(!P1_7); Delay(20);KeyNumber=3;}
    if(P1_6 == 0){Delay(20); while(!P1_6); Delay(20);KeyNumber=7;}
    if(P1_5 == 0){Delay(20); while(!P1_5); Delay(20);KeyNumber=11;}
    if(P1_4 == 0){Delay(20); while(!P1_4); Delay(20);KeyNumber=15;}

    P1 = 0xFF;
    P1_0 = 0;
    if(P1_7 == 0){Delay(20); while(!P1_7); Delay(20);KeyNumber=4;}
    if(P1_6 == 0){Delay(20); while(!P1_6); Delay(20);KeyNumber=8;}
    if(P1_5 == 0){Delay(20); while(!P1_5); Delay(20);KeyNumber=12;}
    if(P1_4 == 0){Delay(20); while(!P1_4); Delay(20);KeyNumber=16;}

    return KeyNumber;
}

矩阵键盘密码锁

// 主函数
// 核心代码如上不变
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "Matrixkey.h"

unsigned char KeyNum, count  = 0;
unsigned int Password;

void main(){
    LCD_Init();
    while(1){
        KeyNum = Matrixkey();
        if(KeyNum){
            if(KeyNum <= 10){
                // 输入密码
                if(count < 4){
                    Password *= 10;
                    Password += KeyNum % 10;
                    count++;
                }
                LCD_ShowNum(2,1,Password,4);
            }
            if(KeyNum == 11){
                if(Password ==  2345){
                    LCD_ShowString(1,3, "success");
                    Password=count=0;
                    LCD_ShowNum(2,1,Password,4);
                }
                else{
                    LCD_ShowString(1,3, "fail");
                    Password=count=0;
                    LCD_ShowNum(2,1,Password,4);
                }
            }
            if(KeyNum == 12){
                Password=count=0;
                LCD_ShowNum(2,1,Password,4);
            }
        }
    }
}