Protues仿真12864液晶显示

2018-10-20 18:25

Protues仿真液晶显示

目录

1 LCD12864简介 ........................................................................................................................ 1 2 LCD12864显示原理 ................................................................................................................... 6

2.1汉字和英文显示原理 ....................................................................................................... 6 2.2图形显示 ........................................................................................................................... 7 2.3应用说明 ........................................................................................................................... 8 2.4指令描述 ........................................................................................................................... 9 3软件仿真 .................................................................................................................................... 12 3.1汉字显示 ................................................................................................................................. 12

3.2图形显示 ......................................................................................................................... 17 3.3同时显示多个汉字 ......................................................................................................... 23 3.4向上滚动显示 ................................................................................................................. 30 4小结 ............................................................................................................................................ 39

1 LCD12864简介

(1) ST7920类 这种控制器带中文字库,为用户免除了编制字库的麻烦,该控制器的液

晶还支持画图方式。该类液晶支持68时序8位和4位并口以及串口。 (2)KS0108类 这种控制器指令简单,不带字库。支持68时序8位并口。 (3)T6963C类 这种控制器功能强大,带西文字库。有文本和图形两种显示方式。有文本和图形两个图层,并且支持两个图层的叠加显示。支持80时序8位并口。 (4)COG类 常见的控制器有S6B0724和ST7565,这两个控制器指令兼容。支持68时序8位并口,80时序8位并口和串口。COG类液晶的特点是结构轻便,成本低。

ST7920 GND VCC V0 RS R/W E DB0-DB7 PSB RES VOUT BLA BLK

KS0108 GND VCC V0 RS R/W E DB0-DB7 CS1 CS2 RES VOUT BLA BLK

T6963C FG GND VCC V0 WR RD DB0-DB7 RS CS RES FS BLA BLK

S6B0724 GND VCC RS WR RD CS DB0-DB7 RES BLA BLK 12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。可完成图形显示,也可以显示8×4个(16×16点阵)汉字。 管脚名称 LEVER 管脚功能描述 VSS 0 电源地 VDD +5.0V 电源电压 V0 - 液晶显示器驱动电压 D/I=“H”,表示DB7∽DB0为显示数据 D/I(RS) H/L D/I=“L”,表示DB7∽DB0为显示指令数据 R/W=“H”,E=“H”数据被读到DB7∽DB0 R/W H/L R/W=“L”,E=“H→L”数据被写到IR或DR R/W=“L”,E信号下降沿锁存DB7∽DB0 E H/L R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0 DB0 H/L 数据线 DB1 H/L 数据线 DB2 H/L 数据线 DB3 H/L 数据线 DB4 H/L 数据线 DB5 H/L 数据线 DB6 H/L 数据线 DB7 H/L 数据线 CS1 H/L H:选择芯片(右半屏)信号 CS2 H/L H:选择芯片(左半屏)信号 RET H/L 复位信号,低电平复位 VOUT -10V LCD驱动负电压 LED+ - LED背光板电源 LED- - LED背光板电源 在使用12864LCD前先必须了解以下功能器件才能进行编程。12864内部功能器件及相关功能如下: 1. 指令寄存器(IR) IR是用于寄存指令码,与数据寄存器数据相对应。当D/I=0时,在E信号下降沿的作用下,指令码写入IR。 2.数据寄存器(DR) DR是用于寄存数据的,与指令寄存器寄存指令相对应。当D/I=1时,在下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7∽DB0数据总线。DR和DDRAM之间的数据传输是模块内部自动执行的。 3.忙标志:BF BF标志提供内部工作情况。BF=1表示模块在内部操作,此时模块不接受外部指令和数据。BF=0时,模块为准备状态,随时可接受外部指令和数据。 利用STATUS READ指令,可以将BF读到DB7总线,从检验模块之工作状态。 4.显示控制触发器DFF

此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY OFF),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。 DDF的状态是指令DISPLAY ON/OFF和RST信号控制的。 5.XY地址计数器

