文档库 最新最全的文档下载
当前位置:文档库 › LCD12864详解

LCD12864详解

LCD12864详解
LCD12864详解

12864液晶

一、概述

带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

基本特性:

低电源电压(VDD:+3.0--+5.5V)

显示分辨率:128×64点

内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)

内置 128个16×8点阵字符

2MHZ时钟频率

显示方式:STN、半透、正显

驱动方式:1/32DUTY,1/5BIAS

视角方向:6点

背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10

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

内置DC-DC转换电路,无需外加负压

无需片选信号,简化软件设计

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

模块接口说明:

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

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

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

2.2并行接口

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

1 VSS 0V 电源地

2 VCC 3.0+5V 电源正

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

4

RS(CS)H/L

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

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

5

R/W(SID) H/L R/W=“H”,E=“H”,数据被读到DB7——DB0

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

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

2、设置显示起始行

CODE

命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。

3、设置页地址

CODE

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

DD RAM地址映像表

Y 地址

4、设置列地址

CODE

功能: DD RAM RAM进行读写操作后,Y地址自动加一。

5、状态检测

CODE

BF=H:内部正在执行操作; BF=L:空闲状态。

RST=H:正处于复位初始化状态; RST=L:正常状态。

ON/OFF=H:表示显示关闭; ON/OFF=L:表示显示开。

6、写显示数据

CODE

功能:写数据到1。D7-D0位数据为1表示显示,数据为0表示不显示。写数据到DD RAM前,要先执行“设置页地址”及“设置列地址”命令。

7、读显示数据

CODE

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

六、接口时序

1.写操作时序

时序1

4. 读操作时序

时序2

时序参数表:

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

};

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

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;

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

{

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

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

}

//串行发送一字节数据

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=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);//低四位

}

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

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码调出来,显示在液晶屏幕上.下同

SendDat(0x65);

LCD12864显示程序

