矩阵按键模块
//学习B站江科大自化协51单片机入门教程
视频讲解矩阵键盘按列扫描,不与蜂鸣器冲突
扫描第一列时候给P1口高电平(0xFF),然后给第一列低电平(P1_3=0;)
这时判断是第一列哪个按键按下即可
示例代码如下:
//采用逐列扫描,不与蜂鸣器冲突
unsigned char Matrixkey()
{
unsigned char Keynumber=0;
P1=0xFF;//P1按键全给高电平
P1_3=0;//再给P1_3一个低电平,扫描第一列
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynumber=1;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynumber=5;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynumber=9;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynumber=13;}
P1=0xFF;//P1按键全给高电平
P1_2=0;//再给P1_2一个低电平,扫描第二列
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynumber=2;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynumber=6;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynumber=10;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynumber=14;}
P1=0xFF;//P1按键全给高电平
P1_1=0;//扫描第三列
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynumber=3;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynumber=7;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynumber=11;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynumber=15;}
P1=0xFF;//P1按键全给高电平
P1_0=0;//扫描第四列
if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Keynumber=4;}
if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Keynumber=8;}
if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Keynumber=12;}
if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Keynumber=16;}
return Keynumber;
}
然后在main.c主函数定义一个全局变量,放在while(1)里调用即可
unsigned char KeyNum;//矩阵键盘返回值接口
#include#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); //在LCD1602上显示按键键码数值 } } }
延时函数封装起来了
函数如下:
#include "Delay.h"
//延时1ms函数
void Delay(int xms) { //@11.0592MHz
unsigned char i, j;
while (xms--) {
i = 2;
j = 199;
do {
while (--j);
} while (--i);
}
}
函数比较少,可以不模块化,也可以把矩阵按键函数和延时函数都放在main.c里
//有问题可以评论或私信



