12864LCD液晶显示设计.docx
《12864LCD液晶显示设计.docx》由会员分享,可在线阅读,更多相关《12864LCD液晶显示设计.docx(18页珍藏版)》请在冰豆网上搜索。
12864LCD液晶显示设计
单片机技术课程设计说明书
128×64LCD液晶显示
目录
1.概述2
1.1课题设计背景2
1.2课程设计内容2
2设计方案2
3.系统硬件设计3
3.1控制模块3
3.2显示模块6
3.3电源模块9
4.系统软件设计10
4.1软件流程图10
4.2时序图11
5.结束语12
参考文献:
13
附录14
附录1:
程序清单15
附录二:
设计图纸19
附录3:
元器件目录表20
128×64LCD液晶显示
1.概述
1.1课题设计背景
液晶作为一种显示器件,以其特有的优势正广泛应用于仪器、仪表、电子设备等低功耗产品中。
以往的测控仪器的显示部分大都采用LED式液晶显示屏进行参数设定和结果显示,其显示信息量少、形式单一、人机交互性差、操作人员要求较高。
而液晶显示器(LCD)具有功耗低、体积小、质量轻、超薄和可编程驱动等其他显示方式无法比拟的优点,不仅可以显示数字、字符,还可以显示各种图形、曲线、及汉字,并且可实现屏幕上下左右滚动、动画、闪烁、文本特征显示等功能;人机界面更加友好,使用操作也更加灵活、方便,使其日益成为智能仪器仪表和测试设备的首选显示器件。
1.2课程设计内容
本实验设计的主要目的是:
掌握单片机与液晶显示器之间接口设计与编程;利用点阵式液晶显示器显示汉字或图形
设计要求:
编制程序,利用标准字库,在液晶上显示汉字。
2设计方案
本设计是以单片机为核心控制器件的简单文字符号图像的LCD显示系统,通过硬件和软件的共同配合之下实现了在128×64分辨率的液晶屏上显示字符、汉字和图像的功能,系统由单片机、和液晶显示屏构成。
LCD显示系统结构框图如图2所示,
图2、128×64LCD液晶显示系统结构框图
AT89C51单片机内部有4KB可反复擦写的Flash闪速存储器、128字节的RAM,可以根据系统所需存储容量的大小来扩展R0M和RAM。
LCD选用LCM12864液晶
3.系统硬件设计
采用128×64LCD液晶显示系统电路原理图如图2-1所示整个设计的核心器件有:
控制模块、显示模块、电源模块三部分组成。
3.1控制模块
控制模块电路如图3-1-1(a)、(b)所示。
3-1-1(a)、控制模块原理图AT89C51单片机示意图3-1-1(b)
主控制器采用AT89S51,AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。
初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指钟写入07H,其它专用寄存器被清“0”。
RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。
然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态,如表3-1-2所示。
特殊功能寄存器
初始态
特殊功能寄存器
初始态
ACC
00H
B
00H
PSW
00H
SP
07H
DPH
00H
TH0
00H
DPL
00H
TL0
00H
IP
xxx00000B
TH1
00H
IE
0xx00000B
TL1
00H
TMOD
00H
TCON
00H
SCON
xxxxxxxxB
SBUF
00H
P0-P3
1111111B
PCON
0xxxxxxxB
表3-1-2、8051的初始态
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
芯片擦除:
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms来完成。
在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89S51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。
在闲置模式下,CPU停止工作。
但RAM,定时器,计数器,串口和中断系统仍在工作。
在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
3.2显示模块
图3-2、显示模块的原理图
LCM12864ZK中文图形液晶显示模块的液晶屏幕为128×64,可显示四行,每行显示8个汉字。
中文液晶显示模块LCM12864ZK的字型ROM内含8192个16316点中文字型和
128个16×8半宽的字母符号字型;另外绘图显示画面提供一个64×256点的绘图区域GDRAM;而且内含CGRAM提供的4组软件可编程的16316点阵造字功能。
3.2.1.LCM12864ZK共20脚,其功能如表3-2-1所示:
表3-2-1、LCM12864ZK功能
引脚
名称
功能
引脚
名称
功 能
1
CS1
选择寄存器(并行)0:
指令寄存器1:
数据寄存器片选(串行)0:
禁止1:
允
许
7
RW(SID)
读写控制脚(并行)0:
写入1:
读输入串行数据(串行)
2
CS2
选择寄存器(并行)0:
指令寄存器1:
数据寄存器片选(串行)0:
禁止1:
允
许
8
E(SCLK)
读写数据启始脚(并行)输入串行脉冲(串行)
3
GND
接地
4
VCC
3V/5V
9~16
D0~D7
数据线
5
V0
液晶显示器驱动电压
17
/RST
复位信号,低有效
6
RS
表示DB0~DB7为显示指令数据
18
-Vout
LCD驱动负电源
引脚“/RST”和“PSB”可不接;不接时,为并行接口方式。
引脚“VR”和“V0”之间必须接可变电阻(0~10kΩ),一端接VR,调整端接V0,另一端悬空;且可变电阻需调到显示区域
的底色刚刚显示出来为止。
当PSB脚接高电时(模块背面S/P的短路电阻在“P”侧),模块将进入并行传输模式;在并行传输模式下,可由指令位(DLFLAG)来选择8-BIT或4-BIT接口,主控制系统将配合(RS,RW,E,DB0..DB7)来完成传输动作;当PSB脚接低电位(模块背面S/P的短路电阻在“S”侧),模块将进入串行模式;在串行模式下将使用二条传输线作串行资料的传送,主控制系统将配合传输同步时钟(SCLK)与接收串行数据线(SID),来完成串行传输的动作。
3.2.2LCM12864ZK基本操作指令LCM12864ZK内含ST7920驱动控制器,该控制器是液晶驱动器与计算机的接口,它以较简单的方式受控于计算机,接收并反馈计算机的各种信息,经过控制器独立的信息处理实现对液晶显示缓冲区的管理。
LCM12864ZK基本操作指令如表3-2-2所示。
表3-2-2、LCM12864ZK基本操作指令
指令名称
控制信号
控制代码
RS
RW
D7
D6
D5
D4
D3
D2
D1
D0
清除显示
0
0
0
0
0
0
0
0
0
1
位址清0
0
0
0
0
0
0
0
1
X
进入点设定
0
0
0
0
0
0
0
I/D
S
显示状态开/关
0
0
0
0
0
0
1
C
B
功能设定
0
0
0
0
1
DL
X
BE
X
X
设定DDRAM
0
0
1
AC6
AC5
AC4
AC3
AC2
AC1
AC0
读取忙标志
0
1
BF
AC6
AC5
AC4
AC3
AC2
AC1
AC0
写RAM
1
0
D7
D6
D5
D4
D3
D2
D1
D0
a.清除显示:
清DDRAM添满“20H”,并设定DDRAM的
位址AC=0
b.位址清0:
设定DDRAM的位址AC=0,将光标移到原点,不清DDRAM
c.进入点设定:
指定在资料的读取与写入时,设定光标的移动方向及指定显示的移位
d.显示状态开/关:
D=1:
整体显示ON,D=0:
整体显示OFF;C=1:
光标显示ON,C=0:
光标显示OFF;B=1:
光标反白显示ON,B=0:
光标反白显示OFF。
e.功能设定:
DL=18-bit控制界面、DL=04-bit控制界面、RE=1:
扩充指令集动作、RE=0:
基本指令集动作
f.设定DDRAM:
设定DDRAM位址到位址记数器AC。
第一行AC范围为80H~87H;第二行AC范围为90H~97H;第三行AC范围为88H~8FH;第四行AC范围为98H~9FH。
g.读取忙标志:
读取忙标志(BF),可以确认内部动作是否完成,同时可以读出位址记数器AC
h.写RAM:
写入数据到内部RAM(DDRAM/CGRAM/GDRAM)。
每个RAM位址(DDRAM/CGRAM/GDRAM)都可连续写入两个BYTE数据,当写入第2个BYTE时,位址计数器(AC)的值自动+1。
3.3电源模块
图3-3、电源电路
从USB接口获取+5V电源,用相应配套的USB线从电脑主机获取+5V直流电源,在电源模块中加有保护电路,即电路中有短路.
上拉电阻如图3-4所示。
图3-4、上拉电阻
上拉电阻的功能:
电阻作用:
1.接电组就是为了防止输入端悬空
2.减弱外部电流对芯片产生的干扰
3.加大输出引脚的驱动能力
4.上拉和下拉、限流
5.改变电平的电位
6.在引脚悬空时有确定的状态
7.增加高电平输出时的驱动能力。
8、为OC门提供电流
4.系统软件设计
4.1软件流程图
系统流程图如图4-1所示。
图4-1软件流程图
液晶显示器在上电后应先初始化,首先延时40ms以上,进行功能能设定(8位/4位、基本指令/扩充指令);再延时100μs,同样是功能设定;然后延时37μs,开关显示设定;延时10μs,清屏(清除显示RAM);最后延时10ms,设置读取与写入时光标的移动方向等。
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志(P1.7)为低电平,表示不忙,否则此指令失效。
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,即设定DDRAM位址到位址记数器AC。
第一行AC范围为80H~87H;第二行AC范围为90H~97H;第三行AC范围为88H~8FH;第四行AC范围为98H~9FH。
4.2时序图
时序参数如表4-2-(a)、(b)所示。
(a)写操作时序图(b)读操作时序图
图3-1(a)、(b)128×64点阵型LCD读写时序图
5.结束语
随着仪器、仪表、电子设备等智能化程度的提高,单片机系统的液晶显示模块使用的也越来越广泛。
在单片机与液晶的接口中,关键是要满足液晶的时序要求;在软件编程中,关键是要进行正确的初始化、操作及显示内容的代码。
本次课程设计,我看到了自己许多不足之处。
以前在上课的时候,老师经常强调在写一个程序的时候,一定要事先把程序原理方框图化出来,但是我开始总觉得这样做没必要,很浪费时间。
但是,这次课程设计完全改变了我以前的那种错误的认识,以前我接触的那些程序都是很短、很基础的,但是在课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的。
因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到了各种各样的问题,在这些问题中也认识到了自己的种种不足,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
其实这也给了我一个警告,在今后的学习中,我力争扎实学习。
参考文献:
[1]尹耕钦,唐绪伟城市交通信号灯模拟控制系统,微计算机信息,2005.
[2]周立功,ARM嵌入式系统基础教程[M].北京:
北京航空航天大学出版社,2005.
[3]张立强,于伟.电路原理图与PCB板设计教程ProtelDXP[M].北京:
科学出版社,2005.
[4]王立权.机器人创新设计与制作[M].北京:
清华大学出版社,2007.
[5]杨靖.《用单片机控制的直流电机调速系统》,机床电路,2008.1.
[6]高国富,谢少荣,罗均.机器人传感器及其应用[M].北京:
化学工业出版社,2005.
[7]何勇,王生泽.光电传感器及其应用[M].北京:
化学工业出版社,2004.
[8]周立功.MagicARM2200-S教学实验开发平台实验指导[M].北京:
北京航空航天大学出版社,2005.
[9]郭天祥.新概念51单片机C语言教程[M].北京:
电子工业出版社,2008.
[10]张睿.AltiumDesigner6.0原理图与PCB设计[M].北京:
电子工业出版社,2007.
[11]冯建华,赵亮编著《单片机应用系统设计与产品开发》人民邮电出版社2004.11.
[12]陈正义,编著《单片机控制实习》人民邮电出版社,2006.7.
附录
附录1:
程序清单
附录二:
设计图纸
附录3:
元器件目录表
附录1:
程序清单
基于单片机的128×64LCD液晶显示控制系统程序清单
;************************************************;
; 带字库液晶显示模块LCM12864ZK系统程序 ;
;************************************************;
;******************初始化部分********************
#defineUcharunsignedchar
#defineUintunsignedint
#defineUlongunsignedlong
sbitE=P3^0;//对应第8脚
sbitRW=P3^1;//对应第7脚
sbitRS=P3^2;//对应第6脚
;******************定义字符串数组********************
codecharSTR1[]=“济宁职业技术学院计算机工程系”;
codecharSTR3[]=“单片机和图形液晶显示器接口技术”;
;******************定义函数原型********************
voidDelayus(Ulongt);/延时函数/
voidBUSYLOOP();//判忙函数//
voidWrite-command(UcharCMD,Ucharbb);//发控制字函
数//
voidWrite-data(UcharCMD);//发数据函数//
voidCHUSHIHUA();//初始化函数//
voidDisplay(Ucharptr,Ucharddram);//显字符串函数
//
;******************判忙函数********************
voidBUSYLOOP()
{P1=0x0ff;
RS=0;
RW=1;
do{
E=1;
BUSY=P1;
E=0;}
while(BUSY>0x7F);}
;******************写控制字函数********************
voidWrite-command(UcharCMD,Ucharbb)
{if(bb)
{BUSYLOOP();}
RS=0;
RW=0;
E=1;
P1=CMD;
Delayus
(1);
E=0;}
;******************写数据函数********************
voidWrite-data(UcharCMD)
{BUSYLOOP();
RS=1;
RW=0;
E=1;
P1=CMD;
Delayus
(1);
E=0;}
;******************液晶初始化********************
voidCHUSHIHUA()
{Delayus(38);
Write-command(0x30,0);/8位、基本指令/
Delayus
(1);
Write-command(0x30,0);/8位、基本指令
Delayus
(1);
Write-command(0x0C,1);/开显示/
Delayus
(1);
Write-command(0x01,1);/清屏3/
Delayus(20);
Write-command(0x06,1);}/光标右移/
;******************显示字符串********************
voidDisplay(Uchar3ptr,Ucharddram)
{Ucharl,i1,x;
l=0;
if(ddram<0x88)
{hang=0;}//定位行地址:
第一行
elseif(ddram<0x90)
{hang=2;}//定位行地址:
第三行
elseif(ddram<0x98)
{hang=1;}//定位行地址:
第二行
else{hang=3;}//定位行地址:
第四行
lie=0x0f&ddram;//定位列地址
if(lie>0x07)
{lie=lie-0x08;}
x=lie32;
Write-command(ddram,0);//定位显示起始地址
while((ptr[l])!
=’\0’)
{l++;}
for(i1=0;i1{Write-data(ptr[i1]);//输出单个字符
x++;
if(x==0x10)
{x=0;
hang++;
switch(hang)
{case0:
Write-command(0x80,0);break;
.........}
if(hang>3){Write-command(0x80,0);
hang=0;}}}}
;******************主函数开始********************
main()
{CHUSHIHUA();//初始化函数//
Display(STR1,0x80);//上面一行显示一个预定字符串
Displ