完整word版4X4键盘输入LCD1602输出.docx
《完整word版4X4键盘输入LCD1602输出.docx》由会员分享,可在线阅读,更多相关《完整word版4X4键盘输入LCD1602输出.docx(26页珍藏版)》请在冰豆网上搜索。
![完整word版4X4键盘输入LCD1602输出.docx](https://file1.bdocx.com/fileroot1/2023-5/19/cbdd86d2-302a-41c6-9a60-309566e77347/cbdd86d2-302a-41c6-9a60-309566e773471.gif)
完整word版4X4键盘输入LCD1602输出
物理与电信工程学院
专业课程设计报告
2018~2019学年第2学期
4*4矩形键盘输入,lcd1602显示
专业:
班级:
学号:
姓名:
指导教师姓名:
年月日
课程设计报告
【课题名称】4*4矩形键盘输入,lcd1602显示
【摘要】键盘输入与液晶显示系统是单片机应用中最常见的一种形式,几乎涉及到人们日常生产和生活中的各个方面.键盘是用于实现单片机应用系统中的数据和命令的输入,液晶显示器LCD能使人直观的获得需要了解的信息.实现人机的交流互动.本次课程设计作为实践教学的一个重要环节,以4*4矩阵键盘按键输入数据,以1602液晶显示.并使用Proteus软件对所设计的电路进行仿真,仿真结果是在1602液晶上显示所按下的键值。
因此,对液晶显示与键盘系统的研究与应用是很有必要的,对于我们今后的学习有着很强的推动作用.
【关键词】Proteus仿真,AT89C51,lcd1602,4*4矩阵键盘
一、引言
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS—51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。
[1][2]
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程.其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
lcd1602:
16字×2行的字符型液晶显示器显示模块可以与8位或4位微处理器直接接口,其内置式字符发生器ROM可提供160种符合工业标准的字符,包括全部英文大小写字母,阿拉伯数字,以及32个特殊字符或符号,其内置的RAM可以根据用户需要,由用户自行设计字符或符号,其指令系统为用户提供了方便的操作指令,点阵字符型液晶显示模块采用了+5V单电源供电,功耗低。
二、总体方案设计
单片机的P1口的P30~P3。
7连接4X4矩阵键盘,P00~P0.7连接lcd1602,当4X4矩阵键盘中的某一按键按下时,lcd1602上显示对应的键号。
例口,1号键按下时,数码管显示“1”;2号键按下时,数码管显示“2”等等。
根据矩阵式键盘的特点,进行键盘控制系统的整体研究与设计,LED实时显示按键信息,采用软伴扁程的方法实现按键信息的提职和显示。
电子技术应用方向,单片机应用。
可以实现两位数的输入,及修改.每位可以是1—f的任意位输人。
[2]
我们先读懂了书上的参考程序,掌握了LCD液晶显示器的功能及使用方法。
在此基础上,对源程序进行改编,加工,填入了能满足实验要求的子程序。
通过调用这些子程序,最终使我们的程序实现我们要求的功能。
我们对每个子程序进行了详细的分析和编写,在确定方案之后,我们对每个程序进行了单独的调试,并在综合起来之后进行了系统的仿真,解决意料之外的问题比如LCD的显示,4*4矩阵键盘触碰无反应问题等等,最终实现了基本的操作功能。
三、设计原理分析
AT89C52:
AT89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制.功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等.
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路.
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的
方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口.作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL).
与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.1/T2EX),
引脚号
功能特性
P1。
0
T2,时钟输出
P1.1
T2EX(定时/计数器2
表2-1P1。
0和P1.1的第二功能
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路.对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL).
在访问外部程序存储器或16位地数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据.在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。
Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3口是一组带有内部上拉电阻的8位双向I/O口.P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号.[3]
respack:
排阻接在51单片机的P0口,因为P0口内部没有上拉电阻,不能输出高电平,所以要接上拉电阻.排阻就是好多电阻连载一起,他们有一个公共端.1端为公共端接VCC或地,看是上拉还是下拉,其他接要操作的端口。
.
排阻通常都有一个公共端,在封装表面用一个小白点表示.其颜色通常为黑色或黄色。
排阻一般应用在数字电路上,比如:
作为某个并行口的上拉或者下拉电阻用。
使用排阻比用若干只固定电阻更方便。
[3]
Lcd1602:
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。
[4]
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
[5]
1602采用标准的16脚接口,其中:
第1引脚:
GND为电源地。
第2引脚:
VCC接5V电源正极.
第3引脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4引脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5引脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6引脚:
E(或EN)端为使能(enable)端,高电平
(1)时读取信息,负跳变时执行指令.
第7~14引脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
第15引脚背光正极,第16引脚背光负极.
四、具体电路实现
把一个多功能的复杂程序划分为若干简单的,功能单一的程序模块,各程序模块完成明确的任务,实现某个具体功能,再具体需要时调用相应的模块即可。
4、1.矩阵键盘
矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每一个交叉点上,设置一个按键。
这样键盘中按键的个数是4×4个。
这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。
图4—1矩阵键盘
4、2.AT89C52
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本.
图4—2AT89C52引脚图
4、3.LCD1602液晶
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号等,显示时模块把地址41H中的点阵字符图形显示出来,下图为功能令.
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
说明
清显示
0
0
0
0
0
0
0
0
0
1
将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H”
归位
0
0
0
0
0
0
0
0
1
*
设定DDRAM的地址计数器(AC)到"00H”,并且将游标移到开头原点位置;这个指令不改变DDRAM的内容
进入模式设置指令
0
0
0
0
0
0
0
1
I/D
S
I/D=1,光标或闪烁向右移动,AC增加1.I/D=0,光标或闪烁向左移动,AC减少1,S整个显示移动
显示开关控制指令
0
0
0
0
0
0
1
D
C
B
[D=1:
整体显示ON],[C=1:
游标ON],[B=1:
游标位置反白允许]
光标或显示移位指令
0
0
0
0
0
1
S/C
R/L
*
*
光标或显示移位指令可使光标或显示在没有读写数据的情况下,向左或向右移动,指令不改变DDRAM的内容
功能设定
0
0
0
0
1
DL
N
F
*
*
[DL=0/1:
4/8位数据],[N=0/1,单行/双行显示],[F=0/1,5*8/5*10点阵显示模式]
设置CGRAM地址
0
0
0
1
AC5
AC4
AC3
AC2
AC1
AC0
CGRAM地址设置指令设置CGRAM地址指针,
设定DDRAM地址
0
0
1
0
AC5
AC4
AC3
AC2
AC1
AC0
DDRAM地址设置指令设置DDRAM地址。
一行地址范围00H~4FH,两行DDRAM地址第一行00H~27H,第二行40H~67H,加上高2位,[一行:
80H-A7H],[二行:
C0H-E7H]
读忙标志和地址
0
1
BF
AC6
AC5
AC4
AC3
AC2
AC1
AC0
BF:
忙标志位,BF=1,模块正在进行内部操作,此时模块不接受任何外部指令和数据。
BF=0,模块可以接受外部的指令和数据;同时可以读出地址计数器(AC)的值。
写RAM指令
1
0
D7
D6
D5
D4
D3
D2
D1
D0
将数据D7-D0写入到内部的RAM(DDRAM/CGRAM/IRAM/GRAM),将用户自定义的字符写入CGRAM中,D7~D5为000,D4~D0为5点的字模数据
表4-1指令码
实验流程图如下
N
Y
五、总结和体会
通过了本次的课程设计,我们成功的将课堂上学习的知识通过软件仿真出来,通过运用课堂上学习到的分析元器件的方法,我们学会了LCD的使用。
我们也学会如何使用proteus和keil联合进行单片机系统的程序调试及仿真开发。
这些实践大大地加深了我们对单片机使用过程的理解,也让我们对单片机程序的编程更加熟悉。
虽然在这个过程中也遇到了一些无法预料到的的困难,但是经过学习和讨论,我们都将其一一克服。
总之,经过这次的研究性教学,我们不仅加深了Proteus仿真软件的了解和使用,还学到了许多课本上没有涉及知识,练习了电路原理图的设计和仿真运行,同时对本学期学习的单片机课程进行了一次全面的复习和巩固,收益很大。
【参考文献】
[1]赵嘉蔚,张家栋,霍凯,肖燕彩.单片机原理与接口技术。
清华大学出版社
[2]朱大奇,李念强。
单片机原理、接口及应用。
南京大学出版社
[3]胡汉才。
单片机原理及其接口技术(第二版)。
清华大学出版社
[4]张家田。
液晶显示器件应用技术.机械工业出版社,
[5]刘法治。
常用电子元器件及典型芯片的应用技术。
机械工业出版社
【附件】实验程序:
#include〈REG51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P2^4;
sbitlcden=P2^5;
sbitsetting=P3^0;
ucharlocation=0;
ucharnum,NUM1;
charKEY;
ucharcodetable[]="DISPLAY”;
ucharcodetable1[]="";
unsignedcharcodea[]={0xFE,0xFD,0xFB,0xF7};
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y-—);
}
voidwrite_com(ucharcom)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_date(uchardate)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num〈12;num++)
{
write_date(table1[num]);
delay(5);
}
write_com(0x80);
write_date(’');
}
unsignedcharcoding(unsignedcharm)
{
unsignedchark;
switch(m)
{
case(0x18):
k='f';break;
case(0x28):
k=’e';break;
case(0x48):
k='d';break;
case(0x88):
k=’c’;break;
case(0x14):
k=’b';break;
case(0x24):
k='a’;break;
case(0x44):
k='9’;break;
case(0x84):
k=’8';break;
case(0x12):
k='7’;break;
case(0x22):
k=’6';break;
case(0x42):
k='5’;break;
case(0x82):
k=’4';break;
case(0x11):
k='3';break;
case(0x21):
k=’2’;break;
case(0x41):
k=’1';break;
case(0x81):
k='0';break;
}
return(k);
}
//=====================按键检测并返回按键值==========================
unsignedcharkeynum(void)
{
unsignedcharrow,col,i;
P1=0xf0;
setting=1;
if((P1&0xf0)!
=0xf0)
{
delay(20);
if((P1&0xf0)!
=0xf0)
{
row=P1^0xf0;//确定行线
i=0;
P1=a[i];//精确定位
while(i<4)
{
if((P1&0xf0)!
=0xf0)
{
col=~(P1&0xff);//确定列线
break;//已定位后提前退出
}
else
{
i++;
P1=a[i];
}
}
}
else
{
return0;
}
while((P1&0xf0)!
=0xf0);
return(row|col);//行线与列线组合后返回
}
elseif(setting==0)
{
delay(150);
if(setting==0)
{
if(location==0)
{
write_com(0x0f);//开闪烁
write_com(0x80+0x46);
}
elseif(location==1)
{
write_com(0x0f);//开闪烁
write_com(0x80+0x47);
}
elseif(location==2)
{
write_com(0x80+0x47);
write_com(0x0c);//开闪烁
}
location++;
if(location〉=3)
location=0;
}
return0;
}
else
return0;//无键按下时返回0
}
voidmain(void)
{
init();
while
(1)
{
KEY=keynum();
if(KEY!
=0)
{
NUM1=coding(KEY);
if(location==1)
{
write_com(0x80+0x46);
write_date(NUM1);
write_com(0x80+0x46);
}
elseif(location==2)
{
write_com(0x80+0x47);
write_date(NUM1);
write_com(0x80+0x47);
}
}
}
}
仿真图: