带字库12864液晶详解

更新时间:2024-05-08 18:41:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

12864液晶

一、概述

带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,

内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字.

也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 基本特性:

l 低电源电压(VDD:+3.0--+5.5V) l 显示分辨率:128×64点 l 内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)

l 内置 128个16×8点阵字符 l 2MHZ时钟频率

l 显示方式:STN、半透、正显 l 驱动方式:1/32DUTY,1/5BIAS l 视角方向:6点 l 背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10

l 通讯方式:串行、并口可选

l 内置DC-DC转换电路,无需外加负压 l 无需片选信号,简化软件设计

l 工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃

模块接口说明

1

*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。 2.2并行接口 管脚号 管脚名称 1 VSS 2 VCC 3 V0 4

RS(CS) 5

R/W(SID) 6 7 8 9 10

电平 0V 3.0+5V - H/L

管脚功能描述 电源地 电源正

对比度(亮度)调整

RS=“H”,表示DB7——DB0为显示数据 RS=“L”,表示DB7——DB0为显示指令数据 R/W=“H”,E=“H”,数据被读到DB7——DB0

H/L H/L H/L H/L H/L H/L

E(SCLK) DB0 DB1 DB2 DB3

R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR

使能信号 三态数据线 三态数据线 三态数据线 三态数据线

2

11 12 13 14 15 DB4 DB5 DB6 DB7 PSB H/L H/L H/L H/L H/L 三态数据线 三态数据线 三态数据线 三态数据线

H:8位或4位并口方式,L:串口方式(见注释1) 16 NC

17 /RESET 18 VOUT 19 A 20

K

- 空脚

H/L 复位端,低电平有效(见注释2) - LCD驱动电压输出端

VDD 背光源正端(+5V)(见注释3) VSS

背光源负端(见注释3)

3

4

*注释1:如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接。

*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。 四.模块主要硬件构成说明 控制器接口信号说明:

1、RS,R/W的配合选择决定控制界面的4种模式:

RS L L H H 2、E信号 E状态 高——>低 高 低/低——>高 执行动作 I/O缓冲——>DR DR——>I/O缓冲 无动作 结果 配合/W进行写数据或指令 配合R进行读数据或指令 R/W L H L H 功能说明 MPU写指令到指令暂存器(IR) 读出忙标志(BF)及地址记数器(AC)的状态 MPU写入数据到数据暂存器(DR) MPU从数据暂存器(DR)中读出数据 ● 忙标志:BF

BF标志提供内部工作情况.BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据. 利用STATUS RD 指令,可以将BF读到DB7总线,从而检验模块之工作状态.● 字型产生ROM(CGROM)

字型产生ROM(CGROM)提供8192个此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY ON),DDRAM

的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。 DFF 的状态是指令DISPLAY ON/OFF和RST信号控制的。●

显示数据RAM(DDRAM)模块内部显示数据RAM提供64×2个位元组的空间,最多可控制4行16字(64个字)的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM字型及CGROM的中文字型,三种字型的选择,由在DDRAM中写入的编码选择,在0000H—0006H的编码中(其代码分别是0000、0002、0004、0006共4个)将选择CGRAM的自定义字型,02H—7FH的编码中将选择半角英数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组的

5

编码形成中文字型的编码BIG5(A140—D75F),GB(A1A0-F7FFH)。

● 字型产生RAM(CGRAM) 字型产生RAM提供图象定义(造字)功能,

可以提供四组16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一样地通过DDRAM显示在屏幕中。●

地址计数器AC地址计数器是用来贮存DDRAM/CGRAM之一的地址,它可由设定指令暂存器来改变,之后只要读取或是写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一,当RS为“0”时而R/W为“1”时,地址计数器的值会被读取到DB6——DB0中。

● 光标/闪烁控制电路

此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置。

原理的另一半在12864液晶 原理-2中

五、指令说明

模块控制芯片提供两套控制命令,基本指令和扩充指令如下: 指令表1:(RE=0:基本指令)

