师从江科大
矩阵键盘介绍
在键盘中按键数量较多时,为减少I/O口的占用,通常将按键排列成矩阵形式。采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。
矩阵键盘扫描方法
在电子电路设计中,尤其是在键盘或矩阵按键的处理上,行扫描和列扫描是两种常见的检测按键状态的方法,尤其是对于多按键系统(如矩阵键盘)。
-
按行扫描(Row Scanning): 在矩阵键盘中,按键被排列成行和列的形式。按行扫描是指将键盘的行线设置为输入,而列线设置为输出,并逐行地给每一行线赋予高电平(使能),同时检测所有列线的电平状态。如果某一列线检测到低电平,则表示该列与当前激活行相交的按键被按下。然后继续切换下一行线为高电平,重复检测过程,直到所有行都检查完毕。
-
按列扫描(Column Scanning): 与此相反,在按列扫描方式下,列线设置为输入,行线设置为输出。此时,逐列地给每一列线赋予低电平(拉低),同时读取所有行线的电平状态。若某一行为低电平,则表示该行与当前激活列相交的按键被按下。同样地,持续对剩余列进行同样的操作,直至完成所有列的扫描。
准双向口
准双向口(Quasi-bidirectional Port)是指在数字电路和微控制器中,具有输入和输出功能,但其输入和输出操作不能同时进行的I/O端口。这类端口通常设计为能够通过软件配置实现数据输入或数据输出。
矩阵键盘代码
main.c
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
unsigned char KeyNum;
void main()
{
LCD_Init();
LCD_ShowString(1,1,"MatrixKey:");
while(1)
{
KeyNum=MatrixKey();
if(KeyNum)
{
LCD_ShowNum(2,1,KeyNum,2);
}
}
}
Delay.c
void Delay(unsigned int xms) //@12.000MHz
{
unsigned char data i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms); //@12.000MHz;
#endif
LCD1602.c
#include <REGX52.H>
//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0
//函数定义:
/**
* @brief LCD1602延时函数,12MHz调用可延时1ms
* &