1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 51单片机矩阵键盘——LCD1602显示

51单片机矩阵键盘——LCD1602显示

时间:2021-01-06 18:37:20

相关推荐

51单片机矩阵键盘——LCD1602显示

1.前言

本次的实验需要用到LCD1602液晶屏,需要用到LCD1602.c 与LCD1602.h文件链接:

/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按下.

注意:

P15口可能会一会给高一会给低;P15口会连接到进步电机(相当于驱动器,增加电流能力的),右边连接到BEEP; BEEF就连接到了蜂鸣器上开发板上的蜂鸣器一般为无源蜂鸣器,BEEP口以一定的频率高低变化那么蜂鸣器就会响,所以一般采用逐列扫描。这是引脚冲突造成的,开发板那么多外设,I/O口只有那么多,所以必有很多I/O口附庸在一起,造成外设之间的干扰。

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()//如果按键按下不放,程序会停留在此函数,松手的一瞬间,{//返回按键键码,没有按键按下时,返回0unsigned 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显示键码}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。