指 指 令 码 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 令 清除 0 0 0 0 0 0 0 0 0 1 显示 地址 功 能 将DDRAM填满\并且设定DDRAM的地址计数器(AC)到\设定DDRAM的地址计数器(AC)到0 0 0 0 0 0 0 0 1 X \并且将游标移到开头原点位归位 置;这个指令不改变DDRAM 的内容 D=1: 整体显示 ON 显示状态开/0 0 0 0 0 0 1 D C B C=1: 游标ON 关 B=1:游标位置反白允许 进入点 指定在数据的读取与写入时,设0 0 0 0 0 0 0 1 I/D S 定游标的移动方向及指定显示设定 的移位 游标或设定游标的移动与显示的移位R/L X X 0 0 0 0 0 1 S/C 显示移控制位;这个指令不改变DDRAM

6

位控制 功能 的内容 DL=0/1:4/8位数据 0 0 0 0 1 DL X RE X X RE=1: 扩充指令操作 设定 RE=0: 基本指令操作 设定CGRAM 地址 设定DDRAM 地址 第二行:90H-97H 读取忙读取忙标志(BF)可以确认内部标志和0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 动作是否完成,同时可以读出地地址 址计数器(AC)的值 写数据1 0 数据 将数据D7——D0写入到内部的到RAM RAM (DDRAM/CGRAM/IRAM/GRAM) 读出1 1 数据 从内部RAM读取数据D7——D0 RAM的(DDRAM/CGRAM/IRAM/GRAM) 值 0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 设定CGRAM 地址 设定DDRAM 地址(显示位址) 0 0 1 0 AC5 AC4 AC3 AC2 AC1 AC0 第一行:80H-87H 指令表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

7

眠 模式 扩充 功能 设定 设定绘图RAM 0 地址 0 0 1 0 0 0 0 0 1 CL X RE G 0 SL=1:脱离睡眠模式 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标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。

应用举例:

1 、使用前的准备

先给模块加上工作电压,再按照下图的连接方法调节LCD的对比度,使其显示出黑色的底影。

此过程亦可以初步检测LCD有无缺段现象。

2、字符显示

带中文字库的128X64-0402B每屏可显示4行8列共32个16×16点阵的汉字,每个显示RAM可显示1个中文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。带中文字库

8

的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 88H 98H 81H 91H 89H 99H 82H 92H 8AH 9AH 83H 93H 8BH 9BH 84H 94H 8CH 9CH 85H 95H 8DH 9DH 86H 96H 8EH 9EH 87H 97H 8FH 9FH 3 、图形显示

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

垂直地址范围 AC5...AC0 水平地址范围 AC3?AC0

绘图RAM 的地址计数器(AC)只会对水平地址(X 轴)自动加一,当水平地址=0FH 时会重新设为00H但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定。GDRAM的坐标地址与资料排列顺序如下图:

3、应用说明

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

①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设

9

定显示地址,再写入中文字符编码。

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

③当字符编码为2字节时,应先写入高位字节,再写入低位字节。 ④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。 五、指令描述 1、显示开/关设置 CODE:

