51单片机和液晶显示器的接口技术
在介绍图形点阵式液晶显示模块ZCM12864C的结构原理和功能的基础上,讨论了该显示模块与8051单片机的接口技术,给出了硬件接口电路原理图,接口软件编程,同时,针对液晶显示器特点,详细阐述了图形点阵式液晶显示器的工作原理,8051单片机的结构原理,功能。接口技术;8051单片机;ZCM12864C
关键词:图形点阵式液晶显示模块;
前言
设计步骤:
1:选择合适匹配的点阵式LCD
2:设计与51单片机的接口电路
3:编程并调试应用程序和系统调试
4.运行程序和观察显示结果
调试注意事项:
1:正确接线,注意电源,特别是正负电源接线是否正确
2:通电,调节对比度电位器使屏幕显示区域呈现比未加电时的底色深
3:执行程序,调节对比度电位器,观看显示效果
第一章 LCD液晶显示的介绍
液晶显示的特点:液晶是一种有机化合物,又称为液态晶体。它在一定的温度范围内,既有液体的流动性,又具有晶体的某些光学特性,在电场和温度的作用下能产生各种特殊的电光效应和光热效应。利用这种特性可制成液晶显示器(Liquid Crystal Display,LCD).
1.1: 液晶显示器是一种被动显示器,它本身不发光而只是调制环境光,因此,它在显示时需要一定的光源。液晶显示器和其他显示器件相比有以下工作特点:
(1) 工作电压低,仅3v-6v;功耗又及低(每平方厘米仅18-80uw),同样的显示面积,其功耗比LED显示器小几百倍。所以它特别适宜与CMOS电路直接相配,用于各种数字及图形显示,尤其是适应于便携式智能仪器。
(2) 可在明亮环境下正常使用,其显示清晰度不会随环境光的增强而减弱,在太阳光下它也能正常显示。
(3) 体积小,外形薄,为平板式显示,使用很方便。
(4) 显示面积和字型大小以及自负的多少在一定的范围内不受限制。
(5) 响应时间和余辉时间较长,为毫秒级,因而响应速度较慢。
(6) 本身不发光,在黑暗环境中不能显示,需采用辅助光源。
(7) 工作范围较窄,通常为-10℃-60℃
LED 和LCD 的区别
LCD (
Liquid Crystal Display ) 即液晶显示器,是一种数字显示技术,可以通过液晶和彩色过滤器过滤光源,在平面面板上产生图象。与传统的阴极射线管(CRT)相比,LCD占用空间小,低功耗,低辐射,无闪烁,降低视觉疲劳。
彩色LCD面板中,每一个像素都是由三个液晶单元格构成,其中每一个单元格前面都分别有红色,绿色,或兰色的过滤器。这样,通过不同单元格的光线就可以在屏幕上显示出不同的颜色。现在,几乎所有的应用于笔记本或桌面系统的LCD都使用薄膜晶体管(TFT)激活液晶层中的单元格。TFT LCD技术能够显示更加清晰,明亮的图象。
LED ( light-emitting diode ) 发光二极管
LED是一种灯,多用在小的指示灯,比如说电源指示灯什么的,最近也出来了LED固态光源的新闻灯,很昂贵,耗电低,色温强.
但是用LED的点阵也能组成显示器,适用于户外大屏幕显示,分辨率较低.如家用电器的指示灯,汽车 后防雾灯等。LED的最显著特点是使用寿命长,光电转换效能高。
此可见,当然是LCD明亮了.LCD的显示器有很好的发展前景.
1.3:液晶显示器的工作原理:
液晶显示器的结构比较简单,在内便面刻有电极的两块平板玻璃中间注入约10um厚的冶金薄层,即构成液晶显示器。液晶显示器按所用的电光效应可分为动态散射效应和扭曲-向列效应两种,按采光方式的不同又可分为透射式和反射式两种。
(1): 液晶显示器的主要类型
液晶显示器主要有两种类型:笔画式液晶显示器和点阵式液晶显示器。下面着重介绍点阵式液晶显示器。
点阵式液晶显示器是新一代的的液晶显示器,它通过液晶点阵的组合能显示大量的字符,曲线及图形,所以它能提供的显示信息量非常大,相应它的接口与控制电路都非常复杂。但是生产厂家通常都给点阵液晶模块本身配有智能型接口控制电路及字符存储器,所以用户只需对点阵液晶模块进行控制,使用起来非常方便。目前点阵液晶模块分为两类:一类为字符型液晶显示模块,另一类为字符,曲线,图形液晶显示模块。
点阵式液晶显示模块的内部结构由点阵液晶,字符存储器,点阵驱动器及控制电路构成。字符存储器可存储由单片机传送来的ASCⅡ字符以及各种ASCⅡ字符的显示点阵代码,也可由用户用编程的方法自由输入自定义字符及起显示点阵代码,还可以存储用户设计的图形点阵。点阵驱动器用语交流扫描驱动液晶点阵。控制器控制整个显示器的工作,它内含振荡器和智能控制电路,有数据总线和至少3个输入控制端:(1)E允许信号控制端;(2)R/W 读/写信号控制端;(3)RS选择数据/指令输入端。在这3根控制线的控制下,控制器通过数据总线(DB)接接收单片机发送来的指令和数据,在字符存储器中找到要显示字符或图形的点阵代码,通过驱动器驱动液晶点阵在规定的位置显示出该字符或图形。控制器还可以根据单片机的指令控制字符的显示,闪烁和位移等。
1.3 ZCM12864C显示器的介绍
ZCM12864C显示器是一种图形点阵液晶显示模块它主要由行驱动器列驱动器负压产生器以及128 64全点阵液京显示器组成可完成图形显示也可以显示84个1616汉字其主要技术参数和性能如下
(1)电源 VDD+5V
(2)显示内容 128列 64行点
(3)全屏幕点阵
(4)七种指令
(5)与CPU的接口采用8位并行数据总线和5条控制线
(6)自带负压产生电路无需外界供给负压
(7)占空比 1/64
(8)工作温度 0 ~ +50 存储温度 -20 ~ +70
外形尺寸
1.3.1 外形尺寸图
(2)外形尺寸说明
项 目 |
尺 寸 |
单 位 |
模块体积 |
78W 70H |
mm |
视域 |
62W 44H |
mm |
点阵 |
128 64 |
Dots |
点距离 |
0.44 0.60 |
mm |
点大小 |
0.39 0.55 |
mm |
模块主要硬件构成说明
结构框图
1.3.2 结构框图杰构框图说明
IC1为行驱动器IC2IC3为列驱动器外部的CPU通过13根线对模块进行控制其中DB7 ~ DB0为8位并行数据总线E R/W D均为控制信号线CSA CSB则为选屏信号分别控制左右半屏的图形显示
电源接口图
备注模块由外部提供 +5V电源液晶驱动电压V0在VDD+5V与GND0V之间可调
模块的外部接口
管脚号 |
管脚名称 |
电平 |
管脚功能描述 |
|
1 |
CSA |
L |
片选信号 |
|
2 |
CSB |
|
||
3 |
GND |
0V |
电源地 |
|
4 |
VDD |
+5V |
正电源 |
|
5 |
V0 |
- |
液晶驱动电压 |
|
6 |
D/I |
H/L |
D/I为高电平DB7 ~ DB0为显示数据 D/I为低电平DB7 ~ DB0为显示指令 |
|
7 |
R/W |
R/W=HE=H可读出模块中的数据 R/W=LE=HL可将数据写入模块 |
|
|
8 |
E |
同R/W管脚注释 |
|
|
9 |
DB0 |
H/L |
DB7 ~ DB0为8位并行数据总线 |
|
10 |
D10B1 |
|
||
11 |
DB2 |
|
||
12 |
DB3 |
|
||
13 |
DB4 |
|
||
14 |
DB5 |
|
||
15 |
DB6 |
|
||
16 |
DB7 |
|
指令表
指令 |
指令码 |
功能 |
|||||||||||||
D/I |
R/W |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
||||||
显示ON/OFF |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0/1 |
控制显示开关 0OFF1ON |
||||
设置Y地址 |
0 |
0 |
0 |
1 |
Y地址0 ~ 63 |
设置列地址Y地址 |
|||||||||
设置X地址 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
PAGE0 ~ 7 |
设置X地址寄存器中的页地址X地址 |
||||||
显示 起始行 |
0 |
0 |
1 |
1 |
显示开始行 0 ~ 63 |
指定显示屏显示RAM中显示数据的开始行 |
|||||||||
读状态 |
0 |
1 |
BUSY |
0 |
ON/OFF |
RET |
0 |
0 |
0 |
0 |
读取状态 DUSY1内部操作0准备就绪 ON/OFF 1显示开 0显示关 RET 1复位 0正常 |
||||
写显示数据 |
1 |
0 |
显示数据 |
将数据总线上的数据写入RAM中Y地址自动加1 |
|||||||||||
读显示数据 |
1 |
1 |
显示数据 |
从RAM中读数据到数据总线 DB7 ~ DB0 |
|||||||||||
读写操作时序
1.3.3 写操作时序
62读操作时序
1.3.4 接口信号读写时序参数表
名称 |
符号 |
最小值 |
典型值 |
最大值 |
单位 |
E信号周期 |
Tcyc |
1000 |
- |
- |
ns |
E信号高电平宽度 |
Twhe |
450 |
- |
- |
|
E信号低电平宽度 |
Twle |
450 |
- |
- |
|
E信号上升时间 |
Tr |
- |
- |
25 |
|
E信号下降时间 |
Tf |
- |
- |
25 |
|
地址建立时间 |
Tas |
140 |
- |
- |
|
地址保持时间 |
Tah |
10 |
- |
- |
|
数据建立时间 |
Tdsw |
200 |
- |
- |
|
数据延迟时间 |
Tddr |
- |
- |
320 |
|
写数据保持时间 |
Tdhw |
10 |
- |
- |
|
读数据保持时间 |
tdhr |
20 |
- |
- |
1.3.5 应用举例
ZCM12864C与单片机8051的一种接口方式
下面给出基于上图的一段源程序供参考
显示分以下几步:
第一步:开机全亮显示,用于检测是否有缺画(缺行和缺列)
第二步:全灭
第三步:奇行显示
第四步:奇列显示
第五步:隔点显示
第六步:文字显示
循环第三步至第六步
用51单片机连接到LCD模块,模块上的V0与VEE引脚用微调电阻连接(详细见ZCM12864C接口资料)。
晶振:12MHz
此屏分两个部分:
左半屏部分及右半屏部分,选择方式由片选CS1、CS2来确定:01时为左半屏,10时为右半屏
每一半屏由8个页组成的。
系统流程图如下:
第二章 8051单片机的介绍
2.1 MCS-51单片机内部结构
单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。INTEL的MCS-51系列单片机采用的是哈佛结构的形式,而后续产品16位的MCS-96系列单片机则采用普林斯顿结构。
下图是MCS-51系列单片机的内部结构示意图。
2.2MCS-51的引脚说明MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在我们对这些引脚的功能加以说明:
·Pin20:接地脚。
·Pin40:正电源脚,正常工作或对片内EPROM烧写程序时,接+5V电源。
·Pin19:时钟XTAL1脚,片内振荡电路的输入端。
·Pin18:时钟XTAL2脚,片内振荡电路的输出端。
8051的时钟有两种方式,一种是片内时钟振荡方式,但需在18和19脚外接石英晶体(2-12MHz)和振荡电容,振荡电容的值一般取10p-30p。另外一种是外部时钟方式,即将XTAL1接地,外部时钟信号从XTAL2脚输入。
输入输出(I/O)引脚:
*/ Pin39-Pin32为P0.0-P0.7输入输出脚,Pin1-Pin1为P1.0-P1.7输入输出脚,Pin21-Pin28为P2.0-P2.7输入输出脚,Pin10-Pin17为P3.0-P3.7输入输出脚,这些输入输出脚的功能说明将在以下内容阐述。
·Pin9:RESET/Vpd复位信号复用脚,当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指钟写入07H,其它专用寄存器被清“0”。RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态,·Pin30:ALE/当访问外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。
如果单片机是EPROM,在编程其间,将用于输入编程脉冲。
·Pin29:当访问外部程序存储器时,此脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。
·Pin31:EA/Vpp程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。显然,对内部无程序存储器的8031,EA端必须接地。
在编程时,EA/Vpp脚还需加上21V的编程电压
2.3 MCS-51单片机输入输出口
8051有4组8位I/O口:P0、P1、P2和P3口,P1、P2和P3为准双向口,P0口则为双向三态输入输出口,下面我们分别介绍这几个口线:
·P0口和P2口:
右图为P0口和P2口其中一位的电路图,由图可见,电路中包含一个数据输出锁存器和两个三态数据输入缓冲器,另外还有一个数据输出的驱动和控制电路。这两组口线用来作为CPU与外部数据存储器、外部程序存储器和I/O扩展口,而不能象P1、P3直接用作输出口。它们一起可以作为外部地址总线,P0口身兼两职,既可作为地址总线,也可作为数据总线。参考图2。
P2口作为外部数据存储器或程序存储器的地址总线的高8位输出口AB8-AB15,P0口由ALE选通作为地址总线的低8位输出口AB0-AB7。外部的程序存储器由PSEN信号选通,数据存储器则由WR和RD读写信号选通,因为216=64k,所以8051最大可外接64kB的程序存储器和数据存储器。
·P1口:
右图为P1口其中一位的电路图,P1口为8位准双向口,每一位均可单独定义为输入或输出口,当作为输入口时,1写入锁存器,Q(非)=0,T2截止,内上拉电阻将电位拉至"1",此时该口输出为1,当0写入锁存器,Q(非)=1,T2导通,输出则为0。
作为输入口时,锁存器置1,Q(非)=0,T2截止,此时该位既可以把外部电路拉成低电平,也可由内部上拉电阻拉成高电平,正因为这个原因,所以P1口常称为准双向口。需要说明的是,作为输入口使用时,有两种情况,其一是:首先是读锁存器的内容,进行处理后再写到锁存器中,这种操作即读—修改—写操作,象JBC(逻辑判断)、CPL(取反)、INC(递增)、DEC(递减)、ANL(与逻辑)和ORL(逻辑或)指令均属于这类操作。其二是:读P1口线状态时,打开三态门G2,将外部状态读入CPU。
·P3口:
P3口的电路如上图所示,P3口为准双向口,为适应引脚的第二功能的需要,增加了第二功能控制逻辑,在真正的应用电路中,第二功能显得更为重要。由于第二功能信号有输入输出两种情况,我们分别加以说明。
P3口的输入输出及P3口锁存器、中断、定时/计数器、串行口和特殊功能寄存器有关,P3口的第一功能和P1口一样可作为输入输出端口,同样具有字节操作和位操作两种方式,在位操作模式下,每一位均可定义为输入或输出。
我们着重讨论P3口的第二功能,P3口的第二功能各管脚定义如下:
·P3.0 串行输入口(RXD)
·P3.1 串行输出口(TXD)
·P3.2 外中断0(INT0)
·P3.3 外中断1(INT1)
·P3.4 定时/计数器0的外部输入口(T0)
·P3.5 定时/计数器1的外部输入口(T1)
·P3.6 外部数据存储器写选通(WR)
·P3.7 外部数据存储器读选通(RD)
对于第二功能为输出引脚,当作I/O口使用时,第二功能信号线应保持高电平,与非门开通,以维持从锁存器到输出口数据输出通路畅通无阻。而当作第二功能口线使用时,该位的锁存器置高电平,使与非门对第二功能信号的输出是畅通的,从而实现第二功能信号的输出。对于第二功能为输入的信号引脚,在口线上的输入通路增设了一个缓冲器,输入的第二功能信号即从这个缓冲器的输出端取得。而作为I/O口线输入端时,取自三态缓冲器的输出端。这样,不管是作为输入口使用还是第二功能信号输入,输出电路中的锁存器输出和第二功能输出信号线均应置“1”。
2. 4 程序运行举例
};
void Delay_Nop(void)
{
uchar m;
for(m=0;m<10;m++);
}
void Delay(uint m)
{
uchar n1;
uint n2;
for(n2=0;n2<m;n2++)
{for(n1=0;n1<250;n1++);
}
}
void LeftBusy(void) //左半屏操作忙碌检测与等待
{
LcdE=0;
P1=0xff;
LcdCs1=0;
LcdCs2=1;
LcdRw=1;
LcdDi=0;Delay_Nop();
LcdE=1;
do{;}while(P1&0x80);
LcdE=0;
}
void LeftWriteCommand(void) //左半屏写命令
{
LeftBusy();
LcdCs1=0;
LcdCs2=1;
LcdDi=0;
LcdRw=0;
LcdE=0;
P1=LcdCode;Delay_Nop();
LcdE=1;Delay_Nop();
LcdE=0;
}
void LeftWriteData(void) //左半屏写数据
{
LeftBusy();
LcdCs1=0;
LcdCs2=1;
LcdDi=1;
LcdE=0;
LcdRw=0;
P1=LcdData;Delay_Nop();
LcdE=1; Delay_Nop();
LcdE=0;
}
void RightBusy(void) //右半屏操作忙碌检测与等待
{
LcdE=0;
P1=0xff;
LcdCs1=1;
LcdCs2=0;
LcdRw=1;
LcdDi=0;
LcdE=1;Delay_Nop();
do{;}while(P1&0x80);
LcdE=0;
}
void RightWriteCommand(void) //右半屏写命令
{
RightBusy();
LcdCs1=1;
LcdCs2=0;
LcdDi=0;
LcdE=0;
LcdRw=0;
P1=LcdCode;Delay_Nop();
LcdE=1;Delay_Nop();
LcdE=0;
}
void RightWriteData(void) //右半屏写数据
{
RightBusy();
LcdCs1=1;
LcdCs2=0;
LcdDi=1;
LcdE=0;
LcdRw=0;
P1=LcdData;Delay_Nop();
LcdE=1; Delay_Nop();
LcdE=0;
}
void AllBlack(uchar dat) //LCD全亮或清屏
{
uchar i,j;
LcdData=dat;
//LcdCode=0xc0;
//LeftWriteCommand();
//RightWriteCommand();
for(j=0;j<8;j++)
{
LcdCode=0xb8|j; //页地址设定
LeftWriteCommand();
RightWriteCommand();
//LcdCode=0x40; //列地址设定
//LeftWriteCommand();
//RightWriteCommand();
for(i=0;i<64;i++)
{
LcdCode=0x40|i;
LeftWriteCommand();
RightWriteCommand();
LeftWriteData();
RightWriteData();
}
}
}
void Mcu_Init(void) //单片机初始化
{P0=0x00;
P1=0x00;
P2=0x00;
P3=0xff;
}
void Lcd_Init(void) //LCD初始化
{
LcdCode=0x3e;LeftWriteCommand();RightWriteCommand(); //显示关
LcdCode=0xC0;LeftWriteCommand();RightWriteCommand(); //起始行为0行
LcdCode=0x3f;LeftWriteCommand();RightWriteCommand(); //显示开
}
h_line() //显示间隔线
{
uint i,j;
AllBlack(0xaa); //显示间隔横线
Delay(1500);
AllBlack(0x00);
//LcdCode=0xc0;LeftWriteCommand();RightWriteCommand(); //起始行为0行
for(j=0;j<8;j++) //显示间隔列线
{LcdCode=0xB8|j;LeftWriteCommand();RightWriteCommand();
for(i=0;i<64;i=i+2)
{LcdCode=0x40|i;LeftWriteCommand();RightWriteCommand();
LcdData=0x00;LeftWriteData();RightWriteData();
LcdCode++;LeftWriteCommand();RightWriteCommand();
LcdData=0xff;LeftWriteData();RightWriteData();
}
}
Delay(1500);
AllBlack(0x00);
//LcdCode=0xc0;LeftWriteCommand();RightWriteCommand(); //起始行为0行
for(j=0;j<8;j++) //显示间隔斜线
{LcdCode=0xB8|j;LeftWriteCommand();RightWriteCommand();
for(i=0;i<64;i=i+2)
{LcdCode=0x40|i;LeftWriteCommand();RightWriteCommand();
LcdData=0x55;LeftWriteData();RightWriteData();
LcdData=0xaa;LeftWriteData();RightWriteData();
}
}
}
void tu(void)
{
uchar i,j;
for(i=0;i<4;i++)
{LcdCode=0xb8|i;LeftWriteCommand();RightWriteCommand();
LcdCode=0x40;LeftWriteCommand();RightWriteCommand();
for(j=0;j<64;j++)
{LcdCode=0x40|j;LeftWriteCommand();RightWriteCommand();
LcdData=tab1[i*64+j];LeftWriteData();
LcdData=tab1[i*64+j+256];RightWriteData();
}
}
for(i=0;i<4;i++)
{LcdCode=0xb8|(i+4);LeftWriteCommand();RightWriteCommand();
LcdCode=0x40;LeftWriteCommand();RightWriteCommand();
for(j=0;j<64;j++)
{LcdCode=0x40|j;LeftWriteCommand();RightWriteCommand();
LcdData=tab1[i*64+j];LeftWriteData();
LcdData=tab1[i*64+j+256];RightWriteData();
}
}
}
void main(void)
{
// uchar k;
Mcu_Init();
Lcd_Init();
//AllBlack(0xaa); //全屏亮
//Delay(2000);
//AllBlack(0x00); //清屏
//Delay(2000);
do{
//h_line(); //间隔线
//Delay(1500);
//AllBlack(0);
//tu();
AllBlack(0xff); //全屏亮
Delay(2000);
AllBlack(0);
Delay(1000);
}while(1);
//do{for(k=0;k<64;k++) //上下滚屏效果
// {LcdCode=0xc0|k;LeftWriteCommand();RightWriteCommand();
// tu();
// Delay(50);
// }
// }while(1);
}
致谢词
感谢我的老师:李国柱,他严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;他循循善诱的教导和不拘一格的思路给予我无尽的启迪。
这片论文的每个实验细节和每个数据,都离不开你的细心指导。而你开朗的个性和宽容的态度,帮助我能够很快的融入我们这个新的实验室
在论文即将完成之际,我希望各位老师多提出宝贵的意见和指点使我能学到更多的知识。谢谢
参考文献
1 单片机原理及接口技术 编著李全利 迟荣强 高等教育出版社 页数:P15-P16, P20 ,P22-P23,P254-P264
2 单片机技术实用教程 肖来胜 冯建兰 夏术泉 华中科技大学出版社页数:P254-P256,