XY地址计数器是一个9位计数器。高3位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针, Y地址计数器为DDRAM的Y地址指针。

X地址计数器是没有记数功能的,只能用指令设置。

Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。

6.显示数据RAM(DDRAM)

DDRAM是存储图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。DDRAM与地址和显示位置的关系见DDRAM地址表。 7.Z地址计数器

Z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器为0。

Z地址计数器可以用指令DISPLAY START LINE预置。因此,显示屏幕的起始行就由此指令控制,即DDRAM的数据从哪一行开始显示在屏幕的第一行。此模块的DDRAM共64行,屏幕可以循环滚动显示64行。 12864LCD的指令系统

模块控制芯片提供两套控制命令,基本指令和扩充指令如下: 指令表1:(RE=0:基本指令) 指 令 指 令 码 RS R/W 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 0 将DDRAM填满\并且设定DDRAM的地址计数器(AC)到\设定DDRAM的地址计数器(AC)到\0 0 0 0 0 1 X 并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容 D=1: 整体显示 ON 0 0 0 1 D C B C=1: 游标ON B=1:游标位置反白允许 指定在数据的读取与写入时,设定游0 0 0 0 1 I/D S 标的移动方向及指定显示的移位 0 0 1 S/C R/L X X 设定游标的移动与显示的移位控制0 0 0 显示移位控制 功能 0 设定 0 0 位;这个指令不改变DDRAM 的内容 DL=0/1:4/8位数据 0 1 DL X RE X X RE=1: 扩充指令操作 RE=0: 基本指令操作 设定CGRAM 地址 设定DDRAM 0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 设定CGRAM 地址 设定DDRAM 地址(显示位址) 0 地址 读取忙标志和地址 写数据到RAM 读出RAM的值 0 1 0 AC5 AC4 AC3 AC2 AC1 AC0 第一行:80H-87H 第二行:90H-97H 读取忙标志(BF)可以确认内部动作0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 是否完成,同时可以读出地址计数器(AC)的值 1 0 数据 将数据D7——D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM) 1 1 数据 从内部RAM读取数据D7——D0 (DDRAM/CGRAM/IRAM/GRAM) 指令表2:(RE=1:扩充指令)

指 指 令 码 功 能 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 令 待进入待命模式,执行其他指令都棵终止 命 0 0 0 0 0 0 0 0 0 1 待命模式 模式 SR=1:允许输入垂直卷动地址 卷动地址0 0 0 0 0 0 0 0 1 SR 开关开启 SR=0:允许输入IRAM和CGRAM地址 反选择2行中的任一行作反白显示,并可决定白 反白与否。初始值R1R0=00,第一次设定为0 0 0 0 0 0 0 1 R1 R0 反白显示,再次设定变回正常 选择 睡SL=0:进入睡眠模式 0 0 0 0 0 0 1 SL X X 眠 SL=1:脱离睡眠模式 模式 扩充 功能 设定 设定绘图RAM 0 地址 0 0 1 0 0 0 0 0 1 CL X RE G 0 CL=0/1:4/8位数据 RE=1: 扩充指令操作 RE=0: 基本指令操作 G=1/0:绘图开关 设定绘图RAM 0 AC3 AC2 AC1 AC0 先设定垂直(列)地址AC6AC5?AC0 AC6 AC5 AC4 AC3 AC2 AC1 AC0 再设定水平(行)地址AC3AC2AC1AC0 将以上16位地址连续写入即可 备注:当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。 2、字符显示

带中文字库的128X64-0402B每屏可显示4行8列共32个16×16点阵的汉字,每个显示RAM可显示1个中文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。带中文字库的128X64-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。三种不同字符/字型的选择编码范围为:0000~0006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192种GB2312中文字库字形。字符显示RAM在液晶模块中的地址80H~9FH。字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示。

80H 90H 81H 91H 82H 92H 83H 93H 84H 94H 85H 95H 86H 96H 87H 97H

