基于单片机AT89C52的LCD设计说明Word文档格式.docx

上传人:b****6 文档编号:21126766 上传时间:2023-01-27 格式:DOCX 页数:18 大小:214.70KB
下载 相关 举报
基于单片机AT89C52的LCD设计说明Word文档格式.docx_第1页
第1页 / 共18页
基于单片机AT89C52的LCD设计说明Word文档格式.docx_第2页
第2页 / 共18页
基于单片机AT89C52的LCD设计说明Word文档格式.docx_第3页
第3页 / 共18页
基于单片机AT89C52的LCD设计说明Word文档格式.docx_第4页
第4页 / 共18页
基于单片机AT89C52的LCD设计说明Word文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

基于单片机AT89C52的LCD设计说明Word文档格式.docx

《基于单片机AT89C52的LCD设计说明Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机AT89C52的LCD设计说明Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

基于单片机AT89C52的LCD设计说明Word文档格式.docx

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课程设计是一个学习新知识、巩固加深所学课本理论

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1