当前位置:文档之家› 带字库12864液晶详解

带字库12864液晶详解

带字库12864液晶详解
带字库12864液晶详解

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:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。

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

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。

2.2并行接口

管脚号管脚名称电平管脚功能描述

1 VSS 0V 电源地

2 VCC 3.0+5V 电源正

3 V0 - 对比度(亮度)调整

RS=“H”,表示DB7——DB0为显示数据

4

RS(CS)H/L

RS=“L”,表示DB7——DB0为显示指令数据

R/W=“H”,E=“H”,数据被读到DB7——DB0 5

R/W(SID) H/L

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

6 E(SCLK) H/L 使能信号

7 DB0 H/L 三态数据线

8 DB1 H/L 三态数据线

9 DB2 H/L 三态数据线

10 DB3 H/L 三态数据线

11 DB4 H/L 三态数据线

12 DB5 H/L 三态数据线

13 DB6 H/L 三态数据线

14 DB7 H/L 三态数据线

15 PSB H/L H:8位或4位并口方式,L:串口方式(见注释1)

16 NC - 空脚

17 /RESET H/L 复位端,低电平有效(见注释2)

18 VOUT - LCD驱动电压输出端

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

20 K VSS 背光源负端(见注释3)

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

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

*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。

四.模块主要硬件构成说明

控制器接口信号说明:

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

2、E信号

● 忙标志: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以上的编码将自动的结合下一个位元组,组成两个位元组的编码形成中文字型的编码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:基本指令)

指令表2:(RE=1:扩充指令)

备注;当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段

较长的时间,即是等待前一个指令确实执行完成。

应用举例:

1 、使用前的准备

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

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

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个字符显示区域有着一一对应的关系,其对应关系如下表所示。

3 、图形显示

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

垂直地址范围 AC5...AC0

水平地址范围AC3…AC0

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

3、应用说明

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

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

②显示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

功能:设置屏幕显示开/关。

DB0=H,开显示;DB0=L,关显示。不影响显示RAM(DD RAM)中的内容。

2、设置显示起始行

CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。

3、设置页地址

CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:执行本指令后,下面的读写操作将在指定页内,直到重新设置。页地址就是DD RAM 的行地址,页地址存储在X地址计数器中,A2-A0可表示8页,读写数据对页地址没有影响,除本指令可改变页地址外,复位信号(RST)可把页地址计数器内容清零。

DD RAM地址映像表

Y 地址

4、设置列地址

CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能: DD RAM 的列地址存储在Y地址计数器中,读写数据对列地址有影响,在对DD RAM进行读写操作后,Y地址自动加一。

5、状态检测

