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向上滚动显示29 4小结38
1 LCD12864简介
ST7920类 这种控制器带中文字库,为用户免除了编制字库的麻烦,该控制器的液2
晶还支持画图方式。该类液晶支持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
BLK
BLA FS RES CS RS DB0-DB7 RD WR V0 VCC GND FG T6963C
S6B0724 GND VCC RS WR RD CS DB0-DB7 RES BLA BLK 12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。可完成图形显示,也可以显示8×4个(16×16点阵>汉字。 管脚名称 管脚功能描述 LEVER 电源地 VSS 0 电源电压 液晶显示器驱动电压 D/I=“H”,表示DB7∽DB0为显示数据 D/I=“L”, 表示DB7∽DB0为显示指令数据 R/W=“H”,E=“H”数据被读到DB7∽DB0 R/W= R/W H/L “L”,E=“H→L”数据被写到IR或DR R/W=“L”,E信号下降沿锁存DB7∽DB0 R/W= E H/L “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 H:选择芯片(右半屏>信号 CS1 H/L H:选择芯片(左半屏>信号 CS2 H/L 复位信号,低电平复位 RET H/L LCD驱动负电压 VOUT -10V 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总线,从检验模块之工作状态。 DFF.显示控制触发器4. 此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示 VDD V0 D/I(RS> +5.0V - H/L DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。 X地址计数器是没有记数功能的,只能用指令设置。 Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。 6.显示数据RAM Z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器为0。 Z地址计数器可以用指令DISPLAY START LINE预置。因此,显示屏幕的起始行就由此指令控制,即DDRAM的数据从哪一行开始显示在屏幕的第一行。此模块的DDRAM共64行,屏幕可以循环滚动显示64行。 12864LCD的指令系统 模块控制芯片提供两套控制命令,基本指令和扩充指令如下: 指令表1: 进入待命模式,执行其他指令都棵终止 待命 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 1 SL X X 0 睡眠 :脱离睡眠模式SL=1. 模式 扩 0 0 0 0 1 CL X RE G 0 CL=充 0/1功能 RE=设定 1: RE=0: G=1/0 设定0 0 1 0 0 0 ACACACAC设绘RAM ACACAC3 2 1 0 定图 地6 5 4 ACACACAC绘址 3 2 1 0 图先设定垂直再设定水平将以上 4/位数扩充指令操基本指令操:绘图开RAM地AC6AC5…AC地AC3AC2AC1AC01位地址连续写入即 备注:当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缓冲区 显示原理 2.1汉字和英文显示原理 在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,因为英文字母种类很少,只需要8位<一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。 那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示: 图1 “A”字模图 所示:2在字模中的记载却如图”你“而中文的 图2 “你”字模图 根据芯片的不同取模的方式不同,有多种取模方式:单色点阵液晶字模,横向取模,字节正序,单色点阵液晶字模,横向取模,字节倒序,单色点阵液晶字模,纵向取模,字节正序,单色点阵液晶字模,纵向取模,字节倒序等等。 2.2图形显示 先设垂直地址再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址> 垂直地址范围 AC5...AC0 水平地址范围 AC3…AC0 绘图RAM 的地址计数器 但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定。GDRAM的坐标地址与资料排列顺序如下图: 2.3应用说明 用带中文字库的128X64显示模块时应注意以下几点: ①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显 示地址,再写入中文字符编码。 ②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。 ③当字符编码为2字节时,应先写入高位字节,再写入低位字节。 ④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。 ⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。 2.4指令描述 1、显示开/关设置 CODE: D/I DB7 DB6 DB5 DB4 R/W L L L L H H DB3 DB2 DB1 DB0 H H H H/L 功能:设置屏幕显示开/关。 DB0=H,开显示;DB0=L,关显示。不影响显示RAM(DD RAM>中的内容。 2、设置显示起始行 CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L H H 行地址<0-63) 功能:执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。 3、设置页地址 CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L H L H H H 页地址<0-7) 功能:执行本指令后,下面的读写操作将在指定页内,直到重新设置。页地址就是DD RAM 的行地址,页地址存储在X地址计数器中,A2-A0可表示8页,读写数据对页地址没有影响,除本指令可改变页地址外,复位信号(RST>可把页地址计数器 内容清零。 DD RAM地址映像表 Y 地址 0 1 2 ……………………… 61 62 63 DB0 X=0 ∫ PAGE0 DB7 DB0 X=1 ∫ PAGE1 DB7 ∷ ∷ ∷ ∷ DB0 X=7 ∫ PAGE6 DB7 DB0 X=8 ∫ PAGE7 DB7 4、设置列地址 CODE: R/W D/I DB7 DB6 DB5 DB4 L L L H DB3 DB2 DB1 DB0 列地址<0-63) 功能: DD RAM 的列地址存储在Y地址计数器中,读写数据对列地址有影响,在对DD RAM进行读写操作后,Y地址自动加一。 5、状态检测 CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 H L BF L ON/OFF RET L L L L 功能:读忙信号标志位(BF>、复位标志位(RST>以及显示状态位(ON/OFF>。 BF=H:内部正在执行操作; BF=L:空闲状态。 RST=H:正处于复位初始化状态; RST=L:正常状态。 ON/OFF=H:表示显示关闭; ON/OFF=L:表示显示开。 6、写显示数据 CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L H D7 D6 D5 D4 D3 D2 D1 D0 功能:写数据到DD RAM,DD RAM是存储图形显示数据的,写指令执行后Y地址计数器自动加1。D7-D0位数据为1表示显示,数据为0表示不显示。写数据到DD RAM前,要先执行“设置页地址”及“设置列地址”命令。 7、读显示数据 CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 H H D7 D6 D5 D4 D3 D2 D1 D0 功能:从DD RAM读数据,读指令执行后Y地址计数器自动加1。从DD RAM读数据前要先执行“设置页地址” 及“设置列地址”命令。 8、屏幕显示与DD RAM地址映射关系 Y1 Y2 Y3 Y4 …………Y62 Y63 Y64 …………1/0 1/0 1/0 DB0 Line 0 1/0 1/0 1/0 1/0 X=0 Line 1 1/0 1/0 1/0 1/0 1/0 1/0 1/0 DB1 ………… Line 2 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB2 Line 3 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB3 Line 4 1/0 1/0 1/0 1/0 1/0 1/0 1/0 DB4 ………… Line 5 1/0 1/0 1/0 1/0 1/0 1/0 1/0 DB5 ………… Line 6 1/0 1/0 1/0 1/0 ………… 1/0 1/0 1/0 DB6 ………… Line 7 1/0 1/0 1/0 1/0 1/0 1/0 1/0 DB7 ………… ………… ………… ………… Line60 1/0 1/0 1/0 1/0 1/0 1/0 1/0 DB4 X=7 ………… Line61 1/0 1/0 1/0 1/0 1/0 1/0 1/0 DB5 ………… 1/0 1/0 1/0 DB6 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 3软件仿真 3.1汉字显示 在Protues软件中选择所需元件,搭建的电路图如图1所示。 图1 仿真硬件原理图 所示。2将编写的代码烧写到单片机里,运行液晶显示不正常,如图 图2 运行图 开始我还以为是程序问题,把程序看了又看,改了又改,显示结果还是一样。后来问了下张勇生,出现这种情况的原因是P0口没接上拉电阻。因为P0口是开漏的,不管它的驱动能力多大,相当于它是没有电源的,需要外部的电路提供,绝大多数情况下P0口是必需加上拉电阻的。接上拉电阻后,重新运行这下运行正常了,如图3所示。 3正常显示图 代码如下所示:#include 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字节 数据转换日期 : 2018-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字节 数据转换日期 : 2018-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 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字节 数据转换日期 : 2018-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(> { unsigned char dat,DATA。//状态信息<判断是否忙) LCDDi=0。 // 数据\\指令选择,D/I 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 } } } void main(> { init_lcd(>。 Clr_Scr(>。 LCDMcs=0。 //左屏开显示 LCDScs=1。 Bmp_Left_Disp(0,0,Hz>。 LCDMcs=1。 //右屏开显示 LCDScs=0。 Bmp_Right_Disp(0,0,Hz>。 while(1> { } } 3.3同时显示多个汉字 用字模软件取模后通过改写软件,仿真图形如图5所示。 图5 显示多个汉字的仿真图 代码如下所示: #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 。 /*读/写 使能*/ unsigned char code Bmp1[]= { /*----------------------------------------------------------------------------- 源文件 / 文字 : 来自剪贴板!武汉理工大学 宽×高<像素): 128×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/256字节 数据转换日期 : 2018-7-29 17:52:57 显示的汉字:武汉理工大学 ------------------------------------------------------------------------------*/ 0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x20,0x24,0x24,0x24,0xE4,0x24,0x20,0x20,0xFE,0x20,0x24,0x28,0x20, 0x00,0x20,0xC2,0x0C,0x80,0x60,0x04,0x7C,0x84,0x04,0x04,0xC4,0x3E,0x04,0x00,0x00, 0x88,0x88,0xF8,0x88,0x88,0x00,0xFC,0x24,0x24,0xFC,0x24,0x24,0xFE,0x04,0x00,0x00, 0x08,0x08,0x08,0x08,0x08,0xF8,0x08,0x08,0x08,0x08,0x0C,0x08,0x00,0x00,0x20,0x20, 0x20,0x20,0x20,0x20,0xFE,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x40,0x30,0x10, 0x52,0x5C,0x50,0x52,0x5C,0x50,0xD8,0x56,0x10,0x50,0x30,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x60,0x3F,0x20,0x20,0x1F,0x12,0x12,0x10,0x07,0x18,0x20,0x40,0x78, 0x00,0x04,0x04,0x7E,0x41,0x40,0x20,0x10,0x0B,0x04,0x0B,0x10,0x20,0x60,0x20,0x00, 0x10,0x30,0x1F,0x08,0x48,0x40,0x4B,0x49,0x49,0x7F,0x49,0x49,0x6B,0x40,0x08,0x20, 0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x40,0 x40, 0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x20,0x60,0x20,0x00,0x04,0x04,0x04, 0x04,0x04,0x24,0x44,0x3F,0x05,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }。 unsigned char code Bmp2[]= { /*------------------------------------------------------------------------------ 源文件 / 文字 : 信息项目学院 宽×高<像素): 128×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/256字节 数据转换日期 : 2018-7-29 18:34:04 显示的汉字:信息项目学院 ------------------------------------------------------------------------------*/ 0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x40,0xF0,0x0E,0x00,0x28,0x28,0x28,0x2A,0x2C,0x28,0x28,0x28,0x08,0x00, 0x00,0x00,0x00,0xF8,0xA8,0xAC,0xAA,0xA8,0xA8,0xA8,0xFC,0x08,0x00,0x00,0x00,0x00, 0x08,0x08,0x08,0x08,0x08,0xF8,0x08,0x08,0x08,0x08,0x0C,0x08,0x00,0x00,0x20,0x24, 0xA4,0xFC,0x26,0x24,0x00,0x7C,0x24,0x24,0x24,0x24,0x7C,0x00,0x00,0x40,0x30,0x10, 0x52,0x5C,0x50,0x52,0x5C,0x50,0xD8,0x56,0x10,0x50,0x30,0x00,0x00,0xFC,0x04,0x64, 0x9C,0x20,0x58,0x48,0x4A,0x4C,0x48,0x48,0x18,0x08,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7F,0x00,0x00,0x01,0x7D,0x25,0x25,0x25,0x25,0x7D,0x01,0x00,0x00, 0x00,0x20,0x18,0x03,0x3A,0x42,0x46,0x5A,0x42,0x42,0x73,0x00,0x08,0x30,0x00,0x20, 0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x08,0x06, 0x01,0x7F,0x01,0x42,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x41,0x00,0x04,0x04,0x04, 0x04,0x04,0x24,0x44,0x3F,0x05,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x7F,0x04,0 x08, 0x47,0x41,0x21,0x1F,0x01,0x01,0x3F,0x41,0x41,0x79,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }。 unsigned char code Bmp3[]= { /*------------------------------------------------------------------------------ 源文件 / 文字 : 通信项目 宽×高<像素): 128× 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/256字节 数据转换日期 : 2018-7-29 18:36:04 显示汉字:通信项目 ------------------------------------------------------------------------------*/ 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,0x40,0x42, 0xCC,0x00,0x00,0xF4,0x54,0x5C,0xF4,0x5C,0x56,0xF4,0x00,0x00,0x00,0x80,0x40,0xF0, 0x0E,0x00,0x28,0x28,0x28,0x2A,0x2C,0x28,0x28,0x28,0x08,0x00,0x00,0x08,0x08,0x08, 0x08,0x08,0xF8,0x08,0x08,0x08,0x08,0x0C,0x08,0x00,0x00,0x20,0x24,0xA4,0xFC,0x26, 0x24,0x00,0x7C,0x24,0x24,0x24,0x24,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10, 0x0F,0x10,0x20,0x5F,0x42,0x42,0x5F,0x42,0x52,0x5F,0x40,0x40,0x00,0x00,0x00,0x7F, 0x00,0x00,0x01,0x7D,0x25,0x25,0x25,0x25,0x7D,0x01,0x00,0x00,0x20,0x20,0x20,0x20, 0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,0x08,0x06,0x01,0x7F,0x01, 0x42,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }。 unsigned char code Bmp4[]= { /*------------------------------------------------------------------------------ 源文件 / 文字 : 0606班 宽×高<像素): 128×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/256字节 数据转换日期 : 2018-7-29 18:37:59 显示的汉字:0606班 ------------------------------------------------------------------------------*/ 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,0xC0,0x20,0x10,0x10,0x20,0xC0,0x00,0x00,0xC0, 0x20,0x10,0x10,0x30,0x00,0x00,0x00,0xC0,0x20,0x10,0x10,0x20,0xC0,0x00,0x00,0xC0, 0x20,0x10,0x10,0x30,0x00,0x00,0x44,0x44,0xFC,0x44,0x04,0xC0,0x00,0xFE,0x84,0x84, 0xFC,0x84,0x84,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x1F, 0x22,0x21,0x21,0x21,0x1E,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x1F, 0x22,0x21,0x21,0x21,0x1E,0x00,0x10,0x10,0x0F,0x48,0x28,0x11,0x08,0x27,0x20,0x20, 0x3F,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00 }。 /**************************************************************************** 函数功能: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 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 } } } /***************************************************************************** 函数功能:左屏位置显示 入口参数:page,column,hzk 出口参数: *****************************************************************************/ void Bmp_Left_Disp(unsigned char page,unsigned char column, unsigned char code *Bmp> { 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<64。i++> write_data(Bmp[128*j+i]>。 } } /***************************************************************************** 函数功能:右屏位置显示 入口参数:page,column,hzk 出口参数: *****************************************************************************/ void Bmp_Right_Disp(unsigned char page,unsigned char column, unsigned char code *Bmp> { 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=64。i<128。i++> write_data(Bmp[128*j+i]>。 } } void main(> { init_lcd(>。 Clr_Scr(>。 LCDMcs=0。 //左屏开显示 LCDScs=1。 Bmp_Left_Disp(0,0,Bmp1>。// Bmp1为某个汉字的首地址 Bmp_Left_Disp(2,0,Bmp2>。 Bmp_Left_Disp(4,0,Bmp3>。 Bmp_Left_Disp(6,0,Bmp4>。 LCDMcs=1。 //右屏开显示 LCDScs=0。 Bmp_Right_Disp(0,0,Bmp1>。 Bmp_Right_Disp(2,0,Bmp2>。 Bmp_Right_Disp(4,0,Bmp3>。 Bmp_Right_Disp(6,0,Bmp4>。 while(1> { } } 3.4向上滚动显示 仿真图形如图6所示。 )开始滚动显示 #define uchar unsigned char #define uint unsigned int #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 。 /*读/写 使能*/ uchar *tab。 uint k=0。 uchar code hz1[]= { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 /*------------------------------------------------------------------------------ 源文件 / 文字 : 武 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:50:18 ------------------------------------------------------------------------------*/ 0x10,0x50,0x34,0x14,0x1C,0xD4,0x16,0x14,0x10,0x7F,0x90,0x12,0x14,0x10,0x10,0x00, 0x40,0x40,0x7F,0x20,0x20,0x1F,0x11,0x11,0x01,0x00,0x07,0x18,0x20,0x40,0xF0,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 汉 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:51:45 ------------------------------------------------------------------------------*/ 0x10,0x60,0x21,0x96,0x68,0x04,0x1E,0xE4,0x04,0x04,0x04,0xE4,0x1C,0x04,0x00,0x00, 0x04,0x04,0x7E,0x01,0x40,0x20,0x20,0x10,0x0B,0x04,0x0B,0x10,0x30,0x60,0x20,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 理 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:52:29 ------------------------------------------------------------------------------*/ 0x44,0x44,0xFC,0x54,0x4C,0x04,0xFE,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00, 0x10,0x10,0x0F,0x08,0x48,0x40,0x45,0x44,0x44,0x7F,0x44,0x44,0x44,0x45,0x40,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 工 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:53:19 ------------------------------------------------------------------------------*/ 0x00,0x40,0x22,0x12,0x0A,0x06,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 大 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:53:53 ------------------------------------------------------------------------------*/ 0x20,0x60,0x20,0x30,0x28,0x24,0xA2,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00, 0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 学 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:54:23 ------------------------------------------------------------------------------*/ 0x40,0x70,0x30,0x12,0x5C,0x54,0x52,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,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 }。 uchar code hz2[]= { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 信 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:56:07 ------------------------------------------------------------------------------*/ 0x80,0x40,0x30,0xFC,0x0F,0x0E,0xAA,0xA8,0xA9,0xAE,0xAA,0xA8,0xA8,0x08,0x08,0x00, 0x00,0x00,0x00,0x7F,0x00,0x00,0x7E,0x22,0x22,0x22,0x22,0x22,0x7E,0x00,0x00,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 息 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:56:47 ------------------------------------------------------------------------------*/ 0x00,0x40,0x20,0xFC,0x5C,0x54,0x56,0x55,0x54,0x54,0x54,0xFC,0x00,0x00,0x00,0x00, 0x00,0x20,0x38,0x01,0x3D,0x41,0x41,0x45,0x59,0x41,0x41,0x71,0x00,0x08,0x30,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 工 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:57:52 ------------------------------------------------------------------------------*/ 0x00,0x40,0x22,0x12,0x0A,0x06,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 程 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:58:28 ------------------------------------------------------------------------------*/ 0x10,0x52,0xF2,0xFE,0x99,0x15,0x82,0xBF,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x00, 0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x40,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 学 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:59:06 ------------------------------------------------------------------------------*/ 0x40,0x70,0x30,0x12,0x5C,0x54,0x52,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 院 16 ×: 16像素)<宽×高 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:59:51 ------------------------------------------------------------------------------*/ 0xFE,0x42,0x32,0x5A,0x8E,0x0C,0x26,0x24,0x25,0x26,0x24,0x24,0x24,0x0C,0x04,0x00, 0xFF,0x00,0x02,0x04,0x83,0x41,0x31,0x0F,0x01,0x01,0x7F,0x81,0x81,0x81,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, }。 uchar code hz3[]= { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 通 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 16:02:05 ------------------------------------------------------------------------------*/ 0x40,0x41,0xE6,0x10,0x08,0xF6,0x52,0x52,0x56,0xFA,0x5A,0x56,0xF2,0x00,0x00,0x00, 0x40,0x20,0x1F,0x20,0x40,0x5F,0x42,0x42,0x42,0x5F,0x4A,0x52,0x4F,0x40,0x40,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 信 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 16:02:40 ------------------------------------------------------------------------------*/ 0x80,0x40,0x30,0xFC,0x0F,0x0E,0xAA,0xA8,0xA9,0xAE,0xAA,0xA8,0xA8,0x08,0x08,0x00, 0x00,0x00,0x00,0x7F,0x00,0x00,0x7E,0x22,0x22,0x22,0x22,0x22,0x7E,0x00,0x00,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 工 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:57:52 ------------------------------------------------------------------------------*/ 0x00,0x40,0x22,0x12,0x0A,0x06,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 程 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 15:58:28 ------------------------------------------------------------------------------*/ 0x10,0x52,0xF2,0xFE,0x99,0x15,0x82,0xBF,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x00, 0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }。 uchar code hz4[]= { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 许 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 16:05:36 ------------------------------------------------------------------------------*/ 0x40,0x41,0x6E,0xD4,0x08,0x44,0x32,0x0F,0x08,0x08,0xF8,0x08,0x08,0x08,0x00,0x00, 0x00,0x00,0x00,0x7F,0x20,0x11,0x01,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x01,0x00, /*------------------------------------------------------------------------------ 源文件 / 文字 : 萍 宽×高<像素): 16×16 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节倒序/32字节 数据转换日期 : 2018-7-31 16:06:07 ------------------------------------------------------------------------------*/ 0x84,0x54,0x64,0x34,0x0C,0xAF,0x26,0x24,0x24,0xFF,0x24,0x24,0xE4,0xA4,0x04,0x00, 0x10,0x13,0xF9,0x06,0x00,0x08,0x09,0x0A,0x08,0xFF,0x08,0x0A,0x09,0x08,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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(uchar x> { 。 int d uchar y。 for(y=0。y /**************************************************************************** 状态检查,LCD是否忙 *****************************************************************************/ void CheckState(> { uchar dat,DATA。//状态信息<判断是否忙) LCDDi=0。 // 数据\\指令选择,D/I 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]>。 。i<64。for(i=48. write_data(word[i]>。 for(i=80。i<96。i++> write_data(word[i]>。 for(i=112。i<128。i++> 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小结 刚开始学液晶时感觉好难,字模就困扰了我好多天。通过看资料查资料,以及看程序搞懂了,通过写程序仿真,对液晶的控制更明白,主要写的是并行数据传输的代码。写. 了一个汉字的显示,多个汉字显示程序,图形显示的程序,还有汉字动态显示。因为取字模软件运行有点问题,左上角上自动多出一撇,所以显示字或图形的左上角多出一撇。后面写一个汉字一个汉字显示程序并仿真,还有波形显示程序和仿真。 因篇幅问题不能全部显示,请点此查看更多更全内容