R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 L L L L H H 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 10

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 DB3 DB2 DB1 DB0 L L L H 列地址(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 RST 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: RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 H H D7 D6 D5 D4 D3 D2 D1 D0

11

功能:从DD RAM读数据,读指令执行后Y地址计数器自动加1。从DD RAM读数据前要先执行“设置页地址” 及“设置列地址”命令。 六、接口时序 1.写操作时序

时序1

4. 读操作时序

12

时序2 时序参数表: 名称 符号 最小值 典型值 最大值 单位 E周期时间 Tcyc 1000 ns E高电平宽度 Pweh 450 ns E低电平宽度 Pwel 450 ns E上升时间 Tr 25 ns E下降时间 Tf 25 ns 地址建立时间 Tas 140 ns 地址保持时间 taw 10 ns 数据建立时间 Tdsw 200 ns 数据延迟时间 Tddr 320 ns 写数据保持时间 Tdhw 10 ns 读数据保持时间 Tdhr 20 ns 七、屏幕显示与DD RAM地址映射关系 Y1 Y2 Y3 Y4 ???? Y62 Y63 Y64 X=0 Line 0 1/0 1/0 1/0 1/0 ???? 1/0 1/0 1/0 DB0 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 ???? ???? ???? X=7 Line60 1/0 1/0 1/0 1/0 ???? 1/0 1/0 1/0 DB4 Line61 1/0 1/0 1/0 1/0 ???? 1/0 1/0 1/0 DB5 Line62 1/0 1/0 1/0 1/0 ???? 1/0 1/0 1/0 DB6 Line63 1/0 1/0 1/0 1/0 ???? 1/0 1/0 1/0 DB7

12864液晶 串行口传输进行图象显示程序-C语言

2007年10月10日 星期三 下午 10:09 #include

#define uint unsigned int #define uchar unsigned char #define x1 0x80

13

#define x2 0x88 #define y 0x80 #define comm 0 #define dat 1 sbit std = P2^1; sbit sclk = P2^2;

uchar code tab1[]={ \本系列中文模块内\\任意位置反白显示\\置二级字库,可在\\使用更方便更灵活\};

uchar code tab32[]={

/*-- 调入了一幅图像:F:\\梁\\画图\\HOCO12832.bmp --*/ /*-- 宽度x高度=128x32 --*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x00,0x01,0x00,0x00,0x00,0x00,

0x01,0xFF,0x80,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x13,0x10,0x03,0xFE,0x00,

0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x3F,0x30,0x1F,0xFF,0xC0,

0x03,0xFF,0xE0,0x00,0x00,0x00,0x00,0x8C,0x03,0xF0,0x00,0x7F,0xE0,0x7C,0x01,0xE0,

0x03,0xFF,0xF0,0x00,0x00,0x00,0x01,0x36,0x06,0xC0,0x00,0x5F,0xC0,0xFF,0xFC,0x60,

0x01,0xFF,0xF0,0x00,0x00,0x00,0x02,0x1B,0x0F,0x80,0x00,0xFF,0x01,0xFE,0x0F,0x30,

0x00,0xEF,0xF0,0x00,0x00,0x00,0x02,0x6D,0x9F,0x00,0x00,0x3E,0x03,0xFF,0xF1,0x90,

0x00,0xFF,0xF8,0x00,0x00,0x00,0x04,0x36,0xFE,0x00,0x01,0xFF,0x07,0xFF,0xFC,0x90,

0x00,0xEF,0xFF,0xFF,0x80,0x00,0x04,0xDB,0x7E,0x00,0x03,0xFF,0x87,0xFF,0xFC,0xD0,

0x00,0x0F,0xFF,0xFF,0xC0,0x00,0x04,0x6D,0xFC,0x00,0x07,0xFF,0x8F,0xFF,0xFE,0x50,

0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x36,0xFC,0x10,0x07,0xFF,0x8F,0xFF,0xFE,0x90,

14

0x00,0x0F,0xFF,0xFF,0xE0,0x00,0x04,0x1B,0xF8,0x10,0x07,0xFF,0xCF,0xFF,0xFE,0x80,

0x00,0x0F,0xFF,0xFF,0xF0,0x00,0x04,0x0F,0xF8,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,

0x00,0x07,0xFF,0xFF,0xF0,0x00,0x04,0x07,0xF0,0x10,0x07,0xFF,0xFF,0xFF,0xFA,0x00,

0x00,0xFF,0xFF,0xFF,0xF8,0x00,0x02,0x03,0xF0,0x20,0x07,0xFF,0xFF,0xFF,0xBA,0x00,

0x00,0xFD,0xFF,0xFF,0xFC,0x00,0x02,0x03,0xF0,0x20,0x03,0xFF,0xFF,0xDF,0xB8,0x00,

0x00,0xC1,0xC0,0x3F,0xFC,0x00,0x01,0x01,0xE0,0x40,0x00,0xFF,0xFF,0xDF,0xB0,0x00,

0x00,0x81,0xC0,0x3F,0xCE,0x00,0x00,0x81,0xE0,0x80,0x00,0x7F,0xFF,0xDF,0xA0,0x00,

0x00,0x81,0x80,0x1D,0xCF,0x00,0x00,0x41,0xE1,0x00,0x00,0x3F,0xFF,0x9B,0x00,0x00,

0x01,0x83,0x80,0x1F,0xC7,0x80,0x00,0x21,0xE2,0x00,0x00,0x1F,0xFD,0xB6,0x00,0x00,

0x01,0xC3,0x00,0x0E,0xE6,0x80,0x00,0x19,0xEC,0x00,0x00,0x07,0xFE,0x20,0x00,0x00,

0x00,0xC3,0x00,0x07,0x67,0x40,0x00,0x07,0xF0,0x00,0x00,0x03,0x3E,0x00,0x00,0x00,

0x00,0x02,0x00,0x03,0xE7,0xA0,0x00,0x00,0x00,0x00,0x00,0x02,0x8E,0x00,0x00,0x00,

0x00,0x06,0x00,0x03,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x00,

0x00,0x06,0x00,0x07,0x03,0x00,0x77,0x46,0x74,0x24,0x80,0x06,0x04,0x00,0x00,0x00,

0x00,0x1C,0x00,0x06,0x00,0x00,0x55,0x45,0x54,0x57,0x80,0x00,0x00,0x00,0x00,0x00,

0x00,0x1C,0x00,0x0E,0x00,0x00,0x45,0x45,0x74,0x57,0x80,0x08,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x1C,0x00,0x00,0x55,0x45,0x44,0x74,0x80,0xF0,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x38,0x00,0x00,0x77,0x76,0x47,0x54,0x80,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };

uchar code tab5[]={

/*-- 调入了一幅图像:F:\\梁\\画图\\COCK.bmp --*/ /*-- 宽度x高度=128x64 --*/

15

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x22, 0x0C, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x22, 0x04, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x62, 0x03, 0x00, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,

0x00, 0x01, 0xC2, 0x01, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,

0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,

0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00,

0x00, 0x1C, 0x01, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00,

0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,

0x00, 0x00, 0xC1, 0x00, 0x00, 0x00, 0x40, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,

0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x4C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,

0x00, 0x00, 0x41, 0x00, 0x7C, 0x00, 0x79, 0x80, 0x00, 0x00, 0x80, 0x00, 0xE6, 0x00, 0x00, 0x00,

0x00, 0x00, 0x47, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x78, 0x01, 0xBC, 0x07, 0x00, 0x00,

0x00, 0x00, 0x7C, 0x80, 0x00, 0x00, 0x01, 0xFC, 0x03, 0x31, 0x0C, 0x01, 0x1C, 0x0D, 0x80, 0x00,

0x00, 0x07, 0xC0, 0x80, 0x00, 0x00, 0x0E, 0x00, 0x02, 0x01, 0x04, 0x13, 0x18, 0x18, 0xC0, 0x00,

16

0x00, 0x7C, 0x40, 0x80, 0x00, 0x00, 0x38, 0x00, 0x06, 0x01, 0x06, 0x12, 0x18, 0x10, 0x45, 0xC0,

0x0F, 0xC0, 0x40, 0x80, 0x00, 0x01, 0xE8, 0x00, 0x04, 0x01, 0x02, 0x12, 0x30, 0x20, 0xC7, 0x38,

0x00, 0x00, 0x40, 0x80, 0x00, 0x1E, 0x04, 0x00, 0x06, 0x01, 0x02, 0x12, 0x30, 0xE0, 0x86, 0x00,

0x00, 0x00, 0x40, 0x80, 0x00, 0x10, 0x04, 0x00, 0x03, 0x01, 0x02, 0x32, 0x50, 0x7F, 0x8C, 0x00,

0x00, 0x00, 0x60, 0x80, 0x00, 0x00, 0x04, 0x00, 0x01, 0xC1, 0x06, 0x23, 0xD8, 0x40, 0x0C, 0x00,

0x00, 0x00, 0x60, 0x40, 0x00, 0x01, 0x04, 0x00, 0x00, 0x63, 0x0C, 0x20, 0x08, 0x40, 0x18, 0x00,

0x00, 0x00, 0xC0, 0x40, 0x40, 0x01, 0x04, 0x70, 0x00, 0x22, 0x10, 0x60, 0x00, 0x30, 0x18, 0x00,

0x00, 0x01, 0xC0, 0x40, 0x40, 0x01, 0x07, 0xC0, 0x00, 0x23, 0xE0, 0x00, 0x00, 0x0F, 0x18, 0x00,

0x00, 0x06, 0x40, 0x40, 0x80, 0x01, 0x04, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,

0x00, 0x0C, 0x40, 0x61, 0x80, 0x01, 0x04, 0x00, 0x00, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,

0x00, 0x18, 0x40, 0x21, 0x00, 0x01, 0x04, 0x00, 0x07, 0x82, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,

0x00, 0x30, 0x40, 0x23, 0x00, 0x01, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,

0x00, 0xE0, 0x40, 0x26, 0x00, 0x03, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,

0x01, 0x04, 0x40, 0x14, 0x00, 0x07, 0x86, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x02, 0x06, 0x40, 0x18, 0x00, 0x04, 0x42, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x02, 0xC0, 0x38, 0x10, 0x18, 0x70, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x03, 0x80, 0xE8, 0x20, 0x30, 0x18, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x03, 0x01, 0x8C, 0x20, 0x60, 0x0F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00,

0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00,

0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x70, 0x00, 0x08, 0x01, 0x00, 0x01, 0x0C, 0x00, 0x00,

0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x00, 0x0F, 0x80, 0x08, 0x01, 0x39, 0xF3, 0x04, 0x20, 0x00,

0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x70, 0x10, 0x01, 0x6F, 0x16, 0x14, 0x3C, 0x00,

17

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x10, 0x01, 0xCC, 0x14, 0x34, 0x66, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x98, 0x34, 0x6C, 0x62, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x24, 0xF8, 0xC2, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x67, 0xB0, 0x82, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x21, 0x82, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x82, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x84, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };

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

18

void delay (uint us) //delay time {

while(us--); }

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