CODE: R/W D/I DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:读忙信号标志位(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

功能:写数据到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

功能:从DD RAM读数据,读指令执行后Y地址计数器自动加1。从DD RAM读数据前要先执行“设置页地址” 及“设置列地址”命令。

六、接口时序

1.写操作时序

时序1

4. 读操作时序

时序2时序参数表:

七、屏幕显示与DD RAM地址映射关系

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

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

#include

#define uint unsigned int

#define uchar unsigned char

#define x1 0x80

#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,

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 --*/

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

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

void delay (uint us) //delay time

{

while(us--);

}

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

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

void delay1 (uint ms)

{

uint i,j;

for(i=0;i

for(j=0;j<15;j++)

delay(1);

}

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

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

//我发现在读指令码的时候,程序先调用了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;

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++)

{

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.

//如果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);

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 ()

{

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)

{

带字库12864液晶详解

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:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。 *注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。 *注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。 2.2并行接口 管脚号管脚名称电平管脚功能描述 1 VSS 0V 电源地 2 VCC 3.0+5V 电源正 3 V0 - 对比度(亮度)调整 RS=“H”,表示DB7——DB0为显示数据 4 RS(CS)H/L RS=“L”,表示DB7——DB0为显示指令数据 R/W=“H”,E=“H”,数据被读到DB7——DB0 5 R/W(SID) H/L R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR 6 E(SCLK) H/L 使能信号 7 DB0 H/L 三态数据线 8 DB1 H/L 三态数据线 9 DB2 H/L 三态数据线 10 DB3 H/L 三态数据线 11 DB4 H/L 三态数据线 12 DB5 H/L 三态数据线 13 DB6 H/L 三态数据线 14 DB7 H/L 三态数据线 15 PSB H/L H:8位或4位并口方式,L:串口方式(见注释1) 16 NC - 空脚 17 /RESET H/L 复位端,低电平有效(见注释2) 18 VOUT - LCD驱动电压输出端 19 A VDD 背光源正端(+5V)(见注释3) 20 K VSS 背光源负端(见注释3)

很好用的12864驱动程序

/////////////////////////////////////////////////////////// #include #include #define uchar unsigned char #define uint unsigned int //////////单片机与液晶显示的引脚连接///////// sbit P32=P3^2; //RST sbit P33=P3^3; //CS2 sbit P34=P3^4; //CS1 sbit P35=P3^5; //E sbit P36=P3^6; //rs&DI sbit P37=P3^7; // R/W ////////延时///////// void delay(uint v) { while(v!=0)v--; } ////////复位/////////// void reset() { P32=0; delay(10); P32=1; delay(10); } ////////write code写指令/////// void wcode(uchar c,uchar cs1,uchar cs2) { P34=cs1; P33=cs2; P37=0; P36=0; P1=c; P35=0; delay(10);

P35=1; delay(10); P35=0; } /////////write data写数据/////////////// void wdata(uchar c,uchar cs1,uchar cs2) { P34=cs1; P33=cs2; P37=1; P36=0; P1=c; P35=0; delay(10); P35=1; delay(10); P35=0; } ////////////set start设置起始行///////////// void set_startline(uchar i)//起始行。11A5A4A3A2A1A0 共有64行 // 液晶显示器的最底层为第一行 { i=0xc0+64-i;//此算法为把最顶层做为第一层 wcode(i,1,1); } ////////////set 页值设置,起始列值函数///////////// void set_adr(uchar x,uchar y) { x=x+0xb8;//页地址设置。10111A2A1A0 DDRAM的8行为一页,A0~A2为页码,LCD为64行8页 y=y+0x40;//列地址设置。01A5A4A3A2A1A0 两半屏分别有64列,A0~A5送入列地址计数器, //作为列(Y)地址指针。每读写一次其自动加一,指向下一列DDRAM单元wcode(x,1,1); wcode(y,1,1); } ///////////on/off开/关显示函数//////////////

lcd12864并行数据传输汉字及图形显示程序

今天终于完成了12864带字库液晶模块的图象和中英文字母显示,图象显示显示了自己的一副照片,呵呵,还认得出是自己,开心啊。。。硬件连接方式是:并口直接访问。 这是汉字显示程序: #include #include #define uchar unsigned char #define datawr 0x1200 //写数据通道 #define comwr 0x1000 //写控制命令通道 #define datare 0x1300 //读数据通道 #define comre 0x1100 //读忙通道 uchar code disp_data[]={" 浙江大学 " //第一行,第一页 "04级通信工程一班" //第三行 " 宁波理工学院 " //第二行 " 竞赛小组 " //第四行 "128X64液晶显示器" //第一行,第二页 " 测试程序 " //第三行 " 07年07月25日 " //第二行 " Tornado "}; //第四行 void set12864(); void write_command(uchar command); void write_page(uchar data_add); void read_page(uchar data_add); void delays(uchar cont); void main() { while(1) { set12864(); //初始化12864 write_page(0); //写入一页数据 read_page(0x30); //读出一页数据到内部RAM delays(2); //延时2s write_page(64); //写入下一页数据 delays(2); //延时2s } }

12864液晶显示图片原理(完整版)

51单片机综合学习 12864液晶原理分析1 辛勤学习了好几天,终于对12864液晶有了些初步了解~没有视频教程学起来真有些累,基本上内部程序写入顺序都是根据程序自我变动,然后逆向反推出原理…… 芯片:YM12864R P-1 控制芯片:ST7920A带中文字库 初步小结: 1、控制芯片不同,寄存器定义会不同 2、显示方式有并行和串行,程序不同 3、含字库芯片显示字符时不必对字符取模了 4、对芯片的结构地址一定要理解清楚

5、显示汉字时液晶芯片写入数据的顺序(即显示的顺序)要清楚 6、显示图片时液晶芯片写入数据的顺序(即显示的顺序)要清楚 7、显示汉字时的二级单元(一级为八位数据写入单元)要清楚 8、显示图片时的二级单元(一级为八位数据写入单元)要清楚 12864点阵液晶显示模块(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。每个显示点对应一位二进制数,1表示亮,0表示灭。存储这些点阵信息的RAM称为显示数据存储器。要显示某个图形或汉字就是将相应的点阵信息写入

到相应的存储单元中。图形或汉字的点阵信息由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。显示点在64*64液晶屏上的位置由行号(line,0~63)与列号(column,0~63)确定。512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。每个存储单元存储8个液晶点的显示信息。

LCD12864显示屏 带中文字库

蓝屏LCD12864显示屏带中文字库带背光12864-5V ST7920 需要用串口,请把 R9上的0欧电阻改到R10 带中文字库的,兰屏,白字 以下是在液晶模块的第二行第一个字符的位置显示字母“A”的程序: ORG 0000H RS EQU P3.7;确定具体硬件的连接方式 RW EQU P3.6 ;确定具体硬件的连接方式 E EQU P3.5 ;确定具体硬件的连接方式 MOV P1,#00000001B ;清屏并光标复位 ACALL ENABLE;调用写入命令子程序 MOV P1,#00111000B ;设置显示模式:8位2行5x7点阵 ACALL ENABLE ;调用写入命令子程序 MOV P1,#00001111B ;显示器开、光标开、光标允许闪烁 ACALL ENABLE ;调用写入命令子程序 MOV P1,#00000110B ;文字不动,光标自动右移 ACALL ENABLE ;调用写入命令子程序 MOV P1,#0C0H ;写入显示起始地址(第二行第一个位置) ACALL ENABLE ;调用写入命令子程序 MOV P1,#01000001B ;字母A的代码 SETB RS ;RS=1 CLR RW ;RW=0 ;准备写入数据 CLR E ;E=0 ;执行显示命令

ACALL DELAY ;判断液晶模块是否忙? SETB E ;E=1 ;显示完成,程序停车 AJMP $ ENABLE: CLR RS ;写入控制命令的子程序 CLR RW CLR E ACALL DELAY SETB E RET DELAY: MOV P1,#0FFH ;判断液晶显示器是否忙的子程序 CLR RS SETB RW CLR E NOP SETB E JB P1.7,DELAY ;如果P1.7为高电平表示忙就循环等待 RET END 程序在开始时对液晶模块功能进行了初始化设置,约定了显示格式。注意显示字符时光标是自动右移的,无需人工干预,每次输入指令都先调用判断液晶模块是否忙的子程序DELAY,然后输入显示位置的地址0C0H,最后输入要显示的字符A的代码41H。 SMC1602A(16*2)模拟口线接线方式 连接线图: --------------------------------------------------- |LCM-----51 | LCM-----51 | LCM------51 | ------------------------------------------------| |DB0-----P1.0 | DB4-----P1.4 | RW-------P2.0 | |DB1-----P1.1 | DB5-----P1.5 | RS-------P2.1 | |DB2-----P1.2 | DB6-----P1.6 | E--------P2.2 | |DB3-----P1.3 | DB7-----P1.7 | VLCD接1K电阻到GND| --------------------------------------------------- [注:AT89S52使用12M晶振] =============================================================*/

使用无字库12864液晶模块制作温湿度计

使用无字库12864液晶模块制作温湿度计 日历钟就摇身一变成为一个小小温湿度计啦。虽然气象要素很多,不过我们最常用的就是气温和湿度。一个是冷热程度,一个是环境空气中含水蒸气的多少。一般家用温度计很常见,湿度计就比较少,以前有一种干湿球温度计,但是用起来比较麻烦,准确度也不高。现在应用电子技术我们就可以做一个可以同时显示温度、湿度、时间的小仪器,放在家里以便随时监测我们的小环境。它的特点如下: 1.在单片机ATMega8L-8PU(以下简称M8)和日历钟电路DS1302的基础上,使用一个在工厂经过精密校准的数字式温度、湿度传感器AM2301作为探头; 2.当24小时连续工作时,纵然工作电流仅为几毫安,也不宜使用纽扣电池供电。这次选用可充电的 3.6V聚合物锂电池,使它的放置地点可以不受电源限制,可以在室内,也可以在不受阳光直射和雨水接触的室外; 3.具有文字和图形界面,可以显示温度和湿度数值,以及12小时内的湿度变化记录曲线,为什么是湿度曲线呢?因为气温的变化规律一般比较稳定,湿度就不一样了,我们可以从湿度变化趋势估计一下未来的晴雨可能,这比看燕子飞高飞低要靠谱些吧?两个界面用按键切换; 4.具备锂电池线性充电电路,通过USB接口从外部取得5V电源,一边供给充电,一边维持电路继续工作;全部元器件安装在一块70mm×90mm的小万用板上,正面、背面外形见图1、图2。正面左边那个黑色小乌龟壳就是温湿度探头。 图2 电路板背面元器件分布和连线 电路原理 电路见图3。图形点阵液晶、单片机M8、时钟电路DS1302和上次小小日历钟基本相同,不再重复。有两点稍稍不同:1.液晶的控制虽然还是通过M8的PD口,但具体接线有所改变,不再占用两根串口线PD0和PD1,目的是为今后可能和外部通信预留接口。这好办,编程时重新定义即可;

带字库12864 串口 时钟显示

/*12864LCD (ST7920)驱动程序 可显示年月日时分秒及加减时钟切换*/ #include /*引脚定义*/ #define CS P2_0 //片选高电平有效单片LCD使用时可固定高电平 #define SID P2_1 //串数究谳 #define SCLK P2_2 //串同步时钟信号 #define PSB P2_3 //低电平时表示用串口驱动,可固定低电平;高电平并行驱动 #define RESET P2_4 //LCD复位,LCD模块自带复位电路,可不接或接高电平vcc #define key P2_5 //因有定义,因此可以写成P2_5或sbit key=P2^5; /*函数全局声明*/ void write(bit start, unsigned char ddata);//bit start;定义一个位的变量,他是1或0 void sendbyte(unsigned char bbyte); void delaynms(unsigned int di); void lcdinit(void); void lcdtest(void); void lcdcls(void); /*存放字符串的数组*/ unsigned char code ma[] ={"2015年08月24日"}; unsigned char code ma2[]={" 时分秒"}; unsigned char code ma3[]={"12864 液晶时钟"}; unsigned char code ma4[]={"0123456789"}; unsigned char code ma5[]={"年"}; unsigned char code ma6[]={"月"}; unsigned char code ma7[]={"日"}; unsigned int count; //定义变量统计中断累计次数 unsigned int s,m,h; //定义变量储存秒、分钟和小时 unsigned int ss,mm,hh; //定义变量储存秒、分钟和小时 unsigned int n,u,r; //定义变量储存年、月、日 void lcdinit(void) //初始化LCD { delaynms(10); //启动等待,等LCM讲入工作状态 PSB=0; ; //串口驱动模式;PSB=1时为并行 // RESET=0; delaynms(1); RESET=1; // 复位LCD // CS=1; //串行数据口 write(0,0x30); // DL=0,4位数据;DL=1,8位数据RE=1,扩充指令操作;RE=0,基本指令操作; write(0,0x0c); //显示打开,光标关,反白关 write(0,0x01); //清屏,将DDRAM的地址计数器归零 } void write(bit start, unsigned char ddata) //写指令或数据bit start;定义一个位的变量,他是1或0

玩转12864液晶(1)--显示字符

在我们常用的人机交互显示界面中,除了数码管,LED,以及我们之前已经提到的LCD1602之外,还有一种液晶屏用的比较多。相信接触过单片机的朋友都知道了,那就是12864液晶。顾名思义,12864表示其横向可以显示128个点,纵向可以显示64个点。我们常用的12864液晶模块中有带字库的,也有不带字库的,其控制芯片也有很多种,如KS0108 T6963,ST7920等等。在这里我们以ST7920为主控芯片的12864液晶屏来学习如何去驱动它。(液晶屏采用金鹏的OCMJ4X8C) 关于这个液晶屏的更多信息,请参考它的DATASHEET,附件中有下载。 我们先来了解一下它的并行连接情况。 下面是电路连接图

从上面的图可以看出,液晶模块和单片机的连接除了P0口的8位并行数据线之外,还有RS,RW,E等几根线。其中R/S是指令和数据寄存器的选择控制线(串行模式下为片选),R/W 是读写控制线(串行模式下是数据线),E是使能线(串行模式下为时钟线)。 通过这几根控制线和数据线,再结合它的时序图,我们就可以编写出相应的驱动程序啦。 看看并行模式下的写时序图:

根据这个时序图,我们就可以写出写数据或者写命令到LCD12864液晶的子程序。 读时序图如下: 根据这个时序图我们就可以从LCD12864液晶模块内部RAM中读出相应的数据,我们的忙检测函数就是根据这个时序图写出来的。以及后面章节中讲的画点函数等都要用到读时序。有了这两个时序图,然后我们再看看OCMJ4X8C的相关指令集,就可以编写出驱动程序了。这里要注意的是指令集分为基本指令集和扩充指令集,其中扩充指令集主要是与绘图相关,在此后的章节中会有相应的介绍。 下面让我们根据这些编写出它的驱动程序吧。 我的硬件测试条件为:STC89C516(11.0592MHz) + OCMJ4X8C 实际显示效果图片如下: 程序部分如下,请结合液晶模块的DATASHEET看程序,这样能够更加快速的弄懂程序的流程。大致有如下几个函数:写数据,写指令,忙检测,初始化,指定地址显示字符串等等。[p][/p] #include "reg52.h" #include "intrins.h" sbit io_LCD12864_RS = P1^0 ;

无字库LCD12864(无时钟芯片显示时间)

/************************************************************************** 在无字库的12864LCD上显示时、分、秒;没有用时钟芯片 MCU:STC89C52 晶振:11.0592MHz 作者:罗元俊 时间:2014.06.25 **************************************************************************/ #include typedef unsigned char uchar; typedef unsigned int uint; #define Port P0 // 数据端口 #define Disp_On 0x3f // 开显示 #define Disp_Off 0x3e // 关显示 #define Col_Add 0x40 // 列地址 #define Page_Add 0xb8 // 页地址 #define Start_Line 0xc0 // 起始页 sbit RS = P2^6; sbit RW = P2^5; sbit EN = P2^7; sbit CS1 = P3^2; sbit CS2 = P3^3; uint t = 0; //全局变量:秒表(用于计数时间的增量) uchar sec,min,hour; // 全局变量:秒、分、时 uchar a,b,c,d,e,f; // 秒、分、时的个位和十位 uchar code HZ_tab[][32] = { {/*-- 文字: 潜--*/ /*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x20,0xC2,0x0C,0x80,0x10,0x94,0x54,0x3F,0x54,0x90,0x54,0x3F,0x54,0x94,0x10,0x00, 0x04,0x04,0x7E,0x01,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x01,0x00}, {/*-- 文字: 龙--*/ /*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0xF0,0x10,0x11,0x16,0xD0,0x10,0x10,0x00, 0x80,0x40,0x20,0x18,0x06,0x41,0x20,0x10,0x3F,0x44,0x42,0x41,0x40,0x40,0x78,0x00}, {/*-- 文字: 花--*/ /*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x04,0x04,0x04,0x84,0x6F,0x04,0x04,0x04,0xE4,0x04,0x8F,0x44,0x24,0x04,0x04,0x00, 0x04,0x02,0x01,0xFF,0x00,0x10,0x08,0x04,0x3F,0x41,0x40,0x40,0x40,0x40,0x78,0x00},

带中文字库LCD12864液晶仿真

字库LCD12864液晶 /*----------------------------------------------- 名称:LCD12864 字库液晶芯片组st7920 ------------------------------------------------*/ #include #include #include /******************************************************************/ /* 定义数组 */ /******************************************************************/ unsigned char code IC_DAT[]; unsigned char code IC_DAT2[]; unsigned char code Photo1[]; /******************************************************************/ /* 定义接口信息 */ /******************************************************************/ sbit RS =P2^4; sbit WRD=P2^5; sbit E= P2^6; sbit PSB=P2^1; sbit RES=P2^3; /******************************************************************/

protues中无字库12864汉字显示程序

#include #define uint unsigned int #define uchar unsigned char void page(uchar ye); void lie(uchar lie); sbit reset1=P3^0; sbit rs=P3^7; sbit e=P3^5; sbit cs1=P3^3; sbit cs2=P3^4; sbit rw=P3^6; sbit busy1=P1^7; const uchar code hz[]={ /*-- 文字: 王--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x02,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, /*-- 文字: 者--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x20,0x20,0x24,0x24,0x24,0x24,0xBF,0x64,0x24,0x34,0x28,0x24,0x22,0x20,0x20,0x00, 0x10,0x08,0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00, /*-- 文字: 归--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0xFC,0x00,0x00,0xFF,0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0xFC,0x00,0x00, 0x00,0x87,0x40,0x30,0x0F,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00, /*-- 文字: 来--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x08,0x08,0x28,0xC8,0x08,0x08,0xFF,0x08,0x08,0x88,0x68,0x08,0x08,0x00,0x00, 0x21,0x21,0x11,0x11,0x09,0x05,0x03,0xFF,0x03,0x05,0x09,0x11,0x11,0x21,0x21,0x00, /*-- 文字: 谁--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x40,0x42,0xCC,0x00,0x40,0x20,0xF8,0x4F,0x48,0x49,0xFE,0x48,0x48,0x48,0x08,0x00, 0x00,0x00,0x7F,0x20,0x10,0x00,0xFF,0x22,0x22,0x22,0x3F,0x22,0x22,0x22,0x20,0x00, /*-- 文字: 的--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0xF8,0x0C,0x0B,0x08,0x08,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0xF8,0x00,0x00, 0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x43,0x80,0x40,0x3F,0x00,0x00, /*-- 文字: 时--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00, 0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00, /*-- 文字: 代--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ 0x00,0x80,0x60,0xF8,0x07,0x20,0x20,0x20,0x7F,0xA0,0x10,0x11,0x16,0x10,0x10,0x00, 0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0xF8,0x00, /*-- 文字: 大--*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

带字库12864液晶显示DS1302数字时钟C源程序

51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能) 2009-10-19 16:47 经过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了这个程序。目前还不能修改时间与日期,只是以预定时间以始。 适用于开发板:51单片机(AT89S52)+带字库液晶12864(ST7920)+DS1302(实时时钟) 实现功能:简单,数字时钟+日期(以后会不断完美)。 C语言源程序如下: #include #include #define uchar unsigned char #define uint unsigned int /*DS1302 端口设置 */ sbit SCK=P3^6; //DS1302时钟 sbit SDA=P3^4; //DS1302 IO sbit RST = P3^5; // DS1302复位 bit ReadRTC_Flag; //读DS1302全局变量 /* 12864端口定义*/ #define LCD_data P0 //带字库液晶12864数据口 sbit LCD_RS = P2^4; //寄存器选择输入 sbit LCD_RW = P2^5; //液晶读/写控制 sbit LCD_EN = P2^6; //液晶使能控制 sbit PSB=P2^1; //并口控制 sbit RES=P2^3; uchar code dis1[] = {" 电子设计天地"}; //液晶显示的汉字 uchar code dis2[] = {"有志者,事竟成!"}; uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'}; unsigned char temp; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; void lcd_pos(uchar X,uchar Y); //确定显示位置 unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};//秒分时日月周年09-10-19 16:07:00 code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位 code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

12864中文字库

梁国书for(;1;) study; FYD12864液晶中文显示模块

(一) (一)概述 (3) (二)(二)外形尺寸 1 方框图 (3) 2 外型尺寸图 (4) (三)(三)模块的接口 (4) (四)(四)硬件说明 (5) (五) 指令说明 (7) (五)(五)读写操作时序 (8) (六)(六)交流参数 (11) (七)(七)软件初始化过程 (12) (八)(八)应用举例 (13) (九)(九)附录 1半宽字符表 (20) 2 汉字字符表 (21) 一、概述 FYD12864-0402B是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 基本特性: ●●低电源电压(VDD:+3.0--+5.5V) ●●显示分辨率:128×64点

●●2MHZ时钟频率 ●●显示方式:STN、半透、正显 ●●驱动方式:1/32DUTY,1/5BIAS ●●视角方向:6点 ●●背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 ●●通讯方式:串行、并口可选 ●●内置DC-DC转换电路,无需外加负压 ●●无需片选信号,简化软件设计 ●●工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 二、方框图 3、外形尺寸图

无字库12864使用protues仿真

原理图: 原程序: #include<> #define uchar unsigned char #define uint unsigned int #define Port P0 //DB0~DB7数据口 sbit EN=P2^2;//使能 sbit RW=P2^1;//读写 sbit RS=P2^0;//数据/命令 sbit CS2=P2^3;//片选 sbit CS1=P2^4; /*图片“生活不易,知行合一”*/ unsigned char code tu[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00, 0x00,0x00,0x80,0x80,0xC0,0xC0,0xC0,0xE0,0xE0,0xF0,0xF0,0xF0,0xF8,0xF8,0xF 8,0xF8, 0x7C,0x7C,0x7C,0x7C,0x3E,0x3E,0x3E,0x3E,0x3E,0x3F,0x1F,0x1F,0x1F,0x1F,0x1 F,0x1F, 0x1F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0 F,0x0F,

0x0F,0x0F,0x0F,0x0F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x3E,0x3E,0x3E,0x3 E,0x3E, 0x7C,0x7C,0x7C,0x7C,0xF8,0xF8,0xF8,0xF8,0xF0,0xF0,0xF0,0xE0,0xE0,0xE0,0xC 0,0xC0, 0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF0,0xF8,0xFC,0xF E,0x7E, 0x3F,0x3F,0x1F,0x0F,0x0F,0x07,0x07,0x07,0x03,0x83,0x61,0x39,0x29,0x20,0x2 0,0xFC, 0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x64,0xC8,0x10,0x40,0x48,0x48,0x4 8,0x48, 0xF8,0x48,0x44,0x44,0x44,0x40,0x00,0x04,0x04,0x04,0x04,0x84,0x64,0xF4,0x0 C,0x84, 0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x7C,0x54,0xD4,0x54,0x54,0x54,0x54,0x5 4,0x54, 0x54,0xFC,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x03,0x03,0x03,0x07,0x0 7,0x0F, 0x0F,0x1F,0x1F,0x3F,0x7E,0x7E,0xFC,0xF8,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x0 0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,

基于proteus的不带字库的12864的仿真程序(带仿真图)

基于proteus的不带字库的12864的仿真 程序(带仿真图) 作者:心如止水(武汉工程大学) /****************************************************** ****** 本程序为不带字库的12864汉字及英文字符的显示程序, 可以说此程序是所有12864显示程序中最简单最易懂的 显示程序。之所以写这个程序,是因为我看很多学单片 机的人(特别是初学者)对12864有一种恐惧感,觉得它 很难,看完这个程序,相信你能明白它的显示原理。 还要注意的是:带中文字库和不带中文字库的程序不一样, 不可混用。 ******************************************************* *****/ 先上图吧,哈哈

下面看程序吧,相信你一定能看懂,很简单的哟!!!#include #define uchar unsigned char #define uint unsigned int //sbit databus=P1; #define databus P1

//sbit Reset = P3^0; //复位 sbit rs = P3^7; //指令数据选择 sbit e = P3^5; //指令数据控制 sbit cs1 = P3^3; //左屏幕选择,低电平有效 sbit cs2 = P3^4; //右屏幕选择 sbit wr = P3^6; //读写控制 //sbit busy = P1^7; //忙标志 void SendCommand(uchar command); //写指令 void WriteData(uchar dat);//写数据 void LcdDelay(uint time); //延时 void SetOnOff(uchar onoff);//开关显示 void ClearScreen(uchar screen); //清屏 void SetLine(uchar line); //置页地址 void SetColum(uchar colum);//置列地址 void SetStartLine(uchar startline);//置显示起始行 void SelectScreen(uchar screen);//选择屏幕 void Show1616(uchar lin,uchar colum,uchar *address);//显示一个汉字 void InitLcd(); //初始化 void ResetLcd(); //复位 void Show_english(uchar lin,uchar colum,uchar *address); const uchar code hzk[] = { /*-- 文字: I --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, /*-- 文字: --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*-- 文字: c --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00, /*-- 文字: a --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20, /*-- 文字: n --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20, /*-- 文字: --*/ /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

LCD12864液晶的使用之字库型液晶(一)

LCD12864液晶的使用之字库型液晶(一) 2011年02月15日星期二 16:44 下面介绍下带字库的液晶,由于Proteus中没有,就以实物为准吧!我手头上这块液晶是QY128*64HZ1,它的驱动器是ST7920,想必大家很熟悉了,百度、谷歌一下它的芯片手册很多!在学习此块液晶之前,建议大家好好看看它的驱动芯片的手册!它的驱动和LCD1602很像,甚至,读忙、写指令和写数据函数都是一样的,就初始化不一样,因为指令系统不同嘛!下面是我手头字库液晶的实物图。 (手机拍的,图片质量差了些,大家见谅!)

字库型液晶显示可以分为串行方式和并行方式两种,通过引脚PSB进行选择,它只有一个驱动芯片,不像Proteus中无字库液晶有两个驱动芯片。显示是整体显示,而不是左右屏的显示!大家一定要注意! 1、控制口信号说明:

注:①忙标志Bust_flag=1说明LCD内部正忙,此时不能对LCD进行操作,忙标志的判断由DB7也就是数据口的最高位所决定!这和LCD1602一样! ②上面对RS和RW的操作需配合使能信号EN来操作!否则无效! 1、显示说明 (1)、字符产生ROM(CGROM) 里面提供了8192(213)个汉字GB2132宋体 (2)、显示数据RAM(DDRAM) 内部提供64*2位空间,最多可控制4行16字,也就是16个中文字型显示,当写入显示数据RAM时,可分别显示CGROM和CGRAM的字型,可以用来显示三种字型:半角英文数字型、CGRAM字型和CGROM的中文字型,三种字型的选择,由在DDRAM总写入的编码选择,在0000H—0006H的编码中(其代码分别为0000、0002、0004、0006共四个)将选择CGRAM的自定义字型,02H —7FH的编码中将显示半角英文数字型的字型(也就是ASCII码,大小为16*8),至于A1以上的编码将自动结合下一个位元组,组成两个位元组的编码,从而形成一个中文字型的编码,也就是说显示一个汉字要两个ASCII码显示的位置,即大小为16*16。BIG(A140—D75F),GB(A1A0—F7FF)。 (3)、字型产生RAM 上面已经介绍了该种液晶提供四组可定义显示,是16*16大小的自定义图像空间,通过在特定的编码位置,写入我们要显示的自定义图像即可,这个和 LCD1602液晶的自定义显示字符的原理是一样的!这个将在下文加以详细介绍

相关主题
文本预览
相关文档 最新文档