88H 98H 89H 99H 8AH 9AH 8BH 9BH 8CH 9CH 8DH 9DH 8EH 9EH 8FH 9FH 2 LCD12864显示原理

2.1汉字和英文显示原理

在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。

那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示:

图1 “A”字模图

而中文的“你”在字模中的记载却如图2所示:

图2 “你”字模图

根据芯片的不同取模的方式不同,有多种取模方式:单色点阵液晶字模,横向取模,字节正序,单色点阵液晶字模,横向取模,字节倒序,单色点阵液晶字模,纵向取模,字节正序,单色点阵液晶字模,纵向取模,字节倒序等等。

2.2图形显示

先设垂直地址再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址) 垂直地址范围 AC5...AC0 水平地址范围 AC3…AC0

绘图RAM 的地址计数器(AC)只会对水平地址(X 轴)自动加一,当水平地址=0FH 时会重新设为00H

但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定。GDRAM的坐标地址与资料排列顺序如下图:

2.3应用说明

用带中文字库的128X64显示模块时应注意以下几点:

①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。

②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。

③当字符编码为2字节时,应先写入高位字节,再写入低位字节。

④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。

⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。

2.4指令描述

1、显示开/关设置 CODE: R/W L D/I L DB7 L DB6 L DB5 H DB4 H DB3 H DB2 H DB1 H DB0 H/L 功能:设置屏幕显示开/关。 DB0=H,开显示;DB0=L,关显示。不影响显示RAM(DD RAM)中的内容。 2、设置显示起始行 CODE: R/W L D/I L DB7 H DB6 H DB5 DB4 DB3 DB2 DB1 DB0 行地址(0-63) 功能:执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。

3、设置页地址 CODE: R/W L D/I L DB7 H DB6 L DB5 H DB4 H DB3 H DB2 DB1 DB0 页地址(0-7) 功能:执行本指令后,下面的读写操作将在指定页内,直到重新设置。页地址就是DD RAM 的行地址,页地址存储在X地址计数器中,A2-A0可表示8页,读写数据对页地址没有影响,除本指令可改变页地址外,复位信号(RST)可把页地址计数器内容清零。

DD RAM地址映像表

Y 地址 0 1 2 ????????? 61 62 63 DB0 ∫ PAGE0 DB7 DB0 ∫ PAGE1 DB7 ∷ ∷ ∷ ∷ DB0 ∫ PAGE6 DB7 DB0 ∫ PAGE7 DB7 4、设置列地址 CODE: R/W L D/I L DB7 L DB6 H DB5 DB4 DB3 DB2 DB1 DB0 X=8 X=7 X=1 X=0 列地址(0-63) 功能: DD RAM 的列地址存储在Y地址计数器中,读写数据对列地址有影响,在对DD RAM进行读写操作后,Y地址自动加一。 5、状态检测 CODE:

R/W H D/I L DB7 BF DB6 L DB5 DB4 DB3 L DB2 L DB1 L DB0 L ON/OFF RET 功能:读忙信号标志位(BF)、复位标志位(RST)以及显示状态位(ON/OFF)。 BF=H:内部正在执行操作; BF=L:空闲状态。 RST=H:正处于复位初始化状态; RST=L:正常状态。 ON/OFF=H:表示显示关闭; ON/OFF=L:表示显示开。 6、写显示数据 CODE: R/W L D/I H DB7 D7 DB6 D6 DB5 D5 DB4 D4 DB3 D3 DB2 D2 DB1 D1 DB0 D0 功能:写数据到DD RAM,DD RAM是存储图形显示数据的,写指令执行后Y地址计数器自动加1。D7-D0位数据为1表示显示,数据为0表示不显示。写数据到DD RAM前,要先执行“设置页地址”及“设置列地址”命令。 7、读显示数据 CODE: R/W H D/I H DB7 D7 DB6 D6 DB5 D5 DB4 D4 DB3 D3 DB2 D2 DB1 D1 DB0 D0 功能:从DD RAM读数据,读指令执行后Y地址计数器自动加1。从DD RAM读数据前要先执行“设置页地址” 及“设置列地址”命令。 8、屏幕显示与DD RAM地址映射关系 Y1 Y2 Y3 Y4 ???? Y62 Y63 Y64 ???? 1/0 1/0 1/0 DB0 ???? 1/0 1/0 1/0 DB1 ???? 1/0 1/0 1/0 DB2 ???? 1/0 1/0 1/0 DB3 ???? 1/0 1/0 1/0 DB4 ???? 1/0 1/0 1/0 DB5 ???? 1/0 1/0 1/0 DB6 X=0 Line 0 1/0 1/0 1/0 1/0 Line 1 1/0 1/0 1/0 1/0 Line 2 1/0 1/0 1/0 1/0 Line 3 1/0 1/0 1/0 1/0 Line 4 1/0 1/0 1/0 1/0 Line 5 1/0 1/0 1/0 1/0 Line 6 1/0 1/0 1/0 1/0 Line 7 1/0 1/0 1/0 1/0 ???? ???? ???? X=7 Line60 1/0 1/0 1/0 1/0 Line61 1/0 1/0 1/0 1/0 Line62 1/0 1/0 1/0 1/0 Line63 1/0 1/0 1/0 1/0 ???? 1/0 1/0 1/0 DB7 ???? 1/0 1/0 1/0 DB4 ???? 1/0 1/0 1/0 DB5 ???? 1/0 1/0 1/0 DB6 ???? 1/0 1/0 1/0 DB7 3软件仿真 3.1汉字显示

在Protues软件中选择所需元件,搭建的电路图如图1所示。

图1 仿真硬件原理图

将编写的代码烧写到单片机里,运行液晶显示不正常,如图2所示。

图2 运行图

开始我还以为是程序问题,把程序看了又看,改了又改,显示结果还是一样。后来问了下张勇生,出现这种情况的原因是P0口没接上拉电阻。因为P0口是开漏的,不管它的驱动能力多大,相当于它是没有电源的,需要外部的电路提供,绝大多数情况下P0口是必需加上拉电阻的。接上拉电阻后,重新运行这下运行正常了,如图3所示。

图3正常显示

代码如下所示: #include

#define LCDLCDDisp_Off 0x3e #define LCDLCDDisp_On 0x3f #define Page_Add 0xb8//页地址 #define LCDCol_Add 0x40//列地址 #define Start_Line 0xC0//行地址 /*****液晶显示器的端口定义*****/ #define data_ora P0 /*液晶数据总线*/ sbit LCDMcs=P2^1 ; /*片选1*/ sbit LCDScs=P2^2 ; /*片选2*/ sbit RESET=P2^3 ; /*复位信号*/

sbit LCDDi=P2^4 ; /*数据/指令 选择*/ sbit LCDRW=P2^5 ; /*读/写 选择*/ sbit LCDEnable=P2^6 ; /*读/写 使能*/

char code Hz_xu[]= {

/*------------------------------------------------------------------------------

源文件 / 文字 : F:\\LD测试仪\\液晶\\字模提取+排版软件\\液晶字模提取\\图例\\wo.bmp 宽×高(像素): 16×

字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2010-7-28 17:10:17

------------------------------------------------------------------------------*/

0x40,0x42,0xCC,0x00,0x00,0x40,0x30,0x1E,0x10,0xF0,0x10,0x10,0x18,0x10,0x00,0x00, 0x00,0x00,0x3F,0x10,0x08,0x01,0x01,0x01,0x01,0x7F,0x01,0x01,0x01,0x01,0x00,0x00 };

char code Hz_ping[]= {

/*------------------------------------------------------------------------------

源文件 / 文字 : F:\\LD测试仪\\液晶\\字模提取+排版软件\\液晶字模提取\\图例\\ping.bmp萍 宽×高(像素): 16×16

字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2010-7-29 8:46:30

------------------------------------------------------------------------------*/

0x00,0xC8,0x28,0x58,0x08,0x0C,0xBE,0x28,0x28,0xE8,0x3E,0x28,0xA8,0x2C,0x08,0x00, 0x00,0x08,0x09,0x7E,0x01,0x04,0x04,0x05,0x04,0x7F,0x04,0x05,0x04,0x06,0x04,0x00 };

