基于单片机AT89C52的LCD设计说明Word文档格式.docx
《基于单片机AT89C52的LCD设计说明Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机AT89C52的LCD设计说明Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
128*64点阵LCD的图形显示Proteus仿真电路图
三、硬件模块功能介绍
3.1单片机(AT89C52)功能介绍
AT89C52主要提供以下性能:
1、与MCS_51单片机产品兼容
2、8K字节在系统可编程Flash闪速存储器
3、1000次擦写周期
4、全静态操作:
0HZ~33HZ
5、三级加密程序存储器
6、32个I/O口线
7、三个16位定时器/计数器
8、八个中断源
9、全双工UART串行通道
10、低功耗空闲和掉电模式
11、掉电后可唤醒
12、看门狗定时器
13、双数据指针
其功能特性描述:
256字节内部RAM,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口。
它的内部集成了4个可编程的并行I/O接口(P0~P3),每个接口电路都具有锁存器和驱动器,输入接口电路具有三态门控制。
P0~P3口同RAM统一编址,可以当作特殊功能寄存器SFR来寻址。
在实际应用中P0~3口在开机或复位时均呈高电平,本设计主要接P0口,P0口是一个8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑电平,对端口P0写“1”时,引脚可作为高阻抗输入端用,当访问外部程序和数据存储器时,P0口线分时转换地址(低8位)和数据总线复用,在这种模式下,P0具有内部上拉电阻。
在程序校验时,输出指令字节,程序校验时,需要外部上拉电阻。
(如图)
AT89C52原理图
3.2液晶显示器LCD(128*64点阵图形型)功能介绍
点阵图形型是在一平板上排列多行多列的矩阵式的晶格点,点的大小可根据显示清晰度来设计,可显示数字、字母、汉字、图像、甚至动画。
以AMPIRE128*64为例来说明LCD128*64接口应用。
AMPIRE128*64内置KS0108型图形液晶模块驱动,其引脚功能如表所示
LCD128*64引脚功能表
引脚号
引脚名称
电平
引脚功能描述
1
CS1/CS2
H/L
片选信号,芯片1/芯片2控制液晶左半屏/右半屏
2
GND
0v
电源地
3
Vcc
+5v
电源正
4
V0
—
对比度(亮度)调整
5
RS
RS=”H”,表示DB7~DB0为显示数据
RS=”L”,表示DB7~DB0为显示指令数据
6
R/W
R/W=”H”,E=”H”,数据被读到DB7~DB
R/W=”H”,E=”H→L”,DB7~DB0的数据被写到IR或DR
7
E
使能信号
8
DB0~DB7
三态数据线
9
RST
复位端,低电平有效
10
Vout
LCD驱动电压
KS0108控制器指令功能如表所示
指令名称
控制状态
指令代码
D7
D6
D5
D4
D3
D2
D1
D0
显示开关设置
D
显示起始行设置
L5
L4
L3
L2
L1
L0
页面地址设置
P2
P1
P0
列地址设置
C5
C4
C3
C2
C1
C0
读取状态设置
BUSY
ON/OFF
RESET
写显示数据
数据
读显示数据
KS0108控制器指令功能表
指令功能具体分析:
①读状态字格式:
BUSY=1:
表示KS0108正在处理计算机发来的指令或数据。
此时接口电路被封锁,不能接受除读状态字以外的任何操作。
BUSY=0表示KS0108接口控制电路已处于“准备好”状态,等待计算机的访问。
ON/OFF:
表示当前的显示状态。
ON/OFF=1表示关显示状态;
ON/OFF=0表示开显示状态。
RESET:
表示当前KS0108的工作状态,即反映RST端的电平状态。
当RST为低电平状态时,KS0108处于复位工作状态,RESET=1。
当RST为高电平状态时,KS0108为正常工作状态,RESET=0。
在占领设置和数据读写时要注意状态字中的BUSY标志。
只有在BUSY=0时,计算机对KS0108的操作才能有效。
因此计算机在每次对KS0108操作之前,都要读出来状态字判断BUSY是否为“0”,若不为“0”,则计算机需要等待,直至BUSY=0为止。
②显示开关格式:
该指令设置显示开关/触发器的状态,由此控制显示数据锁存器正常工作,从而控制显示状态。
D位为显示开/关的控制位。
当D=1为显示设置,显示数据锁存器正常工作,显示屏上呈现所需结果。
此时在状态字中ON/OFF=0。
当D=0为关显示设置,显示数据锁存器被清0,显示屏上不显示状态,但显示存储器并没有被破坏,在状态组中ON/OFF=1。
③显示起始行设置格式:
该指令设置了显示起始行寄存器的内容。
KS0108有64行显示的管理能力,该指令中L5~L0为显示起始行的地址,取值在0~3FH(1~64)范围内,它规定了显示屏上最顶一行所对应的显示存储器的行地址。
如果定时间隔地,等间距地修改(如加一或减一)显示起始行寄存器的内容,则显示屏将呈现显示内容向上或向下平滑滚动的显示效果。
④页面地址设置格式:
该指令设置了页面地址→X地址寄存器的内容。
KS0108将显示寄存器分成了8页,指令代码中P2~P0就是要确定当前所要选择的页面地址,取值范围为0~7H,代表第1~8页。
该指令规定了以后的读/写操作将在哪一个页面上进行。
⑤列地址设置格式:
该指令设置了Y地址计数器的内容,C5~C0=0~3FH(1~64)代表某一页面上的某一单元地址,随后的一次读或写数据将在这个单元上进行。
Y地址计数器具有自动加一功能,在每一次读/写数据后它将自动加一,所以在连续进行读/写数据时,Y地址计数器不必每次都设置一次。
页面地址的设置和列地址的设置将显示存储器单元唯一地确定下来,为后来的显示数据的读/写作了地址的选通。
⑥写显示数据该操作将8位数据写入先前已确定的显示存储器的单元内,操作完成后列地址计数器自动加一。
⑦读显示数据该操作将KS0108接口部的输出寄存器内容读出,然后列地址计数器自动加一。
AMPIRE128*64LCD
3.3锁存器(74HC373)功能介绍
常用的8D锁存器,常用作地址锁存和I/O输出,可以用74HC373,74HC373是高速CMOS器件,有三态输出的八D透明锁存器,共有54/74S373和54/74LS373两种线路,373的输出端O0~O7可直接与总线相连。
当三态允许控制端OE为低电平时,O0~O7为正常逻辑状态,可用来驱动或总线。
当OE为高电平时,O0~O7呈高阻态,既不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。
当锁存器允许端LE为高电平时,O随数据D而变。
当LE为低电平时,O被锁存在已建立的数据电平。
当LE端施密特触发器的输入滞后作用,使交流和直流噪声抗扰度被改善400mV。
74HC373原理图
3.4与门(74HC00)功能介绍
与门又称“与电路”。
执行“与”预算的基本门电路。
有几个输入端,只有一个输出端。
当所有的输入同时为“1”时,输出才为“1”电平,否者输出为“0”电平。
与的含义是:
只有当决定一件事情的所有条件都具备时,这个事件才会发生。
逻辑与也称逻辑乘。
74HC00是一款高速CMOS器件,实现了2输入与非门功能。
与门表达式:
F=A·
B
“与”门用“AND”表示
A
Z
四、软件设计
4.1代码附录
typedefunsignedintuint;
#include<
reg52.h>
#defineLLCD_CMD_WRPBYTE[0x10]//LCD左半部分写命令rs=0wr=0
#defineLLCD_CMD_RDPBYTE[0x11]//读命令rs=0wr=1
#defineLLCD_DATA_WRPBYTE[0x12]//写数据rs=1wr=0
#defineLLCD_DATA_RDPBYTE[0x13]//读数据rs=1wr=1
#defineRLCD_CMD_WRPBYTE[0x20]//LCD右半部分的读写命令
#defineRLCD_CMD_RDPBYTE[0x21]
#defineRLCD_DATA_WRPBYTE[0x22]
#defineRLCD_DATA_RDPBYTE[0x23]
sbitbusy=P0^7;
codeucharhanzi[]={
0x00,0x00,0x40,0x88,0x18,0x30,0xA0,0xA0,0xA0,0x90,0x10,0xF0,0x10,0x10,0x10
0x00,0x00,0x00,0x00,0x30,0x0C,0x00,0x03,0x02,0x02,0x03,0xC0,0x7F,0x00,0x00
0x00,0x00,/*"
河"
*/
0x00,0x00,0x00,0x00,0x00,0x20,0x20,0xF0,0x2C,0x10,0x90,0x80,0x80,0x80,0x00
0x00,0x00,0x00,0x01,0x7F,0x01,0x15,0x17,0x7C,0x0B,0x09,0x08,0xC0,0xE0,0x1F
南"
0x00,0x00,0x20,0x20,0xE0,0x20,0x70,0x90,0x10,0xF0,0x48,0x08,0xF8,0x10,0x00
0x00,0x00,0x00,0x20,0x11,0x1F,0x89,0x81,0x83,0x52,0x7F,0x4A,0x4A,0x41,0x40
0x40,0x00,/*"
理"
0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x20,0xE0,0x20,0x20,0x20,0x00,0x00,0x00
0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x10,0x1F,0x10,0x10,0x10,0x10,0x10
0x10,0x00,/*"
工"
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x00,0x00
0x00,0x00,0x00,0x00,0x41,0x41,0x21,0x1D,0x07,0x08,0x10,0x60,0x40,0x40,0x40
大"
0x00,0x00,0x80,0x60,0x48,0x50,0x40,0x58,0xA0,0x30,0x2C,0xA0,0x60,0x40,0x00
0x00,0x00,0x00,0x09,0x08,0x08,0x09,0x85,0x85,0x7E,0x05,0x04,0x04,0x04,0x04
0x00,0x00/*"
学"
};
voidlcd_cmd_wr(ucharcmdcode,ucharright);
voidlcd_data_wr(ucharldata,ucharright);
voidlcd_busy_rd(ucharright);
voidlcd_hanzi_wr(ucharposx,ucharposy,uchar*hanzi);
voidlcd_str_wr(ucharrow,ucharcol,ucharn,uchar*str);
voidlcd_rol();
voidlcd_init();
voiddelay(uintnms);
voidmain()
{
lcd_init();
lcd_str_wr(1,1,6,hanzi1);
delay(100);
while
(1)
lcd_rol();
delay(1000);
}
}
voidlcd_cmd_wr(ucharcmdcode,ucharright)//写指令
lcd_busy_rd(right);
if(right==1)//right==1时,对右半部进行读/写
{RLCD_CMD_WR=cmdcode;
else
{LLCD_CMD_WR=cmdcode;
}//否者写左半部LCD
voidlcd_data_wr(ucharldata,ucharright)//对LCD进行数据读/写
{lcd_busy_rd(right);
if(right==1)
{RLCD_DATA_WR=ldata;
{LLCD_DATA_WR=ldata;
voidlcd_busy_rd(ucharright)//检测LCD忙
{if(right==1)
{RLCD_CMD_RD;
{LLCD_CMD_RD;
while(busy);
voiddelay(uintnms)//延时程序
{uinti;
for(;
nms>
0;
nms--)
for(i=0;
i<
500;
i++);
voidlcd_init(void)//LCD初始化
{uintk;
lcd_cmd_wr(0x3e+1,0);
lcd_cmd_wr(0xc0+0,0);
lcd_cmd_wr(0xb8+0,0);
lcd_cmd_wr(0x40+0,0);
lcd_cmd_wr(0x3e+1,1);
lcd_cmd_wr(0xc0+0,1);
lcd_cmd_wr(0x40+0,1);
lcd_cmd_wr(0xb8+0,1);
for(k=0;
k<
256;
k++)
{lcd_data_wr(0x00,0);
lcd_data_wr(0x00,1);
lcd_cmd_wr(0xb8+4,0);
lcd_cmd_wr(0xb8+4,1);
voidlcd_hanzi_wr(ucharposx,ucharposy,uchar*hanzi)
{uchari;
if(posy<
4)
{lcd_cmd_wr(0xb8+2*posy,0);
lcd_cmd_wr(0x40+16*posy,0);
16;
i++)
{lcd_data_wr(hanzi[i],0);
else//否者在右半部写
{lcd_cmd_wr(0xb8+posy*2,1);
lcd_cmd_wr(0x40+16*(posy-4),1);
{lcd_data_wr(hanzi[i],1);
lcd_cmd_wr(0xb8+posy*2+1,1);
for(i=16;
32;
voidlcd_str_wr(ucharrow,ucharcol,ucharn,uchar*str)//输出方式
n;
{if(col>
7)
{row++;
col=col-8;
lcd_hanzi_wr(row,col,str+i*32);
col++;
}}
voidlcd_rol(void)
64;
{lcd_cmd_wr(0xc0+i,0);
lcd_cmd_wr(0xc0+i,1);
delay(10);
4.2Proteus软件介绍
系统仿真用到了ProteusISIS(电路分析与实物仿真软件)软件,可通过仿真显示出所设计系统的功能,对于程序的调试等有很大的帮助。
它可以分析各种模拟器件和集成电路。
特点是:
①实现了单片机仿真和SPICE电路仿真相结合。
②支持主流单片机系统的仿真。
③提供软件调试功能。
④具有强大的原理图绘制功能。
原理图的工作界面及绘制如图
ProteusISIS的工作界面及原理图绘制
4.3KeilC51软件介绍
Keil软件是目前最流行开发单片机的软件,其项目开发流程与其他软件开发项目的流程类似,即:
1.创建一个项目,从器件库中选择目标器件,配置工具设置;
2.用C或汇编语言创建源程序;
3.用项目管理器生成应用程序文件;
4.修改源程序中的错误;
5.测试连接应用。
它的集成编译环境是uVision4,它把C51、A51、BL51等在内的编译、汇编、定位链接、库、转换和模拟等软件集成在一个环境下,开发人员不必分别熟悉和使用这些软件的命令规则,支持所有的数据类型,在直接修改、编译、调试源程序,错误指令定位。
支持项目管理功能强大的观察窗口,用于对程序的调试和编辑。
其界面如下:
创建源文件对话框
4.4Proteus与KeilC相结合的设计
打开Keil程序,执行菜单命令Project→NewProject创建“LCD”项目,并选择单片机型号为AT89C52。
执行菜单命令File→New创建文件,输入C语言源程序,保存为“LCD.C”在ProjectWorkspace项目管理窗口中,右击SourceGroup1,选择AddFiletoGroup’Source,将源程序“LCD.C”添加到项目中。
在ProjectWorkspace项目管理窗口中,选中Target1,执行菜单命令ProjectProject→OptionsforTarget’Target1’,在弹出的对话框中选择Output选项卡,选中CreatHEXFile。
关闭对话框,执行菜单命令Project→Rebuildalltargetfiles,或直接单击工具栏中的
图标,编译所有的目标文件,生成“LCD.HEX”。
切换到工作界面到ProteusISIS的点阵液晶显示器LCD仿真电路,在AT89C52元件上双击鼠标左键或点击右键再单击左键打开EditComponent对话框。
设置ProgramFile为“LCD.HEX”,ClockFrequency为12MHZ,单击OK关闭对话框。
单击仿真运行开始按钮
,就可以显示“河南理工大学”六个字符,且向上滚动。
五、总结
5.1个人心得体会
通过这次对应用于学校的液晶显示器LCD的设计与制作,让我了解了什么是嵌入式系统开发,让我对学习嵌入式系统开发有了一个起点的基础,并学会了两种软件的使用。
在这次设计的过程中,刚开始的时候,有点不知所措,因为刚刚学习完单片机,在李老师的带领下做完了四个实验,接着就立即开始做这个课程设计。
我预先安装并学习了李老师准备好的C编程与仿真软件,熟悉并掌握了软件的基本操作,怎样在Proteus软件里找元器件,怎样画电路原理图,以及学习并了解每个元器件的功能介绍。
怎样在Keil中编写C语言代码以及如何调试,如何与仿真软件相互结合等等,再结合着平时学的和书本上的详细介绍以及在网上收集资料等,遇到解决不了的问题,就在网上和书本上查阅,这个液晶显示器LCD的软件程序都是使用C语言编写的。
这次的LCD课程设计是一个学习新知识、巩固加深所学课本理论