本例程为通过用A T89C52芯片操作LCD12864显示的程序,使用的晶振为12M。 /********************************************************** 程序说明:LCD12864显示主程序 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ #include #include"12864.c" void main() { Ini_Lcd(); //液晶初始化子程序 Disp(1,0,6,"莫剑辉"); //显示数据到LCD12864子程序 while(1); } 这里我们通过调用下面的头文件就可以了,这样的做法方便我们以后要用到LCD12864的程序的调用。 /********************************************************** 程序说明:LCD12864显示头文件 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ //#include #define uchar unsigned char #define uint unsigned int #define DATA P2 //数据输出端0~7 sbit RS=P0^0; //LCD12864 RS端 sbit RW=P0^1; //LCD12864 RW端 sbit E =P0^2; //LCD12864 E 端 sbit PSB =P0^3; /********************************************* 延时子程序 *********************************************/ void Delay_1ms(uint x) { uint j,i; for(j=0;j

LCD12864显示程序

;实验目的:熟悉12864LCD的使用 ;12864LCD带中文字库 ;编程让12864LCD显示公司名称“深圳乾龙盛电子”,公司电话“0975”,公司传真“6”;硬件设置: ;关断所有拨码开关。 #include<> ;__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_H S_OSC ;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define RS PORTA,5 ;命令/数据选择 #DEFINE RW PORTA,4 ;读/写选择 #DEFINE E PORTA,3 ;使能信号 #DEFINE PSB PORTA,2 ;并口/串口选择(H/L) #DEFINE RST PORTA,0 ;复位信号 ;----------------------------------------------- LCD_X EQU 30H ;页地址 LCD_Y EQU 31H ;Y地址 COUNT EQU 32H ;循环计数用 COUNT1 EQU 33H ;循环计数用 COUNT2 EQU 34H ;循环计数用 POINT EQU 35H ;查表偏移地址 POINT1 EQU 36H ;查表偏移地址 POINT2 EQU 37H ;查表偏移地址 TEMP EQU 38H ;临时寄存器 TEMP1 EQU 39H ;临时寄存器 ;----------------------------------------------- ORG 0000H ;复位地址 NOP ;ICD需要的空指令 GOTO MAIN ;跳转到主程序 ;**********************主程序************************ MAIN BANKSEL TRISA CLRF TRISA ;A口输出 CLRF TRISD ;D口输出 BANKSEL ADCON1 MOVLW 06H MOVWF ADCON1 ;A口全为数字口 CLRF STATUS

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个液晶点的显示信息。

玩转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写字符串程序及其头文件

/****************************** 2012年5月19日 调试成功 编辑环境:ICCAVR 功能:用LCD12864显示汉字 ********************************/ #include #include #include"LCD_12864.c" /************************************** 端口初始化 **************************************/ void port_init() { DDRA=0XFF; PORTA=0XFF; DDRC=0XFF; PORTC=0XFF; } /****************************************** 主函数 *******************************************/ void main() { uchar i; port_init(); delay(100);// port_init();// LCD_init(); write_string(0,0,"zheng Zunggui"); delay(200); write_string(0,1,"I Love微电子!"); delay(200); write_string(0,2,"Working Hard !"); delay(200); //write_string(0,3,"I Love English!"); //write_string(0,3,"做电子设计大赛!");//包含了汉字字符串中有汉字输入方式/************************************** 此为单独操作汉字字符的方法 ****************************************/ LocateXY(1,3);//单独写汉字时,要一个字节一个字节写入,分开地址不重合 //先高字节后低字节与ASCCII不冲突 write_data(0xD5);// D5C5 D4F6 B9F0

LCD显示程序

本例程为通过用AT89C52芯片操作LCD12864显示的程序,使用的晶振为12M。 /********************************************************** 程序说明:LCD12864显示主程序 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ #include #include"12864.c" void main() { Ini_Lcd(); //液晶初始化子程序 Disp(1,0,6,"莫剑辉"); //显示数据到LCD12864子程序 while(1); } 这里我们通过调用下面的头文件就可以了,这样的做法方便我们以后要用到LCD12864的程序的调用。 /********************************************************** 程序说明:LCD12864显示头文件 程序调试员:莫剑辉 调试时间:2010-6-7 **********************************************************/ //#include #define uchar unsigned char #define uint unsigned int #define DATA P2 //数据输出端0~7 sbit RS=P0^0; //LCD12864 RS端 sbit RW=P0^1; //LCD12864 RW端 sbit E =P0^2; //LCD12864 E 端 sbit PSB =P0^3; /********************************************* 延时子程序 *********************************************/ void Delay_1ms(uint x) { uint j,i; for(j=0;j

LCD12864汉字显示

//在12864液晶上显示汉字和英文字符 /***********************头文件*********************/ #include "regx52.h" typedef unsigned char uchar; typedef unsignedintuint; sbitlcdrs=P1^5; //12864:0写指令,1写数据 sbitlcdwr=P1^6; //12864读写信号 sbitlcden=P1^7; //12864片选信号 uchar code tab[]={" ATI-51S"}; uchari; /***********************1ms延时函数**********************/ void delay(uint z) { uint y; while(z--) { for(y=0;y<125;y++); } } /***********************LCD写指令写数据**********************/ voidwrite_comdata(uchara,uchardatas) { lcdrs=a; lcdwr=0; delay(1); P0=datas; lcden=1; delay(1); lcden=0; } /***********************光标位置*********************/ void cursor(uchar x, uchar y ) { uchar address; switch(x){ case 0: address=0x80+y;break; case 1: address=0x90+y;break;

12864显示图形

看到工具箱旁边那个LCD12864很久没用了(当初买回来用的时候只是简单地测试了一下),于是萌生了重新写一次接口程序的想法(而且这次要给它加个图片显示的功能),好,说做就做,就用Atmega16和ICCAVR来做吧,最近这MCU和平台用得比较熟练。 马上从书堆里把当初打印出来的中文datasheet给翻了出来,依葫芦画瓢地写了个初始化程序。好,OK。编译通过。于是又写了一个可以自定义从XY坐标值开始输出显示的函数,再次编译,也通过,OK。于是呼马上写了四行简单的字符烧到单片机上试了一下,嘿嘿,一次通过。如下图: 后来在进一步测试的时候也出了点小问题。就是我是使用USBISP烧写器把程序烧写进AVR的(此时实验板由USBISP烧写器供电),想要实现从第一行的第一个字符开始连续显示"0123456789"。刚烧写完程序后能看到LCD12864上正常显示"0123456789",但是把烧写器从实验板上断开连接,单独用USB给实验板供电的时候,LCD的第一行只是显示"123456789",第一个字符消失了……,左思右想地弄了一个多小时后,终于把问题给解决了,就是把初始化程序的延时适当增加了些,真是奇怪。刚开始一直想不通为什么在烧写器供电的情况下就正常显示,而换到USB供电后就出了问题。后来再想想,估计是跟供电有关。在使用USBISP烧写器供电的时候,LCD的背光灯明显比用USB供电的时候来得亮,而且对比度也高很多,看来是因为换到USB供电后,供电不怎么充足,以至于LCD在上电初始化的时候花上了更多的时间去初始化(因为供电低了,功率小了,跑起来有点力不从心,用的时间就久了嘛……我是觉得可以这样去理解的 接下来呢,就到了有点难度的画图了。当初刚买到12864的时候只是简单测试了字符显示功能,除了因为画图还不需要用到,另外一个原因就是那datasheet上关于画图那部分的内容不怎么看得懂…。现在重新拿起来看,依然一头雾水……。马上上网百度了一下“12864 7920 显示图片”,看到了不少的例子程序,可是……就是没看到有关于这部分功能实现的详细思路和讲解……下载下来的那些程序,基本上没注释,不是说晦涩难懂,但是至少看起来一团糟,让人家不想继续看下去……于是还是硬着头皮去啃那datasheet。上面对于画图这部分的内容是这样讲解的:

12864LCD动态显示

/*------------------------------------------------------------------------------ PC2 PC3 PC4 PC5 PC6 PC7 PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 RS R/W E PSB NC RST DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 RS高电平写数据,低电平写指令代码.R/W高电平为读,低电平为写 E为使能信号,PSB高电平为并行模式,低电平为串行模式,RST低电平有效 显示地址:80H,81H,......86H,87H.第一行显示地址 90H,91H,......96H,97H.第二行显示地址 88H,89H,......8EH,8FH.第二行显示地址 98H,99H,......9EH,9FH.第三行显示地址 写指令01H:显示清屏,写指令02H: 位址归位,写指令0CH:开显示(无游标,不反白) 写指令30H:基本指令集,写指令80H:设置DDRAM,写指令10H:显示HCGROM ------------------------------------------------------------------------------*/ #include #include #define RS_H DDRC |= (1<<2);PORTC |= (1<<2); //RS设为高电平 #define RS_L DDRC |= (1<<2);PORTC &= ~(1<<2); //RS设为低电平 #define RW_H DDRC |= (1<<3);PORTC |= (1<<3); //RW设为高电平 #define RW_L DDRC |= (1<<3);PORTC &= ~(1<<3); //RW设为低电平 #define E_H DDRC |= (1<<4);PORTC |= (1<<4); //E设为高电平 #define E_L DDRC |= (1<<4);PORTC &= ~(1<<4); //E设为低电平 #define RST_H DDRC |= (1<<7);PORTC |= (1<<7); //RST为高电平 unsigned char MainMenu0[] = {"第二课堂胜风电子"}; unsigned char MainMenu1[] = {"数据为:"}; unsigned char Shuzi[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','+'}; /***********************函数功能:LCD延时子程序入口参数:t********************/ void delay(unsigned int t) { unsigned int i,j; for(i=0;i

基于STM32--LCD12864驱动程序

基于STM32--LCD12864驱动程序

STM32 LCD12864驱动程序(头文件)(2012-05-29 21:25:08)转载▼ 标签:杂谈 #ifndef LCD12864_H #define LCD12864_H #define LCD_CONTROL GPIOD //默认LCD12864的控制口在PD口 #define LCD_DATAPORT GPIOD //默认LCD12864的数据口在PD口 #define LCD_RESET_Pin GPIO_Pin_12 //默认LCD12864的复位引脚连接到PD.12 也可不用 #define LCD_RS_Pin GPIO_Pin_13 //默认LCD12864 RS -- PD.13 #define LCD_RW_Pin GPIO_Pin_14 //默认LCD12864 RW -- PD.14 #define LCD_EN_Pin GPIO_Pin_15 //默认LCD12864 E -- PD.15 #define LCD_CONTROL_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的控制口时钟

#define LCD_DATAPORT_CLOCK RCC_APB2Periph_GPIOD //默认LCD12864的数据口时钟 #define LCD_RS_1 LCD_CONTROL->BSRR &=~LCD_RS_Pin;LCD_CONTROL->BSRR |=LCD_RS_Pin //RS置高电平 #define LCD_RS_0 LCD_CONTROL->BRR &=~LCD_RS_Pin;LCD_CONTROL->BRR |=LCD_RS_Pin //RS置低电平 #define LCD_RW_1 LCD_CONTROL->BSRR &=~LCD_RW_Pin;LCD_CONTROL->BSRR |=LCD_RW_Pin //RW置高电平 #define LCD_RW_0 LCD_CONTROL->BRR &=~LCD_RW_Pin;LCD_CONTROL->BRR |=LCD_RW_Pin //RW置低电平 #define LCD_EN_1 LCD_CONTROL->BSRR &=~LCD_EN_Pin;LCD_CONTROL->BSRR |=LCD_EN_Pin //EN置高电平 #define LCD_EN_0 LCD_CONTROL->BRR &=~LCD_EN_Pin;LCD_CONTROL->BRR |=LCD_EN_Pin //EN置低电平

在12864显示任意图片及参考程序

用12864显示单色图片 首先介绍本12864液晶显示器: 型号:QC12864B 因为单片机读取的是数据,而不是直接的图片。得将图片进行取模,图片应该是单色图片,像素128*64。 下面我为大家介绍个实例。 ①、在电脑附件画图,首先设置属性

开始画图 保存文件,注意格式: ②、然后进行取模。

③、编程: #include #define uchar unsigned char #define uint unsigned int //宏定义 #define lcd P2 //数据端口 sbit rs=P1^2; //指令/数据选择信号 sbit rw=P1^1; //读写选择信号 sbit e=P1^0; //使能端 sbit psb=P1^3; //串并选择端,高电平为并行,低电平为串行 uchar code ai[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xC0,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xCE,0x00,0x00,0x00,0x00,0x00,0x01,0xC1,0xE0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xC7,0x00,0x00,0x00,0x00,0x00,0x03,0x31,0xC0,0x00,0x00,0x00, 0x00,0x00,0x00,0x0E,0xC0,0x00,0x00,0x00,0x00,0x00,0x03,0x9B,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x01,0x82,0x08,0x00,0x00,0x00, 0x00,0x00,0x00,0x78,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFC,0x00,0x00,0x00, 0x00,0x00,0x00,0xF8,0xEF,0x00,0x00,0x00,0x00,0x00,0x1B,0xFC,0x1E,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0xFE,0x00,0x00,0x00,0x00,0x00,0x1E,0x60,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x38,0x70,0x20,0x00,0x00,0x00,

LCD12864原理与应用(源程序+原理图+proteus仿真)

LCD12864原理与应用 1、LCD12864简介: LCD12864分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。而带字库的液晶,只能显示GB2312字体,当然也可以显示其他的字体,不过是用图片的形式显示。 下面介绍不带字库的LCD12864,以Proteus中的AMPIRE128×64为例,如下图所示,它的液晶驱动器为KS0108。 与带字库的液晶不同,此块液晶含有两个液晶驱动器,每块驱动器都控制64*64个点,分为左右两个屏幕显示,总共为128*64个点(即有128×64个点)。这就是为什么AMPIRE128*64有CS1和CS2两个片选端的原因。此液晶有8页,一页有8行点阵点,左右各64列,共128列。如下图所示:

2、LCD12864中的几条重要指令 (一)行(line)设置命令: 由此可见显示的起始行地址为0XC0,共64行,有规律地改变起始行号,可以实现滚屏效果。(二)页(page)设置指令: 起始页地址为0XB8,因为液晶有64行点,分为8页,每页就有8行点。 (三)列(column)地址设置指令 每块驱动器的列地址都是从0X40到0X7F,共64列,所以此液晶共有128列点。 (四)读状态指令

3、用LCD12864显示汉字(一) 由于这块液晶不带字库,我们就要自己编写字库,编写字库所用的字模提取软件为Zimo21(软件下载地址https://www.wendangku.net/doc/7b18344144.html,/),LCD1602显示自定义字符的时候也是用它。在取模之前我们要进行一些设定,根据此液晶的显示原理,设置为“纵向取模,字节倒序”,如下图所示:(若不是这样,则取模得到的数据不是我们想要的,将会出现乱码,同样可以在https://www.wendangku.net/doc/7b18344144.html,/下载到关于字模提取原理文档) 字体选择默认的“宋体,常规,小四号”,小四号为16*16大小,如下图所示:

LCD12864图形液晶并口显示

LCD12864图形液晶并口显示 【教学引入】 液晶屏,在生活中很常见,我们常见的液晶显示器,如电脑的显示器,电视机,手机等等。 液晶屏在生活中已得到了普遍应用,它显示个各种各样的画面。 【教学目标】 1、掌握LCD12864液晶屏的用法; 2、编写LCD12864液晶屏的指令代码; 【知识目标】 1、掌握LCD12864液晶屏的用法; 2、掌握LCD12864液晶屏指令代码; 【教学准备】 电脑、Proteus、Keil 【教学方法】 教法:讲授法、讨论法 学法:练习法、探究法 【教学课时】 四课时 【教学过程】 一、12864液晶介绍 (1)12864是128*64点阵液晶模块的点阵数简称,业界约定俗成的简称。12864点阵的屏显成本相对较低,适用于各类仪器,小型设备的显示领域。12864M汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。

12864引脚说明 查阅“12864M.PDF”12864M液晶显示模块技术手册——四、用户指令集 1、指令表1:(RE=0:基本指令表),如下图,讲解了12864的基本指令集和扩充指令集。

当模块在接受指令前,微处理器必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0。“RE”为基本指令集与扩充指令集的选择控制位元,往后的指令集将维持在最后的状态。 当选择G=0 :绘图显示OFF,汉字显示的时,12864屏只能显示8X4=32个汉字,下面是汉字显示的坐标

二、12864液晶屏驱动电路 原件名称所属类(Category) 所属子类(Sub-category) AT89C52 Microprocessor ICs 8051 Family POT-HG Resistors Variable RESPACK-8 Resistors Resistor Packs LCD12864A 自制- AT89C52的P0口连接12864的并行数据口,RP1为P0口的上拉排阻。 三、52代码编写 (1)打开keil uVision4,建立一个新的工程,工程名为"12864 graphic LCD parallel display",保存类型*.uvproj,单片机型号AT89C52。在工程中添加12864 graphic LCD parallel display.c文件,如下图

12864液晶显示程序(图案+文字)

#include sbit LCD12864_RS = P2^0; //RS控制引脚 sbit LCD12864_RW = P2^1; //RW控制引脚 sbit LCD12864_EN = P2^2; //EN控制引脚 sbit LCD12864_PSB = P2^3; //模式选择引脚,ST7920控制器,1为8位并行接口,0为串行接口 #define LCDPORT P0//数据引脚 void LCD12864_Init(void); //LCD12864初始化函数 void LCD12864_WriteInfomation(unsigned char ucData,bit bComOrData); //向LCD12864写入数据,bComOrData为1时写入的是数据,0时写入的是命令 void LCD12864_CheckBusy(void);//忙检测函数 void LCD12864_DisplayImage(unsigned char code *ucImage); void Delay(unsigned int uiCount); unsigned char code ucPic1[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0x30,0x01,0xE0,0x00,0x00,0x2A,0x00,0x00,0xD8,0x00,0x00,0x00,0x00,0x00, 0x00,0x0F,0x7B,0x63,0xE0,0x00,0x00,0x22,0x00,0x01,0x24,0x00,0x00,0x00,0x00,0x00, 0x00,0x0F,0xFB,0x63,0x07,0x34,0x00,0x14,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x00, 0x00,0x0D,0xDB,0x63,0x01,0xBC,0x00,0x08,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x1B,0x63,0x07,0xB0,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x1B,0x63,0xED,0xB0,0xDB,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0C,0x19,0xE1,0xE7,0xB0,0xDB,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0A,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0A,0x00,0x00,0xFF,0xF8,0xE0,0x05,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x06,0xC0,0x15,0x00,0x1F,0xFF,0xFF,0xC0,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x09,0x20,0x11,0x00,0xFB,0xFF,0xE1,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x20,0x0A,0x03,0x9F,0x00,0x9E,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x04,0x40,0x04,0x0E,0x70,0x00,0x81,0xC7,0x80,0x01,0x40,0x00,0x00,0x00,0x00, 0x00,0x02,0x80,0x00,0x1D,0x80,0x00,0xE0,0x61,0xE0,0x02,0xA0,0x00,0x00,0x00,0x00, 0x00,0x01,0x00,0x00,0x77,0x9F,0xFC,0xF0,0x18,0xF8,0x02,0x20,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x01,0xDF,0x00,0x00,0xF3,0x0C,0x3C,0x01,0x40,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x9E,0x00,0x00,0xF8,0x06,0x1E,0x00,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x0E,0x30,0x01,0xFC,0x7F,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0x83,0xC0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0F,0xFD,0xFF,0xFF,0xFF,0xFF,0xFC,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,

12864LCD显示倒计时程序

简介:第一行显示,距离系统爆炸时间 第二行显示,还剩 第三行显示,00时,00分,00秒 第四行显示,周林 按下旋钮开关,开始设定秒,秒编辑位闪动。左右旋转设定数值, 在按下开关,秒确定,设定分,分编辑位闪动左右调数值, 再按下,分确定,小时位闪动。左右转调小时,再按一下。时间确定,开始倒计时。到达定时时间后停止,并闪动。 #include #include /********************* 定义********************************/ #define LCD_data P0 //数据口 sbit LCD_RS = P2 ^ 0; //寄存器选择输入 sbit LCD_RW = P2 ^ 1; //液晶读/写控制 sbit LCD_EN = P2 ^ 2; //液晶使能控制 sbit LCD_PSB = P2 ^ 3; //串/并方式控制 sbit LCD_RST = P2 ^ 5; //液晶复位端口 sbit sset=P3^4;//设置按钮 sbit spk=P1^4; sbit sadd=P2^7; sbit sdel=P2^6;

signed char second=0,minute=0,hour=0,count=0,keycount=0; signed char key=0; unsigned char code DIS1[] = { "距离系统爆炸时间" }; unsigned char code DIS2[] = { "还剩:" }; unsigned char code DIS31[] = { "时" }; unsigned char code DIS32[] = { "分" }; unsigned char code DIS33[] = { "秒" };

LCD12864液晶显示模块(中文资料)

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

LCD12864液晶基本程序

LCD12864液晶基本程序 #includereg52.h#includeintrins.h#define uchar unsingned char#define uint unsigned intsbit rs=P2;sb it rw=P2 ;sbit e=P2;sb it psb=P2;ucha r table[]=“20100419”;write_12864com(uchar com);write_12864dat(uchar dat);void initinal(void);void display1(void);void display2(void);void display3(void);void delay50us(uint t)//延时函数{ uint j; for(;t0;t--) for(j=6245;j0;j--); }void main() { initnal(); while(1) { display1(); display2(); while(1); } }write_12864com(uchar com) //写程序函数{ rw=0; rs=0; //表明写程序delay_50us(1); P0=com; delay_50us(10); E=0; delay_50us(2); }write_12864dat(uchar dat) //写数据函数{ rw=0; rs=1;//表 明写数据delay_50us(1); P0=dat; delay_50us(10); E=0; delay_50us(2); }void initinal(void) //初始化函数{ delay_50us(1);//等待100 毫秒write_2864com(0x30); delay_50us(4); write_2864com(0x30); delay_50us(4); write_2864com(0x0f); delay_50us(4); write_2864com(0x01);//清平显示delay_50us(240); write_2864com(0x06); delay_50us(10); }void display1(void)//显示码{ uchar a, i; write_12864com(0x80); //写地址delay_50us(1); for(i=0;i16:i++) { write_12864dat(a); //写数据delay_50us(1); a++; }}void display2(void)//显示汉字{ uchar a,b,i; write_12864com(0xBA); //写地址write_12864com(0xC0); delay_50us(1); for(i=0;i16:i++) { write_12864dat(a); write_12864dat(b); //写数据delay_50us(1); b++; }}void display3(void)//更简单的显示函数{ uchar i; write_12864com(0x80); //写地址for(i=0;i16:i++) { write_12864dat(table[i]); delay_50us(1); i++; }}tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

相关文档