/**************************************************************************** 函数功能:LCD延时程序 入口参数:t 出口参数:

****************************************************************************/

void LCDdelay(unsigned int t) { unsigned int i,j; for(i=0;i

/**************************************************************************** 状态检查,LCD是否忙

*****************************************************************************/ void CheckState() {

unsigned char dat,DATA;//状态信息(判断是否忙)

LCDDi=0; // 数据\\指令选择,D/I(RS)=\,表示 DB7∽DB0 为显示指令数据 LCDRW=1; //R/W=\,E=\数据被读到DB7∽DB0 do {

DATA=0x00;

LCDEnable=1; //EN下降源 LCDdelay(2);//延时 dat=DATA; LCDEnable=0;

dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号) }

while(!(dat==0x00)); }

/***************************************************************************** 函数功能:写命令到LCD程序,RS(DI)=L,RW=L,EN=H,即来一个脉冲写一次 入口参数:cmdcode 出口参数:

*****************************************************************************/ void write_com(unsigned char cmdcode) {

CheckState();//检测LCD是否忙 LCDDi=0; LCDRW=0; P0=cmdcode; LCDdelay(2); LCDEnable=1; LCDdelay(2); LCDEnable=0; }

/***************************************************************************** 函数功能:LCD初始化程序

入口参数: 出口参数:

*****************************************************************************/ void init_lcd() { LCDdelay(100); LCDMcs=1;//刚开始关闭两屏 LCDScs=1; LCDdelay(100); write_com(LCDLCDDisp_Off); //写初始化命令 write_com(Page_Add+0); write_com(Start_Line+0); write_com(LCDCol_Add+0); write_com(LCDLCDDisp_On); }

/***************************************************************************** 函数功能:写数据到LCD程序,RS(DI)=H,RW=L,EN=H,即来一个脉冲写一次 入口参数:LCDDispdata 出口参数:

*****************************************************************************/ void write_data(unsigned char LCDDispdata) {

CheckState();//检测LCD是否忙 LCDDi=1; LCDRW=0; P0=LCDDispdata; LCDdelay(2); LCDEnable=1; LCDdelay(2); LCDEnable=0; }

/***************************************************************************** 函数功能:清除LCD内存程序 入口参数:pag,col,hzk 出口参数:

*****************************************************************************/ void Clr_Scr() { unsigned char j,k; LCDMcs=0; //左、右屏均开显示 LCDScs=0;

write_com(Page_Add+0); write_com(LCDCol_Add+0);

for(k=0;k<8;k++)//控制页数0-7,共8页 {

write_com(Page_Add+k); //每页每页进行写

for(j=0;j<64;j++) //每页最多可写32个中文文字或64个ASCII字符 {

write_com(LCDCol_Add+j); write_data(0x00);//控制列数0-63,共64列,写点内容,列地址自动加1 } } }

/***************************************************************************** 函数功能:指定位置显示汉字16*16程序 入口参数:page,column,hzk 出口参数:

*****************************************************************************/ void hz_LCDDisp16(unsigned char page,unsigned char column, unsigned char code *hzk) { unsigned char j=0,i=0; for(j=0;j<2;j++) { write_com(Page_Add+page+j); write_com(LCDCol_Add+column); for(i=0;i<16;i++) write_data(hzk[16*j+i]); } }

void main() { init_lcd(); Clr_Scr(); LCDMcs=0; //左屏开显示 LCDScs=1; hz_LCDDisp16(0,48,Hz_xu);// Hz_Wo为某个汉字的首地址 LCDMcs=1; //右屏开显示 LCDScs=0;

hz_LCDDisp16(0,0,Hz_ping); while(1) { } }

3.2图形显示

我选了一张128x64的图片在字模软件中生产相应的C代码,将C代码写入到程序中。 由于液晶由两个控制芯片来控制,所以有片选信号端口CS1和CS2。我在字体显示程序中

把改了显示那一块的代码,主程序中改了片选信号。开始同时将左右屏都开了,显示事,左右屏同时显示一样的图形,并且显示的图形不完整。主程序中显示部分的程序不对,我想了后,将主程序中程序改了一下,先开左屏调用左屏显示函数,在关左屏开右屏调用右屏显示函数。最后显示成功。如图4所示。

图4 图形显示

代码如下所示: #include

#define LCDLCDDisp_Off 0x3e #define LCDLCDDisp_On 0x3f #define Page_Add 0xb8//ye

#define LCDCol_Add 0x40//lie #define Start_Line 0xC0//hang /*****液晶显示器的端口定义*****/ #define data_ora P0 /*液晶数据总线*/ sbit LCDMcs=P2^1 ; /*片选1*/ sbit LCDScs=P2^2 ; /*片选2*/ sbit RESET=P2^3 ; /*复位信号*/

sbit LCDDi=P2^4 ; /*数据/指令 选择*/ sbit LCDRW=P2^5 ; /*读/写 选择*/ sbit LCDEnable=P2^6 ; /*读/写 使能*/

char code Hz[]= {

/*------------------------------------------------------------------------------

源文件 / 文字 : F:\\LD测试仪\\液晶\\字模提取+排版软件\\液晶字模提取\\图例\\yema.bmp萍

宽×高(像素): 128×64

字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/1024字节 数据转换日期 : 2010-7-29 9:09:37

------------------------------------------------------------------------------*/

0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x90,0xD0,0x78,0xF8,0xF8,0xF8,0xF0,0xF0,0xF0,0xE0,0xE0, 0xE0,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x06,0x0F,0x0F,0x07,0x0F,0x0F,0x0F,0xCF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xDD,0x9F,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF0,0x78,0xF8,0xF0,0xE0,0xC0,0xC0,0x80, 0xC0,0xE0,0xE0,0xF0,0xFC,0xFE,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFD,0x3B,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xF8,0xFF,0xFF,0xFC,0x9C,0x3C,0x3D,0x3F,0x7F,0xFD,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0xE1,0xC3,0x87, 0x05,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFE,0xE3,0xF1, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x1F,0x1F,0x78,0xF0,0x00,0x00,0x00,0x01, 0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFE,0xFE,0xFC,0xF8,0xF0,0xE0,0x80,0x80,0x80,0xC0,0xE0,0xFF,0xDF,0x7F,0x1F, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x1F,0x7F,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0x7F,0x7F,0x1F,0x07,0xBF,0xFF,0x3F,0x1F,0x05,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03, 0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x0E,0x0E,0x0E,0x1F,0x1F,0x07,0x9F,0xFF, 0xFF,0x7B,0x61,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x18,0x18,0x1C,0x1E,0x07,0x03,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };

/**************************************************************************** 函数功能:LCD延时程序 入口参数:t 出口参数:

****************************************************************************/ void LCDdelay(unsigned int t) { unsigned int i,j; for(i=0;i

/**************************************************************************** 状态检查,LCD是否忙

*****************************************************************************/ void CheckState() {

DATA=0x00;

LCDEnable=1; //EN下降源 LCDdelay(1);//延时 dat=DATA; LCDEnable=0;

dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号) }

while(!(dat==0x00)); }

/***************************************************************************** 函数功能:写命令到LCD程序,RS(DI)=L,RW=L,EN=H,即来一个脉冲写一次 入口参数:cmdcode 出口参数:

*****************************************************************************/ void write_com(uchar cmdcode) {

CheckState();//检测LCD是否忙 LCDDi=0; LCDRW=0; P0=cmdcode; LCDdelay(1); LCDEnable=1; LCDdelay(1); LCDEnable=0; }

/***************************************************************************** 函数功能:写数据到LCD程序,RS(DI)=H,RW=L,EN=H,即来一个脉冲写一次 入口参数:LCDDispdata 出口参数:

*****************************************************************************/ void write_data(uchar LCDDispdata) {

CheckState();//检测LCD是否忙 LCDDi=1; LCDRW=0; P0=LCDDispdata; LCDdelay(1); LCDEnable=1; LCDdelay(1); LCDEnable=0; }

/***************************************************************************** /***************************************************************************** 函数功能:LCD初始化程序

入口参数: 出口参数:

*****************************************************************************/ void init_lcd() { LCDdelay(1); LCDMcs=1;//刚开始关闭两屏 LCDScs=1; LCDdelay(1); write_com(LCDLCDDisp_Off); //写初始化命令 write_com(Page_Add+0); write_com(Start_Line+0); write_com(LCDCol_Add+0); write_com(LCDLCDDisp_On); }

/************************************************************************** 函数功能:清除LCD内存程序 入口参数:pag,col,hzk 出口参数:

*****************************************************************************/ void Clr_Scr() { uchar j,k; LCDMcs=0; //左、右屏均开显示 LCDScs=0;

write_com(Page_Add+0); write_com(LCDCol_Add+0);

for(k=0;k<8;k++)//控制页数0-7,共8页 { write_com(Page_Add+k); //每页每页进行写

for(j=0;j<64;j++) //每页最多可写32个中文文字或64个ASCII字符 {

write_com(LCDCol_Add+j); write_data(0x00);//控制列数0-63,共64列,写点内容,列地址自动加1 } } }

/***************************************************************************** 函数功能:一行一行显示 入口参数:page,column,hzk 出口参数:

*****************************************************************************/ Disp(uchar page,uchar column, uchar code *word) {

uchar i;

LCDMcs=0; LCDScs=1;

write_com(0xb8|page); write_com(0x40|column); for(i=0;i<16;i++) write_data(word[i]); for(i=32;i<48;i++) write_data(word[i]); for(i=64;i<80;i++) write_data(word[i]); for(i=96;i<112;i++) write_data(word[i]);

LCDMcs=1; LCDScs=0;

write_com(0xb8|page); write_com(0x40); for(i=128;i<144;i++) write_data(word[i]); for(i=160;i<176;i++) write_data(word[i]); for(i=192;i<208;i++) write_data(word[i]); for(i=224;i<240;i++) write_data(word[i]);

LCDMcs=0; LCDScs=1;

write_com(0xb8|page+1); write_com(0x40|column); for(i=16;i<32;i++) write_data(word[i]); for(i=48;i<64;i++) write_data(word[i]); for(i=80;i<96;i++) write_data(word[i]); for(i=112;i<128;i++) write_data(word[i]);

LCDMcs=1; LCDScs=0;

write_com(0xb8|page+1); write_com(0x40); for(i=144;i<160;i++)

write_data(word[i]); for(i=176;i<192;i++) write_data(word[i]); for(i=208;i<224;i++) write_data(word[i]); for(i=240;i<250;i++) write_data(word[i]); }

void main() { init_lcd(); Clr_Scr(); k=0;

for(k=0xc0;k<0xff;k++) { Disp(0,0,hz1); Disp(2,0,hz2); Disp(4,0,hz3); Disp(6,0,hz4); LCDMcs=0; LCDScs=0; write_com(k); LCDdelay(2); } while(1) { } }

4小结

刚开始学液晶时感觉好难,字模就困扰了我好多天。通过看资料查资料,以及看程序搞懂了,通过写程序仿真,对液晶的控制更明白,主要写的是并行数据传输的代码。写了一个汉字的显示,多个汉字显示程序,图形显示的程序,还有汉字动态显示。由于取字模软件运行有点问题,左上角上自动多出一撇,所以显示字或图形的左上角多出一撇。后面写一个汉字一个汉字显示程序并仿真,还有波形显示程序和仿真。


Protues仿真12864液晶显示.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2016年陕西专升本英语真题(1)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: