1.前言
本次的实验需要用到LCD1602液晶屏,需要用到LCD1602.c 与LCD1602.h文件链接:
https://download.csdn.net/download/YLG_lin/86404949
1.1 实验现象
使用矩阵键盘随意按下按键,LCD1602第二行前两位就会显示对应按键按下的数字。
1.2矩阵键盘介绍
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式
采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态
1.3工作原理
矩阵键盘扫描(输入扫描)
原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果
就以逐行扫描为例: 当给P17,P16,P15,P14赋值0111时P17被选中,读取P13,P12,P11,P10的值判断哪个按键被按下。如果S1按下了那么P13就等于0,如果S2按下了那么P12就等于0...
逐列扫描:当给P13,P12,P11,P10赋值0111时P13被选中,读取P17,P16,P15,P14的值判断哪个按键被按下。如果P17,P16,P15,P14为0111 则P17选中S1按下,如果P17,P16,P15,P14为1011,则S5按下.
注意:
文章来源:https://www.toymoban.com/news/detail-408273.html
P15口可能会一会给高一会给低;P15口会连接到进步电机(相当于驱动器,增加电流能力的),右边连接到BEEP; BEEF就连接到了蜂鸣器上开发板上的蜂鸣器一般为无源蜂鸣器,BEEP口以一定的频率高低变化那么蜂鸣器就会响,所以一般采用逐列扫描。这是引脚冲突造成的,开发板那么多外设,I/O口只有那么多,所以必有很多I/O口附庸在一起,造成外设之间的干扰。文章来源地址https://www.toymoban.com/news/detail-408273.html
2.程序/代码
2.1 MatrixKey.c
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
unsigned char MatrixKey()//如果按键按下不放,程序会停留在此函数,松手的一瞬间,
{ //返回按键键码,没有按键按下时,返回0
unsigned char KeyNumber=0;//KeyNumber 按下按键的键码值
P1=0xFF;
P1_3=0;
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;
}
2.2 MatrixKey.h
#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__
unsigned char MatrixKey();
void Delay(unsigned int xms);
#endif
2.3 main.c
#include <REGX52.h>
#include "LCD1602.h" //包含LCD1602头文件
#include "MatrixKey.h" //包含矩阵键盘头文件
unsigned char KeyNum;
void main()
{
LCD_Init(); //LCD初始化
LCD_ShowString(1,1,"MatrixKey:"); //LCD显示字符串
while(1)
{
KeyNum=MatrixKey(); //获取矩阵键盘键码
if(KeyNum) //如果有按键按下
{
LCD_ShowNum(2,1,KeyNum,2); //LCD显示键码
}
}
}
到了这里,关于51单片机矩阵键盘——LCD1602显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!