原理图:

加上上次的LCD便于调试:

Proteus用到的一些元器件:
| 按键 | BUTTON |
| 排阻 | RESPACK-8 |
| 液晶显示屏 | LM016L |
代码:
代码部分使用的是江协科技(江科大)B站视频的代码:比较容易懂。
采用模块化编程:

Delay.c:
常见的延时代码,之后就不列出了。
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
Delay.h:
预编译一下:
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
LCD的代码目前还是用的现成的;
MatrixKey.c:
#include <REGX52.H>
#include "Delay.h"
/**
* @brief 矩阵键盘读取按键键码
* @param 无
* @retval KeyNumber 按下按键的键码值
如果按键按下不放,程序会停留在此函数,松手一瞬间,返回按键键码,没有按键按下时,返回0
*/
unsigned char MatrixKey()
{
unsigned char KeyNumber=0;
P1=0xFF;
//选中第一列矩阵键盘
P1_3=0;
//按下按钮松开后,改变KeyNumber值,加延时避免代码耦合;
//第一列第一个
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_2=0;
//第二列第一个
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_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_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
#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);
// }
if(KeyNum!=0)
{
LCD_ShowNum(2,1,KeyNum,2);
}
}
}
其实就是一直循环,如果没有按键按下就返回0,加if判断是为了在下次循环时液晶屏不置0;
效果:
实际板子可能会有延迟
6-1矩阵键盘
743

被折叠的 条评论
为什么被折叠?



