1602键盘显示.docx
《1602键盘显示.docx》由会员分享,可在线阅读,更多相关《1602键盘显示.docx(38页珍藏版)》请在冰豆网上搜索。
![1602键盘显示.docx](https://file1.bdocx.com/fileroot1/2023-5/23/f1a6c19e-2aa7-4ad6-b015-59c12b9c5d4f/f1a6c19e-2aa7-4ad6-b015-59c12b9c5d4f1.gif)
1602键盘显示
摘要
在日常生活中,我们经常要通过按键来实现对电子装置的控制,小到手表手机,中到电视电脑,大到各种复杂仪器,都需要通过按键来实现各种操作。
本次课程设计作为实践教学的一个重要环节,将以按键控制显示为主题,以1602液晶、MM74C922解码芯片、AT89C52单片机及其接口芯片为核心构造一个键盘控制显示系统,并使用Proteus软件对所设计的电路进行仿真,仿真结果是在1602液晶上显示所按下的键值。
关键词:
Proteus仿真AT89C521602液晶MM74C922解码芯片
第一章总体设计
1.1电路结构分析
本次设计的目标为单片机控制的键盘识别显示系统,主要采用AT89C52单片机作为核心,由矩阵键盘电路、译码芯片、液晶显示等模块构成,分别对按键信息和显示电路以及软、硬件各个部分进行控制;本设计采用C言编程来实现对单片机的控制。
实际运作时,单片机会将检测到的按键信号转换成数字,显示于1602液晶上。
系统主要结构可以拆分如下:
①矩阵键盘:
按键传送输入信息;此键盘采用的是4X4矩阵键盘,能输入0~9,+,—,=,空格,返回,清零。
②键盘识别:
矩阵键盘连接的是MM74C922解码芯片,通过解码芯片来识别输入的按键位置。
③AT89C52:
采用软件编程来实现按键信息的提取和转换;
④1602液晶:
用于显示最终被单片机转换过的按键信息。
由以上构思可以设计此按键显示电路。
1.2总体方案设计
总体电路原理框图:
如图1.2所示
图1.2总体电路原理方框图
本次设计分两步来完成,第一步,解码芯片调试系统,将解码芯片接口连接到矩阵键盘作为AT89C52单片机的输入装置,然后以P2口作为输出端并连接一个数码管观察输出结果。
第二步,1602的液晶调试系统,此过程就是将数码管换成1602液晶在进行结果显示。
1.3蜂鸣器模块设计
蜂鸣器模块设计如图1.3所示
图1.3蜂鸣器模块电路图
蜂鸣器的驱动电流比较大一般要500MA~1000MA,所以不能直接接在AT82C52单片机的接口上,需要加一个三极管来进行驱动。
发声源程序如下:
#defineBEEP()P1^=0x80//蜂鸣器定义
voidSounder()//发生函数
{
INT8Ui;
for(i=0;i<100;i++)
{
delay(3);BEEP();
}
}
1.4电路图设计
1.4.1解码芯片调试系统电路图如图1.3.1所示:
图1.4.1解码芯片调试系统电路图
此电路图为解码芯片调试系统电路图,按键位置是由解码芯片进行识别。
当按下K0键时,解码芯片进行采集DCBA端输出0000,表示第一个键按下,OA允许输出端为高电平有效,此时蜂鸣器发声提示,数码管则显示0。
K9键按下时,解码芯片DCBA端输出0008,表示第九个键按下,OA允许输出端为高电平有效,此时蜂鸣器发声提示,数码管则显示9。
KF键按下时,解码芯片DCBA端输出0015示第九个键按下,OA允许输出端为高电平有效,此时蜂鸣器发声提示,数码管则显示F。
仿真结果能完成上述功能,则证明调试成功。
1.4.2总体电路图如图1.3.2所示
图1.4.2总体电路图
此电路为总体电路图设计,当有键按下时,解码芯片会对按键进行识别,并发送相应的代码到P3口,此时蜂鸣器发声提示,经过单片机的处理,按键的值会在1602液晶上进行显示。
如果仿真结果能完成上述功能,则证明调试成功。
第二章硬件电路
2.1MM74C922解码芯片
2.1.1MM74C922特点及引脚功能
MM74C922具有下列特点:
1.功耗低,电压3—5V;2.三态门输出,与LPTTL兼容;3.输出锁存按下的最后的键;4.用一个电容器就可以消除键盘抖动;5.两键轮回;6.行具有上拉功能;7.具有芯片内或芯片外时钟;8.最大开关电阻为50KΩ。
MM74C922采用18脚双列直插封装,其引脚排列如图2.1.1所示。
各引脚功能如下:
Y1—Y4为行键输入端;X1—X4为列键输入端;OSC为振荡器的外接引线端,可用外部的输入脉冲或电容器;DA—DD为数据输出端,可与微机直接接口;KBM为键颤屏蔽端;_____OE为数据输出允许端,低电平有效;DAV为数据输出有效,高电平有效;VCC为电源端,接3—5V;GND为接地端。
Y1VCC
Y2DA
Y3DB
Y4DC
OSCDD
KBM—OE
X3DAV
X4X1
GNDX2
图2.1.1MM74C922引脚排列图
2.1.2MM74C92真值表如表2.1.2所示
表2.1.2MM74C922真值表
开关位置
数据输出
开关位置
数据输出
DCBA
DCBA
0(Y1X1)
0000
8(Y3X1)
1000
1(Y1X2)
0001
9(Y3X2)
1001
2(Y1X3)
0010
10(Y3X3)
1010
3(Y1X4)
0011
11(Y3X4)
1011
4(Y2X1)
0100
12(Y4X1)
1100
5(Y2X2)
0101
13(Y4X2)
1101
6(Y2X3)
0110
14(Y4X3)
1110
7(Y2X4)
0111
15(Y4X4)
1111
键盘扫描可采用外部时钟或外接电容来执行。
译码器具有芯片的上拉电阻,使开关电阻可以高达50kΩ。
开关矩阵中不需要二极管就可以消除多重开关,内部消颤电路仅需要一个单一电容就可以实现。
当有键按下时,数据输出有效为高电平;当键释放后,数据输出有效返回到低电平。
即使有另外一个键按下,在正常消颤期间后,数据输出有效返回至高电平表明接受新的键输入。
在任何两个开关之间备有两键轮回功能。
即使某一键释放,内部锁存器仍然锁存住按下的最后的键值。
三态门输出便于总线的扩展和运行。
2.21602液晶
2.2.11602液晶功能引脚如图2.2.1所示
图2.2.11602液晶功能引脚
2.2.2液晶命令集及双行液晶DDRAM地址如表2.2.2所示
表2.2.2液晶命令集及双行液晶DDRAM地址
命令
命令位
功能
RS
R/W
DB7~DB0
复位显示器
0
0
0
0
0
0
0
0
0
1
清屏,光标归位
光标归位
0
0
0
0
0
0
0
0
1
*
设地址计数器清零,DDRAM数据不变,光标移动到左上角
字符进入模式
0
0
0
0
0
0
0
1
I/D
S
设置字符进入时的屏幕移位方式
显示开关
0
0
0
0
0
0
1
D
C
B
设置显示开关,光标开关,闪烁开关
显示光移位
0
0
0
0
0
1
S/C
R/L
*
*
设置字符与光标移动
功能设置
0
0
0
0
1
DL
N
F
*
*
设置DL,显示行数,字体
设置CGRAM地址
0
0
0
1
CGRAM地址
设置6位的CGRAM地址值以读/写数据
设置DDRAM
地址
0
0
1
DDRAM地址
设置7位的CGRAM地址值以读/写数据
命令
命令位
功能
RS
R/W
DB7~DB0
忙标志/地址计数器
0
1
BF
由最后写入的DDRAM或CGRAM地址设置指令设置的DDRAM/CGRAM地址
读忙标志及地址计数器
CGRAM/DDRAM写数据
1
0
写入——字节数据(先设置RAM地址)
向CGRAM/DDRAM写入——字节数据
CGRAM/DDRAM读数据
1
1
读取——字节数据(先设置RAM地址)
从CGRAM/DDRAM读取——字节数据
RS为寄存器选择位RS=0时选择命令寄存/状态寄存器,RS=1时选择数据寄存器
I/D=1递增,I/D=0递减
S=0时显示屏不移动,S=1时,如果I/D=1且有字符写入时显示屏左移,否则右移
D=1显示屏开开,D=0显示屏关
C=1时光标处现在地址计数器所指的位置,C=0时光标不出现
B=1时光标出现闪烁,B=0光标不闪烁
S/C=0时,RL=0则光标左移,否则右移
S/C=1时,RL=0则字符和光标左移,否则右移
DL=1时数据长度为8位,DL=0时为使用D7~D4共4位,分两次发送一个字节
N=0为单行显示,N=1时为双行显示
F=1时为5x10点阵字体,F=0时为5x7点阵字体
BF=1时LCD忙,BF=0时LCD就绪
双行液晶的DDRAM地址
2x20LCDDDRAM(80~93/C0~E3)
2x16LCDDDRAM(80~8F/C0~CF)
2x8LCDDDRAM(80~87/C0~C7)
80
81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
C0
C1
C2
C3
C4
C5
C6
C7
C8
C9
CA
CB
CC
CD
CE
DF
D0
D1
D2
D3
2.2.3基本操作时序
1).读状态:
输入:
RS=L,W=H,E=H输出:
DB0~DB7=状态
2)写指令:
输入:
RS=L,RW=L,DB0~DB7=指令码,E=高脉冲
输出:
无
3)读数据:
输入:
RS=H,RW=H,E=H输出:
DB0~DB7数据
4)写数据:
输入:
RS=H,RW=L,DB0~DB7数据,E=高脉冲
输出:
无
2.2.3初始化过程
1)延时15ms
2)写指令38H(不检测忙信号)
3)延时5ms
4)写指令38H(不检测忙信号)
5)延时5ms
6)写指令38H(不检测忙信号)
7)(以后每次写指令、读/写数据操作之前均需检测忙信号)
8)写指令38H:
显示模式设置
9)写指令08H:
显示关闭
10)写指令01H:
显示清屏
11)写指令06H:
显示光标移动设置
12)写指令0CH:
显示开及光标设置
2.2.3读操作时序
读操作时序如图2.2.4所示
图2.2.4读操作时序
读操作程序如下:
voidRead_LCD_Command(INT8Ucmd)//读命令
{
LCD_BUSY_WAIT();
RS_0();
RW_0();
P2=cmd;
delay(5);
EN_1();
EN_0();
}
voidRead_LCD_Data(INT8Udat)//读数据
{
LCD_BUSY_WAIT();
RS_1();
RW_0();
P2=dat;
delay(5);
EN_1();
EN_0();
}
2.2.5写操作时序
写操作时序图如图2.2.5
图2.2.5写操作时序图
写操作程序如下:
voidWrite_LCD_Command(INT8Ucmd)//写命令
{
LCD_BUSY_WAIT();
RS_0();
RW_0();
P2=cmd;
delay(3);
EN_1();
EN_0();
}
voidWrite_LCD_Data(INT8Udat)//写数据
{
LCD_BUSY_WAIT();
RS_1();
RW_0();
P2=dat;
delay(3);
EN_1();
EN_0();
}
2.3AT89C52单片机
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
实际引脚连线的部分如图2.3
图2.3AT89C52单片机
2.4数码管
译码电路中常用的显示器有LED(数码管)和LCD(液晶显示器)。
这两种显示器都具有线路简单、耗电少、成本低、寿命长等优点。
本系统输出结果选用1个七段数码管显示。
数码管有共阴共阳之分,本系统采用共阴型。
LED的外形结构如图2.4,外部有10个引脚,其中GND脚为公共端也称位选端,其余8个引脚称为段选端,当要使某一位数码管显示某一数字((0-9中的一个)必须在这个数码管的段选端加上与数字显示数字对应的8位段选码(也称字形码),在位选端加上低电平即可。
图2.4LED数码管结构
如下表2.4即两种数码管中数字显示对应的段码:
表2.4LED显示段码
字型
共阳极段
共阴极段
字型
共阳极段
共阴极段
0
C0H
3FH
9
90H
6FH
1
F9H
06H
A
88H
77H
2
A4H
5BH
B
83H
7CH
3
B0H
4FH
C
C6H
39H
4
99H
66H
D
A1H
5EH
5
92H
6DH
E
86H
79H
6
82H
7DH
F
84H
71H
7
F8H
07H
空白
FFH
00H
8
80H
7FH
P
8CH
73H
第三章解码芯片调试系统
3.1解码芯片调试系统的4X4矩阵键盘设计,接线图如3.1所示
图3.1解码芯片调试系统的4X4矩阵键盘设计电路图
3.2解码芯片的接口设计,如图3.2所示
解码芯片的A、B、C、D口接P1.0~P1.4,OE口接地始终保持拉低,OA口接P1.7发送允许信号,X1~X4,Y1~Y4,分别与矩阵键盘的X,Y端口相接。
图3.2解码芯片接口设计电路图
3.3数码管的接口设计,如图3.3所示
数码管的a~g端接在P2.0~P2.7端作为输出显示
图3.3数码管的接口设计电路图
3.4解码芯片软件流程图
解码芯片软件流程图如图3.4所示
图3.4解码芯片调试系统软件流程图
3.5解码芯片调试系统源程序代码
#include
#defineINT8Uunsignedchar
#defineINT16Uunsignedint
#defineBEEP()P3^=0x80//蜂鸣器定义
#defineKey_Pressed((P1&0X80)==0X80)//判断是否有键按下
#defineKey_NO(P1&0X0F)//判断键值
INT8UcodeSEG_CODE[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
voiddelay(INT16Ums)//延时程序
{
INT8Ui,j;
for(i=0;i{
for(j=0;j<110;j++);
}
}
voidSounder()//蜂鸣器
{
INT8Ui;
for(i=0;i<100;i++)
{
delay(5);BEEP();
}
}
voidmain()
{
P1=0XFF;
P0=0x00;
P2=0X00;
P3=0XFF;
while
(1)
{
if(Key_Pressed)
{
P2=SEG_CODE[Key_NO];//显示键值
Sounder();
}
}
}
此程序可以完成4X4矩阵键盘上任意键的显示即0~F的先显示,当有按键按下时,蜂鸣器会进行按键提示。
3.6解码芯片调试系统仿真分析
图3.6.10显示图
当按下K0键时,数码管显示结果
图3.6.29显示图
当按下K9按键时,数码管显示的结果
图3.6.3F显示图
当按下KF按键时,数码管显示的结果
第四章1602液晶显示系统
4.11602液晶显示的4x4矩阵键盘设计,如图4.1
图4.11602液晶显示系统的4x4矩阵键盘设计
因为1602液晶远远比数码管的功能强大,可以显示更多符号,所此键盘设计不仅保留了0~9个数字而且还加入了“+-=空格撤销清屏”等操作。
解码芯片的连线设计和图3.2一样在此不再重复。
4.21602液晶显示系统接口电路图设计如图4.2所示
图4.21602液晶显示系统接口电路图
1602液晶的D0~D7引脚接在P2.0~P2.7口,RS、RW、E、引脚则分别接在P1.0、P1.1、P1.2口。
4.31602液晶显示系统软件流程图
1602液晶显示软件流程图如图4.3
图4.31602液晶显示系统软件流程图
4.41602液晶显示系统的源程序代码
#include
#include
#defineINT8Uunsignedchar
#defineINT16Uunsignedint
#defineBEEP()P1^=0x80//蜂鸣器定义
#defineKey_Pressed()((P3&0X10)!
=0x00)//判断是否有键按下
#defineKey_NO(P3&0X0F)//获取键值
#defineRS_1()RS=1
#defineRS_0()RS=0
#defineRW_1()RW=1
#defineRW_0()RW=0
#defineEN_1()EN=1
#defineEN_0()EN=0
sbitRS=P1^0;//寄存器选择
sbitRW=P1^1;//读/写
sbitEN=P1^2;//使能
externvoidInitialize_LCD();//液晶初始化
externvoidLCD_ShowString(INT8Ux,INT8Uy,char*str);//字符串显示
charcodeCHAR_Table[]="0123456789+-=";//定义键值
charDisp_String[17];
voiddelay(INT16Ums)//延时函数
{
INT8Ui,j;
for(i=0;i{
for(j=0;j<110;j++);
}
}
voidSounder()//发生函数
{
INT8Ui;
for(i=0;i<100;i++)
{
delay(3);BEEP();
}
}
voidLCD_BUSY_WAIT()//忙等待
{
INT16Ui;
RS_0();
RW_1();
P2=0X00;
EN_1();
delay(3);
for(i=0;i<20;i++)
{
if((P2&0x80)==0)//D7=0表示LCD控制器空闲,则退出检测
break;
}
EN_0();
P2=0XFF;
}
voidWrite_LCD_Command(INT8Ucmd)//写命令寄存器
{
LCD_BUSY_WAIT();
RS_0();
RW_0();
P2=cmd;
//delay(5);
EN_1();
EN_0();
}
voidWrite_LCD_Data(INT8Udat)//写数据寄存器
{
LCD_BUSY_WAIT();
RS_1();
RW_0();
P2=dat;
//delay(5);
EN_1();
EN_0();
}
voidInitialize_LCD()//初始化
{
Write_LCD_Command(0X38);//置功能;8位,双行,5x7
Write_LCD_Command(0X01);//清屏
Write_LCD_Command(0X06);//自负进入模式:
屏幕不动,字符后移
Write_LCD_Command(0X0C);//显示开,关光标
}
voidLCD_ShowString(INT8Ux,INT8Uy,char*str)//显示函数
{
INT8Ui=0;
if(y==0)Write_LCD_Command(0x80|x);else
if(y==1)Write_LCD_Command(0xC0|x);
for(i=0;i<16&&str[i]!
='\0';i++)
Write_LCD_Data(str[i]);
}
voidmain()
{
charc;
INT8UsLen;
P1=0x00;
//P3=0x00;
P3=0xFF;
Initialize_LCD();
LCD_ShowString(0,0,"--08101.lb.20--");
while
(1)
{
if(Key_Pressed())
{
sLen=strlen(Disp_String);
if(Key_NO<=0x0D)//处理0x00~0x0D
{Sounder();
c=CHAR_Table[Key_NO];
if(sLen<16)
{
Disp_String[sLen]=c;
Disp_String[sLen+1]='\0';
}
}
else//处理按键0x0E,0x0F(退格和清除)
{
switch(Key_NO)
{
case0x0E:
if(sLen>0)Disp_String[sLen-1]='\0';
Sounder();
break;
case0x0F:
Disp_String[0]='\0';
Sounder();
break;
}
}
LCD_ShowString(0,1,"");
LCD_ShowString(0