//************************************** void delay1 (uint ms) {

uint i,j;

for(i=0;i

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

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

//我发现在读指令码的时候,程序先调用了6位的低电平,然再在1调用了10位的指令码 。总共调用了16位的数据。

void wr_lcd (uchar dat_comm,uchar content) {

uchar a,i,j; delay (50); a=content; sclk=0; std=1;

for(i=0;i<5;i++) {

sclk=1; sclk=0; }

std=0; sclk=1; sclk=0;

if(dat_comm)

std=1; //data else

std=0; //command sclk=1; sclk=0; std=0; sclk=1;

19

sclk=0;

for(j=0;j<2;j++) {

for(i=0;i<4;i++) {

a=a<<1; std=CY; sclk=1; sclk=0; }

std=0;

for(i=0;i<4;i++) {

sclk=1; sclk=0; } } }

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

/*------------------初始化-----------------*/ void init_lcd (void) {

wr_lcd (comm,0x30); /*30---基本指令动作*/ wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/ delay (100);

wr_lcd (comm,0x06); /*光标的移动方向*/ wr_lcd (comm,0x0c); /*开显示,关游标*/ }

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

/*--------------显示点阵----------------*/ //经过调试发现显示点阵是非常有意思的,最主要的在于data1,data2上的两组数据的取值,

//不同的取值对应着不同的点阵效果。

void lat_disp (uchar data1,uchar data2) {

uchar i,j,k,x; x=x1;

for(k=0;k<2;k++) {

for(j=0;j<16;j++) {

for(i=0;i<8;i++)

20

{

wr_lcd (comm,0x34); //扩充指令操作。 wr_lcd (comm,y+j*2); wr_lcd (comm,x+i); wr_lcd (comm,0x30); wr_lcd (dat,data1); wr_lcd (dat,data1); }

for(i=0;i<8;i++) {

wr_lcd (comm,0x34); wr_lcd (comm,y+j*2+1); wr_lcd (comm,x+i); wr_lcd (comm,0x30); wr_lcd (dat,data2); wr_lcd (dat,data2); } }

x=x2; }

wr_lcd (comm,0x36); }

/*-----------------------------------------------*/ /*---------------显示汉字或字符----------------*/ void chn_disp (uchar code *chn) {

uchar i,j;

wr_lcd (comm,0x30); wr_lcd (comm,0x80); for (j=0;j<4;j++) {

for (i=0;i<16;i++)

wr_lcd (dat,chn[j*16+i]); } }

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

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

//当data1=0xff,data2=0xff时,在x0,y0处反白显示16xl*yl.我发现如果固定yo的值为0x80,

//那么再去改变x0的值的话,x0的值是多少就在那一块反白,反白的范围应该是32*16。但前提是 //x1=2,y1=16.

21

//如果x1=1,y1=8. 那么反白的范围应该是16*8。

void con_disp (uchar data1,uchar data2,uchar x0,uchar y0,uchar xl,uchar yl) {

uchar i,j;

for(j=0;j

for(i=0;i

wr_lcd (comm,0x34); wr_lcd (comm,y0+j); wr_lcd (comm,x0+i); wr_lcd (comm,0x30);

wr_lcd (dat,data1); //写数据到RAM.这类语句都是一个道理。 wr_lcd (dat,data2); } }

wr_lcd (comm,0x36); }

//***************************************************** /*--------------清DDRAM------------------*/ void clrram (void) {

wr_lcd (comm,0x30);

wr_lcd (comm,0x01); //清除显示指令。 delay (180); }

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

/*-------------下半屏显示图形--------------*/

//显示图形的过程是这样的:首先先设垂直地址再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址) //然后在每个地址里写上16位的数据。 void img_disp1 (uchar code *img) {

uchar i,j;

for(j=0;j<32;j++) {

for(i=0;i<8;i++) {

wr_lcd (comm,0x34); wr_lcd (comm,y+j); wr_lcd (comm,x2+i);

22

wr_lcd (comm,0x30);

wr_lcd (dat,img[j*16+i*2]); wr_lcd (dat,img[j*16+i*2+1]); } }

wr_lcd (comm,0x36); //扩充功能指令,开绘图开关。 }

//******************************************* /*----------------显示图形-----------------*/ void img_disp (uchar code *img) {

uchar i,j;

for(j=0;j<32;j++) {

for(i=0;i<8;i++) {

wr_lcd (comm,0x34); //扩充指令操作。 wr_lcd (comm,y+j); //设定绘图RAM地址。 wr_lcd (comm,x1+i); //同上。

wr_lcd (comm,0x30); //基本指令操作。 wr_lcd (dat,img[j*16+i*2]); wr_lcd (dat,img[j*16+i*2+1]); } }

for(j=32;j<64;j++) {

for(i=0;i<8;i++) {

wr_lcd (comm,0x34); wr_lcd (comm,y+j-32); wr_lcd (comm,x2+i); wr_lcd (comm,0x30);

wr_lcd (dat,img[j*16+i*2]); wr_lcd (dat,img[j*16+i*2+1]); } }

wr_lcd (comm,0x36); }

//********************************************** /*------------------主程序--------------------*/ void main () {

23

SP=0x5f; init_lcd (); while (1) {

lat_disp (0x00,0x00); delay1(1000);

chn_disp (tab1); delay1(1000);

con_disp (0xff,0xff,0x81,0x80,1,8); delay1 (4000); clrram();

lat_disp (0x00,0x00); img_disp1 (tab32); delay1 (4000); clrram();

img_disp (tab5); delay1 (8000); } }

12864液晶 串行口传输程序-C语言

2007年09月20日 星期四 下午 03:49 //12864(ST7920)串口C51程序 #include #include

sbit E_CLK =P3^2;//clock input 同步时钟输入端

sbit RW_SID=P3^1;//data input/output 串行数据输入、输出端

void delay(unsigned int n) {

unsigned int i; for(i=0; i

//串行发送一字节数据

24

void SendByte(unsigned char dat) {

unsigned char i; for(i=0;i<8;i++) {

E_CLK=0;

if(dat&0x80)RW_SID=1;else RW_SID=0;

E_CLK=1; dat=dat<<1; } }

//串行接收一字节数据

unsigned char ReceieveByte(void) {

unsigned char i,d1,d2; for(i=0;i<8;i++) {

E_CLK=0;delay(100); E_CLK=1;

if(RW_SID)d1++; d1=d1<<1; } for(i=0;i<8;i++) {

E_CLK=0;delay(100); E_CLK=1;

if(RW_SID)d2++; d2=d2<<1; }

return (d1&0xF0+d2&0x0F); }

//写控制命令

void SendCMD(unsigned char dat) {

SendByte(0xF8);//11111,00,0 RW=0,RS=0 志

SendByte(dat&0xF0);//高四位

SendByte((dat&0x0F)<<4);//低四位 }

25

同步标

//写显示数据或单字节字符

void SendDat(unsigned char dat) {

SendByte(0xFA);//11111,01,0 RW=0,RS=1 SendByte(dat&0xF0);//高四位

SendByte((dat&0x0F)<<4);//低四位 }

/* 写汉字到LCD 指定的位置 x_add显示RAM的地址 dat1/dat2显示汉字编码 */

void display(unsigned char x_add,unsigned char dat1,unsigned char dat2) {

SendCMD(x_add);//1xxx,xxxx 设定DDRAM 7位地址xxx,xxxx到地址计数器AC

SendDat(dat1); SendDat(dat2); }

//初始化 LCM void initlcm(void) {

delay(100);

SendCMD(0x30);//功能设置,一次送8位数据,基本指令集 SendCMD(0x0C);//0000,1100 整体显示,游标off,游标位置off

SendCMD(0x01);//0000,0001 清DDRAM

SendCMD(0x02);//0000,0010 DDRAM地址归位

SendCMD(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC }

void set_wenzi(void) {

SendCMD(0x80);//1000,0001 设定DDRAM 7位地址000,0001到地址计数器AC.

SendDat(0x48); //将ASCII码调出来,显示在液晶屏幕上.

26

下同

SendDat(0x65); SendDat(0x6c); SendDat(0x6c); SendDat(0x6f); SendDat(0x00); SendDat(0x4d); SendDat(0x72); SendDat(0x2e); SendDat(0x5a); SendDat(0x68); SendDat(0x6f); SendDat(0x75);

SendCMD(0x90); //设置液晶屏的显示地址,下同. SendDat(0x4d); SendDat(0x79); SendDat(0x20); SendDat(0x6e); SendDat(0x61); SendDat(0x6d); SendDat(0x65); SendDat(0x20); SendDat(0x69); SendDat(0x73); SendDat(0x20); SendDat(0x59); SendDat(0x75);

SendCMD(0x88); SendDat(0x32); SendDat(0x30); SendDat(0x3f); SendDat(0x3f);

display(0x8a,0xc4,0xea); //将中文字调出来.\年\的码值是:c4ea. SendDat(0x3f); SendDat(0x3f);

display(0x8c,0xd4,0xc2); SendDat(0x3f); SendDat(0x3f);

display(0x8e,0xc8,0xd5); SendCMD(0x98);

display(0x98,0xd0,0xc7);

27

display(0x99,0xc6,0xda); SendDat(0x3f); SendDat(0x3f); SendDat(0x3f); SendDat(0x3f); SendDat(0x3a); SendDat(0x3f); SendDat(0x3f);

}

void main(void) {

initlcm(); //12864初始化程序

set_wenzi(); //将想要设置的文字显示在液晶屏幕上。

while(1); }

此程序显示出来的图片:

28

本文来源:https://www.bwwdw.com/article/1zbg.html

Top