LCD12864点阵型液晶显示器总结

LCD12864点阵型液晶显示器总结

一、LCD12864点阵型液晶显示器介绍

LCD12864点阵型液晶显示器是一种具有4 位或8 位并行、2 线或3线串行多种接口方式,内部可含有或不含有国标一级、二级简体中文字库的点阵型液晶显示器。其中LCD12864点阵型液晶显示器中128表示128列,64表示64行,总共有128x64=8192个点。常见LCD12864点阵型液晶显示器内部控制器以ST7920芯片为主,内置了DDRAM(Data Display Ram:数据显示随机存储器)、CGROM(Character Generation ROM:字符发生只读存储器)、CGRAM(Character Generation RAM:字符发生随机存储器)、GDRAM(Graphic Display RAM:图形显示随机存储器)、HCGROM(Half height Character Generation ROM:半宽字符发生只读存储器)。在此分别介绍LCD12864点阵型液晶显示器内部控制器ST7920芯片中的五种存储器,如下所示。

1、DDRAM(Data Display Ram):数据显示随机存储器,往里面写啥,屏幕就会显示啥。

2、CGROM(Character Generation ROM):字符发生只读存储器,里面存储了2M的8192个字符(包括中文、英文字母、数字、符号、ASCII码、日文字符、希腊文)的字模。在LCD12864点阵型液晶显示器界面可用16(行)x16(列)点阵来显示一个中文汉字。

3、CGRAM(Character Generation RAM):字符发生随机存储器,可以产生128K的字符,用于用户自定义字符,一次可以自定义4个字符。在LCD12864点阵型液晶显示器界面可用16(行)x16(列)点阵来显示。

4、GDRAM(Graphic Display RAM):图形显示随机存储器,里面存储了一块16384个点的文字图形区域,用于写文字绘图,往里面写啥绘啥,屏幕就会显示啥,它与DDRAM(数据显示随机存储器)的区别在于,往DDRAM(数据显示随机存储器)中写的数据是字符的编码,字符的显示先是在CGROM(字符发生只读存储器)中找到字模,然后映射到屏幕上,而往GDRAM(图形显示随机存储器)中写的数据是图形的点阵信息,每个点用1bit来保存其显示与否。

5、HCGROM(Half height Character Generation ROM):半宽字符发生只读存储器,里面存储了16K的126个字符,就是英文字母、数字、符号。在LCD12864点阵型液晶显示器界面可用16(行)x8(列)点阵来显示一个英文字母或数字或符号。

6、LCD12864点阵型液晶显示器 DDRAM(Data Display Ram:数据显示随机存储器)、CGROM(Character Generation ROM:字符发生只读存储器)、CGRAM(Character Generation RAM:字符发生随机存储器) 、HCGROM(Half height Character Generation ROM:半宽字符发生只读存储器)各自作用:

(1)、DDRAM(Data Display Ram:数据显示随机存储器):把读到的数据(包括中文、英文字母、数字、符号、ASCII码、日文字符、希腊文以及自定义字符)显示到LCD12864点阵型液晶显示器界面。

(2)、CGROM(Character Generation ROM:字符发生只读存储器):存储了中文、英文字母、数字、符号、ASCII码、日文字符、希腊文字符的字模编码,是液晶屏出厂时被固化在控制芯片中,用户不能改变其中的存储内容,只能读取调用。

(3)、CGRAM(Character Generation RAM:字符发生随机存储器):留给用户存储自定义的字模编码。

(4)、HCGROM(Half height Character Generation ROM:半宽字符发生只读存储器):存储英文字母、数字、符号的字模编码。

7、LCD12864点阵型液晶显示器 DDRAM(Data Display Ram:数据显示随机存储器)、CGROM(Character Generation ROM:字符发生只读存储器)、CGRAM(Character Generation RAM:字符发生随机存储器) 、HCGROM(Half height Character Generation ROM:半宽字符发生只读存储器)之间的联系:打个比方,CGRAM(Character Generation RAM:字符发生随机存储器)和CGROM(Character Generation ROM:字符发生只读存储器)中存储的字模信息相当于厨房中的食品,CGRAM(Character Generation RAM:字符发生随机存储器)是用户自行制作的菜肴,CGROM(Character Generation ROM:字符发生只读存储器)是厨房中现成的熟食,这些食品都要通过托盘转移一下,才能送到餐桌上食用。这类似于LCD12864点阵型液晶显示器界面要显示字符,先从CGROM(Character Generation ROM:字符发生只读存储器)和CGRAM(Character Generation RAM:字符发生随机存储器)读取到字模编码,再写入DDRAM(Data Display Ram:数据显示随机存储器)中,经如上中转以后,LCD12864点阵型液晶显示器界面在相应位置才显示出字符

二、LCD12864点阵型液晶显示器尺寸图

三、LCD12864点阵型液晶显示器示意图

说明:由上图可知,LCD12864点阵型液晶显示器有128(列)x64(行),共有128x64=8192个点,可分左半屏(或上半屏)、右半屏(或下半屏),左半屏(或上半屏)对应DDRAM(Data Display Ram:数据显示随机存储器)内存地址是80H~87H、90H~97H、A0H~A7H、B0H~B7H,右半屏(或下半屏)对应DDRAM(Data Display Ram:数据显示随机存储器)内存地址是88H~8FH、98H~9FH、A8H~AFH、B8H~BFH,分四大行,每一大行有一大页,共四大页,每一大页有两小页(小页地址:从0xb8到0xa5),共八小页,每一小页有八行,共六十四行。

四、LCD12864点阵型液晶显示器连接原理图

1、第一种LCD12864点阵型液晶显示器连接原理图(LCD12864点阵型液晶显示器引脚功能说明对应下面第一种LCD12864点阵型液晶显示器引脚功能列表)

2、第二种LCD12864点阵型液晶显示器连接原理图(LCD12864点阵型液晶显示器引脚功能说明对应下面第二种LCD12864点阵型液晶显示器引脚功能列表(常用))

五、LCD12864点阵型液晶显示器引脚功能列表

1、第一种LCD12864点阵型液晶显示器引脚功能列表

管脚号

管脚名称

电平

管脚功能描述

1

VSS

0

电源地

2

VDD

+5.0V

电源电压

3

V0

-

液晶显示器驱动电压

4

RS(CS)

H/L

数据/指令选择端:

RS ="H"=1为数据选择端,RS ="L"= 0为命令选择端。

RS =“H”= 1,表示数据输入输出引脚DB7∽DB0为显示数据。

RS =“L”= 0,表示数据输入输出引脚DB7∽DB0为显示指令数据。

5

R/W

H/L

读/写选择端:

R/W =“H”= 1为读选择端,R/W =“L”= 0为写选择端。

R/W =“H”= 1,EN =“H”= 1,数据被读到数据输入输出引脚DB7∽DB0。

R/W =“L”= 0,EN =“H→L”= 1→0,数据被写到IR(指令寄存器)或DR(数据寄存器)。

6

EN(SCLK)

H/L

使能端

R/W =“H”= 1,EN =“H”DDRAM数据读到数据输入输出引脚DB7∽DB0。

R/W =“L”= 0,,EN信号下降沿锁存数据输入输出引脚DB7∽DB0。

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

CS1

H/L

CS1 = 0,CS2 = 1,左半屏。

16

CS2

H/L

CS1 = 1,CS2 = 0,右半屏。

17

RST

H/L

复位信号,低电平复位。

18

VOUT

-10V

LCD驱动负电压

19

LEDA

+

LED背光源正极

20

LEDB

-

LED背光源负极

2、第二种LCD12864点阵型液晶显示器引脚功能列表(常用)

管脚号

管脚名称

电平

管脚功能描述

1

VSS

0

电源地

2

VDD

+5.0V

电源电压

3

V0

-

液晶显示器驱动电压

4

RS(CS)

H/L

数据/指令选择端:

RS="H"=1为数据选择端,RS="L"=0为命令选择端。

RS=“H”= 1,表示数据输入输出引脚DB7∽DB0为显示数据。

RS=“L”= 0,表示数据输入输出引脚DB7∽DB0为显示指令数据。

5

R/W

H/L

读/写选择端:

R/W=“H”= 1为读选择端,R/W=“L”= 0为写选择端。

R/W=“H”= 1,EN=“H”= 1,数据被读到数据输入输出引脚DB7∽DB0。

R/W=“L”= 0,EN=“H→L”= 1→0,数据被写到IR(指令寄存器)或DR(数据寄存器)。

6

EN(SCLK)

H/L

使能端 :

R/W=“H”= 1,EN=“H”DDRAM数据读到数据输入输出引脚DB7∽DB0。

R/W=“L”= 0,,EN信号下降沿锁存数据输入输出引脚DB7∽DB0。

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:并行,L串行。

16

NC

空脚

17

/RST

H/L

复位信号,低电平复位。

18

NC

空脚

19

LEDA

+

LED背光源正极

20

LEDB

-

LED背光源负极

六、LCD12864点阵型液晶显示器读写操作

七、LCD12864点阵型液晶显示器内部存储器详细介绍

1、DDRAM(Data Display Ram:数据显示随机存储器)

(1)、DDRAM是什么?

DDRAM(Data Display Ram):数据显示随机存储器

(2)、DDRAM有什么作用?

把存进来的数据显示到LCD12864点阵型液晶显示器界面上

(3)、DDRAM内存地址

80H、81H、82H、83H、84H、85H、86H、87H、88H、89H、8AH、8BH、8CH、8DH、8EH、8FH

90H、91H、92H、93H、94H、95H、96H、97H、98H、99H、9AH、9BH、9CH、9DH、9EH、9FH

A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7H、A8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH

B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7H、B8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH

说明:红色部分的DDRAM内存地址是LCD12864点阵型液晶显示器左半屏(或上半屏)显示数据的DDRAM内存地址,棕色部分的DDRAM内存地址是LCD12864点阵型液晶显示器右半屏(或下半屏)显示数据的DDRAM内存地址。一般用左半屏(或上半屏)前两行DDRAM内存地址(即80H~87H与90H~97H)和右半屏(或下半屏)前两行DDRAM内存地址(即88H~8FH与98H~9FH)作为LCD12864点阵型液晶显示器显示数据的DDRAM内存地址,如图所示。(切记不可在左半屏(或上半屏)使用右半屏(或下半屏)显示数据的DDRAM内存地址来显示数据,也不可在右半屏(或下半屏)使用左半屏(或上半屏)显示数据的DDRAM内存地址来显示数据。)

(4)、DDRAM(Data Display Ram:数据显示随机存储器)与LCD12864点阵型液晶显示器显示位置对应关系

<1>、DDRAM(Data Display Ram:数据显示随机存储器)存储汉字与LCD12864点阵型液晶显示器显示位置对应关系

说明:上图红色区域表示LCD12864点阵型液晶显示器其中一个16(行)x16(列)点阵。如果DDRAM(Data Display Ram:数据显示随机存储器)内存地址存储的是汉字,那么需要使用LCD12864点阵型液晶显示器16(行)x16(列)点阵来显示,相当于占用LCD12864点阵型液晶显示器一大行中一大页里的16(行)x16(列)(结合上图红色区域与字符“你”来理解),即两小页中的16(行)x16(列)(结合上图红色区域与字符“你”来理解),那么半个汉字就是占用一小页中的8(行)x16(列)(结合上图字符“你”来理解)。由此可知:LCD12864点阵型液晶显示器每一个16(行)x16(列)点阵分别对应着DDRAM(Data Display Ram:数据显示随机存储器)每一个内存地址(如上图红色区域与80H所示)。

<2>、DDRAM(Data Display Ram:数据显示随机存储器)存储半宽字符(比如:英文字母、数字、符号、ASCII码、日文字符、希腊文字符)与LCD12864点阵型液晶显示器显示位置对应关系

说明:上图红色区域表示LCD12864点阵型液晶显示器其中一个16(行)x8(列)点阵。如果DDRAM(Data Display Ram:数据显示随机存储器)内存地址存储的是英文字母(或者是数字、符号、ASCII码、日文字符、希腊文字符),那么需要使用LCD12864点阵型液晶显示器16(行)x8(列)点阵来显示,相当于占用LCD12864点阵型液晶显示器一大行中一大页里的16(行)x8(列)(结合上图红色区域与英文字母“A”来理解),即两小页中的16(行)x8(列)(结合上图红色区域与英文字母“A”来理解),那么半个英文字母就是占用一小页中的8(行)x8(列)(结合上图英文字母“A”来理解)。由此可知:LCD12864点阵型液晶显示器每一个16(行)x8(列)点阵分别对应着DDRAM(Data Display Ram:数据显示随机存储器)每一个内存地址(如上图红色区域与80H所示)。

(5)、DDRAM(Data Display Ram:数据显示随机存储器)内部数据读写

DDRAM(Data Display Ram:数据显示随机存储器)内部存储的数据是字符的编码,可以写入的编码有ASCII码、GB2312码、BIG5码等。所有数据读写都是先取DDRAM(Data Display Ram:数据显示随机存储器)内存地址,然后把数据写到DDRAM(Data Display Ram:数据显示随机存储器)内存地址上或从DDRAM(Data Display Ram:数据显示随机存储器)内存地址上把数据读出来。

<1>、单片机从LCD12864点阵型液晶显示器内部ST7920芯片的DDRAM(Data Display Ram:数据显示随机存储器)读取数据

先写开启基本指令集的指令0x30,再写DDRAM(Data Display Ram:数据显示随机存储器)指定地址,然后假读一次,之后从LCD12864点阵型液晶显示器内部ST7920芯片的DDRAM(Data Display Ram:数据显示随机存储器)指定地址上连续读取出2个字节的数据,读完之后地址指针自动加一,跳到下一个字的地址,若需要读下一个字的内容,只需再执行从LCD12864点阵型液晶显示器内部ST7920芯片的DDRAM(Data Display Ram:数据显示随机存储器)指定地址上连续读取出2个字节的数据。这里的假读需要注意,不光是读DDRAM需要假读,读其他的CGRAM、GDRAM都需要先假读一次,之后的读才是真读,假读就是读一次数据,但不存储该数据,也就是说送地址之后第一次读的数据时是错误的,之后的数据才是正确的。(dummy为假读)

<2>、单片机写数据到LCD12864点阵型液晶显示器内部ST7920芯片的DDRAM(Data Display Ram:数据显示随机存储器)

先写开启基本指令集的指令0x30,再写DDRAM(Data Display Ram:数据显示随机存储器)指定地址,之后连续写入2个字节的数据到LCD12864点阵型液晶显示器内部ST7920芯片的DDRAM(Data Display Ram:数据显示随机存储器)指定地址上,如下所示。

uchar code table1[]="您好啊!欢迎来到";

uchar code table2[]="电气项目的实验室";

uchar code table3[]="创新是我们的灵魂";

uchar code table4[]="坚持是我们的品格";

void DDRAM()//写随机字符函数

{

uchar i;

LCD12864WriteCommand(0x30);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收基本指令操作。

LCD12864WriteCommand(0x80);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第1个内存地址

for(i=0;i<8;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(table1[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteData(table1[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。

}

LCD12864WriteCommand(0x90);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第2个内存地址

for(i=0;i<8;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(table2[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteData(table2[i* 2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。

}

LCD12864WriteCommand(0x88);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第3个内存地址

for(i=0;i<8;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(table3[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteData(table3[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。

}

LCD12864WriteCommand(0x98);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第4个内存地址

for(i=0;i<8;i++)//一个完整自定义字符占用LCD12864点阵型液晶显器16(示行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(table4[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteData(table4[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。

}

}

(6)、单片机驱动LCD12864点阵型液晶显示器内部ST7920芯片给LCD12864点阵型液晶显示器传送数据的模式

当PSB脚接高电平时,LCD12864点阵型液晶显示器内部ST7920芯片将进入并行模式,若功能设定指令寄存器中的寄存器单元DL=1,单片机结合RS(数据/指令选择端)、R/W(读/写选择端)、EN(使能端)、D0~D7输出输入引脚来驱动LCD12864点阵型液晶显示器内部ST7920芯片以8位数据形式给LCD12864点阵型液晶显示器传送数据,若功能设定指令寄存器中的寄存器单元DL=0,单片机结合RS(数据/指令选择端)、R/W(读/写选择端)、EN(使能端)、D0~D7输出输入引脚来驱动LCD12864点阵型液晶显示器内部ST7920芯片以4位数据形式给LCD2864点阵型液晶显示器传送数据。当PSB脚接接低电平时,LCD12864点阵型液晶显示器内部ST7920芯片将进入串行模式,若功能设定指令寄存器中的寄存器单元DL=1,单片机结合RS(数据/指令选择端)、R/W(读/写选择端)、EN(使能端)、D0~D7输出输入引脚来驱动LCD12864点阵型液晶显示器内部ST7920芯片以8位数据形式给LCD12864点阵型液晶显示器传送数据,若功能设定指令寄存器中的寄存器单元DL=0,单片机结合RS(数据/指令选择端)、R/W(读/写选择端)、EN(使能端)、D0~D7输出输入引脚来驱动LCD12864点阵型液晶显示器内部ST7920芯片以4位数据形式给LCD2864点阵型液晶显示器传送数据。

<1>、单片机驱动LCD12864点阵型液晶显示器内部ST7920芯片以8位数据并行总线模式给LCD12864点阵型液晶显示器传送数据的时序图

<2>、单片机驱动LCD12864点阵型液晶显示器内部ST7920芯片以4位数据并行总线模式给LCD12864点阵型液晶显示器传送数据的时序图

<3>、单片机驱动LCD12864点阵型液晶显示器内部ST7920芯片以串行总线模式给LCD12864点阵型液晶显示器传送数据的时序图

(6)、字符编码在DDRAM中存储的事项说明

<1>、每次对DDRAM的操作单位是一个字,也就是2个字节。当往DDRAM写入数据时,首先写地址,然后连续送入2个字节的数据,先送高字节数据,再送低字节数据。读数据时也是如此,先写地址,然后读出高字节数据,再读出低字节数据(注意:读数据时先假读一次)。

<2>、显示ASCII码半宽字符时,往每个地址送入2个字节的ASCII编码,对应LCD12864点阵型液晶显示器显示位置就会显示2个半宽字符,左边的为高字节字符,右边的为低字节字符。

<3>、显示汉字时,汉字编码的2个字节必须存储在同一地址空间中,不能分开放在2个地址存放,否则显示的就不是你想要的字符。每个字中的2个字节自动结合查找字模并显示字符。所以,如果我们往一个地址中写入的是一个汉字的2字节编码就会正确显示该字符,若编码高字节存放在前一地址低字节,编码低字节存放在后一地址高字节,显然他们就不会结合查找字模,而是与各地址相应字节结合查找字模。

2、CGROM(Character Generation ROM:字符发生只读存储器)

(1)、CGROM(Character Generation ROM:字符发生只读存储器)是什么?

CGROM(Character Generation ROM):字符发生只读存储器

(2)、CGROM(Character Generation ROM:字符发生只读存储器)有什么作用?

将存储的字符(包括中文、英文、数字、符号、ASCII码、日文字符、希腊文)供给LCD12864点阵型液晶显示器读取到界面上显示

(3)、CGROM(Character Generation ROM:字符发生只读存储器)存储的GB字符列表

说明:CGROM(Character Generation ROM:字符发生只读存储器)存储器存储的字符列表中字符码A140H〜D75FH为BIG5(大五码,包括标点符号、希腊字母及特殊符号。),字符码A1A0H〜F7FFH为GB(国标,包括中文、英文、数字、符号、ASCII码、日文字符、希腊文)。

(4)、CGROM(Character Generation ROM:字符发生只读存储器)内部数据读写

CGROM内部存储的数据是中文、英文、数字、符号、ASCII码、日文字符、希腊文字符的编码,所有的数据读写都是先送地址,然后进行读写。

<1>、单片机从LCD12864点阵型液晶显示器内部ST7920芯片的CGROM(Character Generation ROM:字符发生只读存储器)读取数据

<2>、单片机写数据到LCD12864点阵型液晶显示器内部ST7920芯片的CGROM(Character Generation ROM:字符发生只读存储器)

3、CGRAM(Character Generation RAM:字符发生随机存储器)

(1)、CGRAM(Character Generation RAM:字符发生随机存储器)是什么?

CGRAM(Character Generation RAM):字符发生随机存储器

(2)、CGRAM(Character Generation RAM:字符发生随机存储器)有什么作用?

将存储用户自定义的字符供给LCD12864点阵型液晶显示器读取到界面上显示

(3)、CGRAM(Character Generation RAM:字符发生随机存储器)存储自定义字符地址列表

说明:CGRAM(Character Generation RAM:字符发生随机存储器)可以自定义4个字符,分别存储在0x40、0x50、0x60、0x70的CGRAM(Character Generation RAM:字符发生随机存储器)内存地址上,要在LCD12864点阵型液晶显示器界面显示,只需把这4个自定义字符分别对应写进DDRAM(Data Display Ram:数据显示随机存储器)内存地址0000H、0002H、 0004H、0006H即可。而上图只在CGRAM(Character Generation RAM:字符发生随机存储器)中自定义2个字符的CGRAM(Character Generation RAM:字符发生随机存储器)空间画出,另外还有2个。由此可以看出CGRAM((Character Generation RAM:字符发生随机存储器)内部自定义字符都是用16(行)x16(列)点阵来显示,每一行使用2个字节,则一个自定义字符占用空间是32字节。

(4)、CGRAM(Character Generation RAM:字符发生随机存储器)内部数据读写

读写之前先写开启基本指令集的指令0x30,再写地址,写CGRAM(Character Generation RAM:字符发生随机存储器)的地址指令为0x40+地址,地址每次做加一变化,之后从LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM(Character Generation RAM:字符发生随机存储器)指定地址上连续读取2个字节的数据或写入2个字节的数据到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM(Character Generation RAM:字符发生随机存储器)指定地址上。

<1>、单片机从LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM(Character Generation RAM:字符发生随机存储器)读取数据

先写开启基本指令集的指令0x30,再写CGRAM(Character Generation RAM:字符发生随机存储器)中指定地址,然后假读一次,接着从LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM(Character Generation RAM:字符发生随机存储器)指定地址上连续读取2个字节的数据。

<2>、单片机写数据到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM(Character Generation RAM:字符发生随机存储器)

先写开启基本指令集的指令0x30,再写CGRAM(Character Generation RAM:字符发生随机存储器)中内存首地址0x40,接着连续写入2个字节的数据到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM(Character Generation RAM:字符发生随机存储器)内存地址0x40上,直到在LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM(Character Generation RAM:字符发生随机存储器)内存地址0x40上写完32个字节的数据为止。例如:先写开启基本指令集的指令0x30,取CGRAM(Character Generation RAM:字符发生随机存储器)中第一个字符内存首地址0x40,再写入2个字节的数据到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM(Character Generation RAM:字符发生随机存储器)内存地址0x40上,之后地址指针每次会自动加一,跳到下一行的地址,再写入2个字节的数据到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM(Character Generation RAM:字符发生随机存储器)内存地址0x40上,直到在LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM(Character Generation RAM:字符发生随机存储器)内存地址0x40上写完32个字节的数据为止,如下所示。

//太阳

uchar code sun[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x08,0x10,0x00,0x00,0x10,0x08,0x00,0x00,0x10,0x08,0x00,0x00,0x08,0x10,0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x00};

//月亮

uchar code moon[]={0x00,0x00,0x00,0x00,0x03,0x80,0x02,0x40,0x02,0x20,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x20,0x02,0x40,0x03,0x80,0x00,0x00,0x00,0x00};

//星星

uchar code star[]={0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x80,0x00,0x00,0x54,0x54,0x20,0x08,0x08,0x20,0x02,0x80,0x12,0x90,0x08,0x20,0x20,0x08,0x00,0x00,0x00,0x00};

//人

uchar code robot[]={0x07,0xE0,0x08,0x10,0x12,0x48,0x10,0x08,0x1F,0xF8,0x10,0x08,0x30,0x0C,0x50,0x0A,0x50,0x0A,0x50,0x0A,0x50,0x0A,0x5F,0xFA,0x04,0x20,0x04,0x20,0x04,0x20,0x0E,0x70};

void CGRAM()//写自定义字符函数

{

uchar i;

LCD12864WriteCommand(0x30);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收基本指令操作。

LCD12864WriteCommand(0x40);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第1个内存地址

for(i=0;i<16;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(sun[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteData(sun[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。

}

LCD12864WriteCommand(0x50);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第2个内存地址

for(i=0;i<16;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(moon[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteData(moon[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。

}

LCD12864WriteCommand(0x60);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第3个内存地址

for(i=0;i<16;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(star[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteData(star[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。

}

LCD12864WriteCommand(0x70);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第4个内存地址

for(i=0;i<16;i++)//一个完整自定义字符占用LCD12864点阵型液晶显器16(示行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(robot[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteData(robot[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。

}

}

4、GDRAM(Graphic Display RAM:图形显示随机存储器)

(1)、GDRAM(Graphic Display RAM:图形显示随机存储器)是什么?

GDRAM(Graphic Display RAM):图形显示随机存储器

(2)、GDRAM(Graphic Display RAM:图形显示随机存储器)有什么作用?

把存进来的数据显示到LCD12864点阵型液晶显示器界面上

(3)、GDRAM(Graphic Display RAM:图形显示随机存储器)坐标位址图

说明:LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)内存地址本来可供给LCD12864点阵型液晶显示器显示界面绘制32行x256列的图像,但LCD12864点阵型液晶显示器内在结构被分成了上下两屏显示,上半屏(左半屏)是32行x128列,下半屏(右半屏)是32行x128列。

(4)、LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)内存地址与LCD12864点阵型液晶显示器显示位址对应关系

说明:LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)内存地址本来可供LCD12864点阵型液晶显示器显示界面绘制32行x256列的图像,但LCD12864点阵型液晶显示器内在结构被分成了上下两屏显示,上半屏(左半屏)是32行x128列,下半屏(右半屏)是32行x128列。由上图可知:LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)内存地址把LCD12864点阵型液晶显示器显示界面分成两种坐标来显示图像,分别是水平坐标(列地址或水平地址X)与垂直坐标(行地址或垂直地址Y)。其中水平坐标(列地址或水平地址X)范围为:00H~15H,垂直坐标(行地址或垂直地址Y)范围为00H~31H。因LCD12864点阵型液晶显示器内在结构被分成了上下两屏显示,那么水平坐标(列地址或水平地址X)上半屏坐标范围为:00H~07H,下半屏坐标范围为:08H~15H,而垂直坐标(行地址或垂直地址Y)上下半屏坐标范围一样,都为00H~31H。并且水平坐标(列地址或水平地址X)上每一个坐标X表示16列(或16个点),而垂直坐标(行地址或垂直地址Y)上的每一个坐标Y表示1行。

说明:LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)内存地址本来可供LCD12864点阵型液晶显示器显示界面绘制32行x256列的图像,但LCD12864点阵型液晶显示器内在结构被分成了上下两屏显示,上半屏(左半屏)是32行x128列,下半屏(右半屏)是32行x128列。由上图可知:LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)内存地址把LCD12864点阵型液晶显示器显示界面分成两种坐标来显示图像,分别是水平坐标(列地址或水平地址X)与垂直坐标(行地址或垂直地址Y)。其中水平坐标(列地址或水平地址X)范围为:00H~0FH,垂直坐标(行地址或垂直地址Y)范围为00H~1FH。因LCD12864点阵型液晶显示器内在结构被分成了上下两屏显示,那么水平坐标(列地址或水平地址X)上半屏坐标范围为:00H~07H,下半屏坐标范围为:08H~0FH,而垂直坐标(行地址或垂直地址Y)上下半屏坐标范围一样,都为00H~1FH。并且水平坐标(列地址或水平地址X)上每一个坐标X表示16列(或16个点),而垂直坐标(行地址或垂直地址Y)上的每一个坐标Y表示1行。

(5)、GDRAM(Graphic Display RAM:图形显示随机存储器)内部数据读写

读写之前先写开启扩展指令集的指令0x34,再写地址,写GDRAM(Graphic Display RAM:图形显示随机存储器)的地址指令为0x80+地址,地址每次做加一变化,之后从LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)指定地址上连续读取2个字节的数据或写入2个字节的数据到LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)指定地址上。

<1>、单片机从LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)读取数据

先写开启扩展指令集的指令0x34,再写垂直坐标(行地址或垂直地址Y),即0x80+Y,然后写水平坐标(列地址或水平地址X),即0x80+X,且假读一次,之后从LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)垂直坐标(行地址或垂直地址Y)和水平坐标(列地址或水平地址X)指定地址上连续读取2个字节的数据(先读高字节数据,后读低字节数据。),并且GDRAM(Graphic Display RAM:图形显示随机存储器)的地址计数器(即AC)只会对水平坐标(列地址或水平地址X)自动加1,垂直坐标(行地址或垂直地址Y)要用数据循环写入。单片机从LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)读取数据时序图如下所示。

<2>、单片机写数据到LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)

先写开启扩展指令集的指令0x34,再写坐标【(即写坐标指令:0x80+坐标),这里的坐标分有2个,分别是水平坐标(列地址或水平地址X)与垂直坐标(行地址或垂直地址Y)。上图中水平坐标(列地址或水平地址X)就是00H~0FH(上半屏坐标范围为:00H~07H,下半屏坐标范围为:08H~0FH。),垂直坐标(行地址或垂直地址Y)就是00H~1FH垂直坐标(上下半屏坐标范围一样,都为00H~1FH。)】,就是先写垂直坐标(行地址或垂直地址Y),即0x80+Y,再写水平坐标(列地址或水平地址X),即0x80+X,之后连续写入2个字节的数据到LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)垂直坐标(行地址或垂直地址Y)和水平坐标(列地址或水平地址X)指定地址上,并且GDRAM(Graphic Display RAM:图形显示随机存储器)的地址计数器(即AC)只会对水平坐标(列地址或水平地址X)自动加1,而垂直坐标(行地址或垂直地址Y)要用数据循环写入,如下所示。

第一种

unsigned char code image[]=

{

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,

0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFC,0x00,0x00,0x00,

0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,

0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xE0,0x00,0x00,0x00,

0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0x00,0x00,

0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,

0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x00,0x00,

0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xE0,0x00,0x00,0x00,0x00,

0x00,0x00,0x07,0xF8,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,

0x00,0x00,0x0F,0xF8,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x1F,0xF8,0x00,0x00,0x00,0x00,0x7F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x03,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFC,0x00,0x00,0x00,0x1F,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFE,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0x00,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0x80,0x00,0x3F,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xC0,0x01,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xE0,0x0F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xF0,0x7F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x1F,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x0F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x03,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x01,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

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

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

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

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

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

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

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

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

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

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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 ClearGDRAM()//清空GDAM内存地址上内容的函数

{

uchar i,j;

LCD12864WriteCommand(0x34);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收扩展指令操作。

LCD12864WriteCommand(0x34);//设置关LCD12864点阵型液晶显示器绘图功能,与上面的0x34不冲突,在此表示关LCD12864点阵型液晶显示器绘图功能。

for(i=0;i<32;i++)//32表示LCD12864点阵型液晶显示器上半屏32行

{

LCD12864WriteCommand(0x80+i);//设置垂直坐标(行地址或垂直地址Y)从LCD12864点阵型液晶显示器上半屏第1行第一个位置开始

LCD12864WriteCommand(0x80);//设置水平坐标(列地址或水平地址X)从LCD12864点阵型液晶显示器上半屏第1行第一个位置开始,GDRAM(Graphic Display RAM:图形显示随机存储器)的地址计数器(即AC)只会对水平坐标(列地址或水平地址X)自动加1,垂直坐标(行地址或垂直地址Y)要用数据循环写入。

for(j=0;j<16;j++)//一个完整图案占用LCD12864点阵型液晶显示器32(行)x128(列)显示界面,上半屏每一行占用16个字节(即128列)才显示该行某些图案,要写完该行某些图案占用的16个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(0x00);//清空GDAM内存地址上的内容

}

}

for(i=0;i<32;i++)//32表示LCD12864点阵型液晶显示器下半屏32行

{

LCD12864WriteCommand(0x80+i);//设置垂直坐标(行地址或垂直地址Y)从LCD12864点阵型液晶显示器下半屏第1行第一个位置开始

LCD12864WriteCommand(0x88);//设置水平坐标(列地址或水平地址X)从LCD12864点阵型液晶显示器下半屏第1行第一个位置开始,GDRAM(Graphic Display RAM:图形显示随机存储器)的地址计数器(即AC)只会对水平坐标(列地址或水平地址X)自动加1,垂直坐标(行地址或垂直地址Y)要用数据循环写入。

for(j=0;j<16;j++)//一个完整图案占用LCD12864点阵型液晶显示器32(行)x128(列)显示界面,上半屏每一行占用16个字节(即128列)才显示该行某些图案,要写完该行某些图案占用的16个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(0x00);//清空GDAM内存地址上的内容

}

}

LCD12864WriteCommand(0x36);//设置开LCD12864点阵型液晶显示器绘图功能

LCD12864WriteCommand(0x30);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收基本指令操作。

}

void GDRAM(uchar *address)//写绘图函数

{

uchar i,j;

LCD12864WriteCommand(0x34);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收扩展指令操作。

LCD12864WriteCommand(0x34);//设置关LCD12864点阵型液晶显示器绘图功能,与上面的0x34不冲突,在此表示关LCD12864点阵型液晶显示器绘图功能。

for(i=0;i<32;i++)//32表示LCD12864点阵型液晶显示器上半屏32行

{

LCD12864WriteCommand(0x80+i);//设置垂直坐标(行地址或垂直地址Y)从LCD12864点阵型液晶显示器上半屏第1行第一个位置开始

LCD12864WriteCommand(0x80);//设置水平坐标(列地址或水平地址X)从LCD12864点阵型液晶显示器上半屏第1行第一个位置开始,GDRAM(Graphic Display RAM:图形显示随机存储器)的地址计数器(即AC)只会对水平坐标(列地址或水平地址X)自动加1,垂直坐标(行地址或垂直地址Y)要用数据循环写入。

for(j=0;j<16;j++)//一个完整图案占用LCD12864点阵型液晶显示器32(行)x128(列)显示界面,上半屏每一行占用16个字节(即128列)才显示该行某些图案,要写完该行某些图案占用的16个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(*address);//*adress对应数组image[]中的某位数值

address++;//adress对应数组image[]的序列

}

}

for(i=0;i<32;i++)//32表示LCD12864点阵型液晶显示器下半屏32行

{

LCD12864WriteCommand(0x80+i);//设置垂直坐标(行地址或垂直地址Y)从LCD12864点阵型液晶显示器下半屏第1行第一个位置开始

LCD12864WriteCommand(0x88);//设置水平坐标(列地址或水平地址X)从LCD12864点阵型液晶显示器下半屏第1行第一个位置开始,GDRAM(Graphic Display RAM:图形显示随机存储器)的地址计数器(即AC)只会对水平坐标(列地址或水平地址X)自动加1,垂直坐标(行地址或垂直地址Y)要用数据循环写入。

for(j=0;j<16;j++)//一个完整图案占用LCD12864点阵型液晶显示器32(行)x128(列)显示界面,下半屏每一行占用16个字节(即128列)才显示该行某些图案,要写完该行某些图案占用的16个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(*address);//*adress对应数组image[]中的某位数值

address++;//adress对应数组image[]的序列

}

}

LCD12864WriteCommand(0x36);//设置开LCD12864点阵型液晶显示器绘图功能

LCD12864WriteCommand(0x30);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收基本指令操作。

}

第二种

unsigned char code image[]=

{

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,

0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFC,0x00,0x00,0x00,

0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,

0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xE0,0x00,0x00,0x00,

0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0x00,0x00,

0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,

0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x00,0x00,

0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xE0,0x00,0x00,0x00,0x00,

0x00,0x00,0x07,0xF8,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,

0x00,0x00,0x0F,0xF8,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x1F,0xF8,0x00,0x00,0x00,0x00,0x7F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x03,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFC,0x00,0x00,0x00,0x1F,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFE,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0x00,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0x80,0x00,0x3F,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xC0,0x01,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xE0,0x0F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xF0,0x7F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x1F,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x0F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x03,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x01,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

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

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

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

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

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

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

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

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

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

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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 ClearGDRAM()//清空GDAM内存地址上内容的函数

{

uchar i,j,k;

LCD12864_X=0x80;//设置水平坐标(列地址或水平地址X)从LCD12864点阵型液晶显示器第1行第一个位置开始,GDRAM(Graphic Display RAM:图形显示随机存储器)的地址计数器(即AC)只会对水平坐标(列地址或水平地址X)自动加1,垂直坐标(行地址或垂直地址Y)要用数据循环写入。

LCD12864_Y=0x80;//设置垂直坐标(行地址或垂直地址Y)从LCD12864点阵型液晶显示器第1行第一个位置开始

LCD12864WriteCommand(0x34);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收扩展指令操作。

LCD12864WriteCommand(0x34);//设置关LCD12864点阵型液晶显示器绘图功能,与上面的0x34不冲突,在此表示关LCD12864点阵型液晶显示器绘图功能。

for(i=0;i<2;i++)//LCD12864点阵型液晶显示器分为上下两屏

{

for(j=0;j<32;j++)//32表示LCD12864点阵型液晶显示器上半屏或下半屏32行

{

LCD12864WriteCommand(LCD12864_Y+j);//设置垂直坐标(行地址或垂直地址Y)从LCD12864点阵型液晶显示器第1行第一个位置开始

LCD12864WriteCommand(LCD12864_X);//设置水平坐标(列地址或水平地址X)从LCD12864点阵型液晶显示器第1行第一个位置开始,GDRAM(Graphic Display RAM:图形显示随机存储器)的地址计数器(即AC)只会对水平坐标(列地址或水平地址X)自动加1,垂直坐标(行地址或垂直地址Y)要用数据循环写入。

for(k=0;k<16;k++)//一个完整图案占用LCD12864点阵型液晶显示器32(行)x128(列)显示界面,上半屏每一行占用16个字节(即128列)才显示该行某些图案,要写完该行某些图案占用的16个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(0x00);//清空GDAM内存地址上的内容

}

}

LCD12864_X=0x88;//设置水平坐标(列地址或水平地址X)从LCD12864点阵型液晶显示器下半屏第1行第一个位置开始

}

LCD12864WriteCommand(0x36);//设置开LCD12864点阵型液晶显示器绘图功能

LCD12864WriteCommand(0x30);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收基本指令操作。

}

void GDRAM(uchar *p)//写绘图函数

{

uchar i,j,k;

LCD12864_X=0x80;//设置水平坐标(列地址或水平地址X)从LCD12864点阵型液晶显示器第1行第一个位置开始,GDRAM(Graphic Display RAM:图形显示随机存储器)的地址计数器(即AC)只会对水平坐标(列地址或水平地址X)自动加1,垂直坐标(行地址或垂直地址Y)要用数据循环写入。

LCD12864_Y=0x80;//设置垂直坐标(行地址或垂直地址Y)从LCD12864点阵型液晶显示器第1行第一个位置开始

LCD12864WriteCommand(0x34);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收扩展指令操作。

LCD12864WriteCommand(0x34);//设置关LCD12864点阵型液晶显示器绘图功能,与上面的0x34不冲突,在此表示关LCD12864点阵型液晶显示器绘图功能。

for(i=0;i<2;i++)//LCD12864点阵型液晶显示器分为上下两屏

{

for(j=0;j<32;j++)//32表示LCD12864点阵型液晶显示器上半屏或下半屏32行

{

LCD12864WriteCommand(LCD12864_Y+j);//设置垂直坐标(行地址或垂直地址Y)从LCD12864点阵型液晶显示器第1行第一个位置开始

LCD12864WriteCommand(LCD12864_X);//设置水平坐标(列地址或水平地址X)从LCD12864点阵型液晶显示器第1行第一个位置开始,GDRAM(Graphic Display RAM:图形显示随机存储器)的地址计数器(即AC)只会对水平坐标(列地址或水平地址X)自动加1,垂直坐标(行地址或垂直地址Y)要用数据循环写入。

for(k=0;k<16;k++)//一个完整图案占用LCD12864点阵型液晶显示器32(行)x128(列)显示界面,上半屏每一行占用16个字节(即128列)才显示该行某些图案,要写完该行某些图案占用的16个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(*p++);//*p对应数组image[]中的某位数值,而p++对应image[]中的序列。

}

}

LCD12864_X=0x88;//设置水平坐标(列地址或水平地址X)从LCD12864点阵型液晶显示器下半屏第1行第一个位置开始

}

LCD12864WriteCommand(0x36);//设置开LCD12864点阵型液晶显示器绘图功能

LCD12864WriteCommand(0x30);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收基本指令操作。

}

单片机写数据到LCD12864点阵型液晶显示器内部ST7920芯片的GDRAM(Graphic Display RAM:图形显示随机存储器)时序图如下所示。

5、HCGROM(Half height Character Generation ROM:半宽字符发生只读存储器)

(1)、HCGROM是什么?

HCGROM(Half height Character Generation ROM):半宽字符发生只读存储器

(2)、HCGROM有什么作用?

将存储的字符(包括英文、数字、符号)供给LCD12864点阵型液晶显示器读取到界面上显示

(3)、HCGROM字符列表

(4)、HCGROM数据读写

<1>、单片机从LCD12864点阵型液晶显示器内部ST7920芯片的HCGROM读取数据

<2>、单片机写数据到LCD12864点阵型液晶显示器内部ST7920芯片的HCGROM

八、LCD12864点阵型液晶显示器内部ST7920芯片控制指令(提供2套控制指令集,分别是基本指令和扩充指令。)

1、当功能设定寄存器的寄存器单元RE=0时,LCD12864点阵型液晶显示器内部ST7920芯片执行基本指令集,基本指令集列表如下。

说明:当LCD12864点阵型液晶显示器内部ST7920芯片在接受指令前,微处理器必须先确认LCD12864点阵型液晶显示器内部ST7920芯片是否处于非忙碌状态,即读取BF 标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成。“RE”为基本指令集与扩充指令集的选择控制位,当变更“RE”位后,往后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,不需每次重设“RE”位。

(1)、清除显示

功能:将DDRAM 填满“20H”(空格),把DDRAM 地址计数器调整“00H”,重新进入点设定,将I/D设为“1”,光标右移,AC加1。

(2)、地址归位

功能:把DDRAM 地址计数器调整为“00H”,光标回原点,该功能不影响显示DDRAM。

(3)、输入点设置

功能:设定光标移动方向,并指定整体显示是否移动。I/D=1 ,光标右移,AC自动加1; I/D=0 ,光标左移,AC自动减1。S=1 且DDRAM为写状态,整体显示移动,方向由I/D决定(I/D=1,整体左移,I/D=0,整体右移。S=0 或DDRAM 为读状态:整体显示不移动。

(4)、显示状态开/关

功能:D=1:整体显示ON ; D=0:整体显示OFF。C=1: 光标显示ON ; C=0:光标显示OFF。B=1:光标位置反白且闪烁 ; B=0:光标位置不反白闪烁。

(5)、显示开/关设置

功能:该功能适用于以控制芯片KS0108为主的LCD12864点阵型液晶显示器(比如:Proteus仿真电路中的AMPIRE12864点阵型液晶显示器仿真元件)。由上图可知:当DB0=0时,即0x3E,关显示;当DB0=1时,即0x3F,开显示,让LCD12864点阵型液晶显示器显示内容。

(6)、显示起始行设置

功能:该功能适用于以控制芯片KS0108为主的LCD12864点阵型液晶显示器(比如:Proteus仿真电路中的AMPIRE12864点阵型液晶显示器仿真元件)。由上图可知:DDRAM(Data Display Ram:数据显示随机存储器)起始行地址是0xC0,对应LCD12864点阵型液晶显示器第0小行,而DDRAM(Data Display Ram:数据显示随机存储器)终止行地址是0xFF,对应LCD12864点阵型液晶显示器第63小行,由此可知:DDRAM(Data Display Ram:数据显示随机存储器)设置行地址范围为:0xC0-0xFF,分别对应着LCD12864点阵型液晶显示器第0小行到第63小行。

(7)、页地址(X地址)设置

功能:该功能适用于以控制芯片KS0108为主的LCD12864点阵型液晶显示器(比如:Proteus仿真电路中的AMPIRE12864点阵型液晶显示器仿真元件)。由上图可知:DDRAM(Data Display Ram:数据显示随机存储器)首页地址(X地址)是0xB8,对应LCD12864点阵型液晶显示器第0页(或第0小页),而DDRAM(Data Display Ram:数据显示随机存储器)终止页地址是0xBF,对应LCD12864点阵型液晶显示器第7页(或第7小页),由此可知:DDRAM(Data Display Ram:数据显示随机存储器)设置页地址范围为:0xB8-0xBF,分别对应着LCD12864点阵型液晶显示器第0页(第0小页)到第7页(第7小页)

(8)、列地址(Y地址)设置

功能:该功能适用于以控制芯片KS0108为主的LCD12864点阵型液晶显示器(比如:Proteus仿真电路中的AMPIRE12864点阵型液晶显示器仿真元件)。由上图可知:DDRAM(Data Display Ram:数据显示随机存储器)首列地址(X地址)是0x40,对应LCD12864点阵型液晶显示器第0小列,而DDRAM(Data Display Ram:数据显示随机存储器)终止列地址是0x7F,对应LCD12864点阵型液晶显示器第63小列,由此可知:DDRAM(Data Display Ram:数据显示随机存储器)设置列地址范围为:0x40-0x7F,分别对应着LCD12864点阵型液晶显示器第0小列到第63小列。

(9)、光标或显示移位显示控制

功能:S/C:光标左/右移动,AC减/加1。R/L:整体显示左/右移动,光标跟随移动,AC值不变。

(10)、功能设定

功能:DL=1: 8位控制接口; DL=0: 4位控制接口。RE=1: 扩充指令集动作; RE=0: 基本指令集动作。

(11)、设定CGRAM地址

功能:设定CGRAM地址到地址计数器(AC),需确定扩充指令中SR=0(卷动地址或RAM地址选择)。

(12)、设定DDRAM地址

功能:设定DDRAM地址到地址计数器(AC)

(13)、读取忙碌状态(BF)和地址

功能:读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值,当BF=1,表示内部忙碌中,此时不可下指令,需等BF=0时,才可下新指令。

(14)、写数据到DDRAM/CGRAM/GDRAM

功能:单片机写数据到LCD12864点阵型液晶显示器内部ST7920芯片的DDRAM/CGRAM/GDRAM,每个RAM地址都要连续写入两个字节的数据。

(15)、从DDRAM/CGRAM/GDRAM读取数据

功能:从LCD12864点阵型液晶显示器内部ST7920芯片的DDRAM/CGRAM/GDRAM,当设定地址指令后,若需读取数据时,需先执行一次空的读数据,才会读取到正确数据,第二次读取时则不需要,除非又下设定地址指令。

2、当功能设定寄存器的寄存器单元RE=1时,LCD12864点阵型液晶显示器内部ST7920芯片执行扩充指令集,扩充指令集列表如下。

说明:当LCD12864点阵型液晶显示器内部ST7920芯片在接受指令前,微处理器必须先确认LCD12864点阵型液晶显示器内部ST7920芯片是否处于非忙碌状态,即读取BF 标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成。“RE”为基本指令集与扩充指令集的选择控制位,当变更“RE”位后,往后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,不需每次重设“RE”位。

(1)、待机模式

功能:进入待机模式,执行其它命令都可终止待机模式。

(2)、设置卷动/IRAM地址功能:SR=1:允许输入卷动地址;SR=0:允许设定CGRAM地址(基本指令)或IRAM地址(扩充指令)。

(3)、反白选择功能:当R1,R0 初值分别为0时,选择LCD2864点阵型液晶显示器四行中的任一行作反白显示,并可决定反白与否。第一次设定为反白显示,再次设定时为正常显示。

(4)、睡眠模式功能:

功能:SL=1:脱离睡眠模式; SL=0:进入睡眠模式。

(5)、扩充功能设定功能:DL=1:8位控制接口;DL=0:4位控制接口,RE=1:扩充指令集动作;RE=0:基本指令集动作,G=1:绘图显示ON; G=0:绘图显示OFF。

(6)、卷动地址设定功能:SR=1: AC5~AC0 为垂直卷动地址,SR=0:AC3~AC0为 ICON RAM位址。

(7)、设定CGRAM地址功能:设定GDRAM地址到地址计数器(AC),先设垂直地址,再设水平地址,即连续写入两个字节的坐标地址,垂直地址范围AC6~AC0,水平地址范围AC3~AC0

九、不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示汉字

1、不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示汉字的单片机C语言程序

(1)、不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示汉字的整体化单片机C语言程序

#include

#include"ziku.h"

#include

#define uchar unsigned char

#define uint unsigned int

#define LCD12864Data P2//自定义P2端为变量LCD12864Data

sbit CS1=P1^0;//选屏端

sbit CS2=P1^1;//选屏端

sbit LCD12864_RS=P1^5;//数据指令端

sbit LCD12864_RW=P1^6;//读写端

sbit LCD12864_EN=P1^7;//使能端

//您

uchar code nin[]={0x20,0x10,0x08,0xFC,0x23,0x10,0x88,0x67,0x04,0xF4,0x04,0x24,0x54,0x8C,0x00,0x00,0x40,0x30,0x00,0x77,0x80,0x81,0x88,0xB2,0x84,0x83,0x80,0xE0,0x00,0x11,0x60,0x00,};

//好

uchar code hao[]={0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,};

//啊

uchar code a[]={0xFC,0x04,0xFC,0x00,0xFE,0x42,0xBE,0x00,0xF2,0x12,0xF2,0x02,0xFE,0x02,0x00,0x00,0x0F,0x04,0x0F,0x00,0xFF,0x10,0x0F,0x00,0x0F,0x04,0x4F,0x80,0x7F,0x00,0x00,0x00,};

//!

uchar code gantanhao[]={0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};

//欢

uchar code huan0[]={0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00,};

//迎

uchar code ying[]={0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00,};

//来

uchar code lai[]={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,};

//到

uchar code dao[]={0x42,0x62,0x52,0x4A,0xC6,0x42,0x52,0x62,0xC2,0x00,0xF8,0x00,0x00,0xFF,0x00,0x00,0x40,0xC4,0x44,0x44,0x7F,0x24,0x24,0x24,0x20,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,};

//这

uchar code zhe[]={0x40,0x40,0x42,0xCC,0x00,0x08,0x28,0x48,0x89,0x0E,0xC8,0x38,0x08,0x08,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x50,0x48,0x44,0x42,0x41,0x42,0x44,0x58,0x40,0x40,0x00,};

//里

uchar code li[]={0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x40,0x40,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x44,0x40,0x40,0x00,};

//的

uchar code de[]={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,};

//山

uchar code shan[]={0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,};

//路

uchar code lu[]={0x00,0x3E,0x22,0xE2,0x22,0x3E,0x00,0x10,0x88,0x57,0x24,0x54,0x8C,0x00,0x00,0x00,0x40,0x7E,0x40,0x3F,0x22,0x22,0x00,0x01,0xFE,0x42,0x42,0x42,0xFE,0x01,0x01,0x00,};

//十

uchar code shi[]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};

//八

uchar code ba[]={0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x7E,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x00,};

//弯

uchar code wan[]={0x04,0x44,0x24,0x14,0x04,0x7C,0x05,0x06,0x04,0x7C,0x04,0x14,0x24,0x44,0x04,0x00,0x00,0x00,0x1D,0x15,0x15,0x15,0x15,0x15,0x15,0x55,0x95,0x57,0x30,0x00,0x00,0x00,};

//水

uchar code shui[]={0x00,0x20,0x20,0x20,0xA0,0x60,0x00,0xFF,0x60,0x80,0x40,0x20,0x18,0x00,0x00,0x00,0x20,0x10,0x08,0x06,0x01,0x40,0x80,0x7F,0x00,0x01,0x02,0x04,0x08,0x10,0x10,0x00,};

//九

uchar code jiu[]={0x00,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x78,0x00,};

//连

uchar code lian[]={0x40,0x40,0x42,0xCC,0x00,0x04,0x44,0x64,0x5C,0x47,0xF4,0x44,0x44,0x44,0x04,0x00,0x00,0x40,0x20,0x1F,0x20,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x00,};

//环

uchar code huan1[]={0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0x04,0x04,0x84,0xE4,0x1C,0x84,0x04,0x04,0x00,0x20,0x60,0x20,0x1F,0x10,0x10,0x04,0x02,0x01,0x00,0xFF,0x00,0x00,0x01,0x06,0x00,};

//人

uchar code ren[]={0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x00,};

//更

uchar code geng[]={0x02,0x02,0xF2,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0x00,0x80,0x80,0x87,0x4C,0x54,0x24,0x34,0x4F,0x44,0x44,0x84,0x84,0x87,0x80,0x80,0x00,};

//美

uchar code mei[]={0x00,0x04,0x24,0x24,0x25,0x26,0x24,0xFC,0x24,0x26,0x25,0x24,0x24,0x04,0x00,0x00,0x81,0x89,0x89,0x49,0x49,0x29,0x19,0x0F,0x19,0x29,0x49,0x49,0x89,0x89,0x81,0x00,};

void ReadBuzy()//读忙函数

{

P2=0x00;

LCD12864_RS=0;

LCD12864_RW=1;

LCD12864_EN=1;

while(P2 & 0x80);

LCD12864_EN=0;

}

void LCD12864WriteCommand(uchar command)//写指令函数

{

ReadBuzy();//读忙

LCD12864_RS=0;

LCD12864_RW=0;

LCD12864Data=command;

LCD12864_EN=1;

_nop_();

_nop_();

LCD12864_EN=0;

}

void LCD12864WriteData(uchar value)//写数据函数

{

ReadBuzy();//读忙

LCD12864_RS=1;

LCD12864_RW=0;

LCD12864Data=value;

LCD12864_EN=1;

_nop_();

_nop_();

LCD12864_EN=0;

}

void SetPage(uchar page)//设置页函数

{

page=0xb8 | page;//0xb8是LCD12864点阵型液晶显示器显示位首页(即第0页)地址,共有8页。

LCD12864WriteCommand(page);//把页变量写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取。

}

void SetLine(uchar startline)//设置显示起始行函数

{

startline=0xc0 | startline;//0xc0是LCD12864点阵型液晶显示器显示位首小行(即第0小行)地址,共有64小行。

LCD12864WriteCommand(startline);//把小行变量写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取。

}

void SetColumn(uchar column)//设置列函数

{

column=column & 0x3f;//把LCD12864点阵型液晶显示器显示位列数最大设定为64列

column=0x40 | column;//0x40是LCD12864点阵型液晶显示器显示位首列(即第0列)地址,共有64列。

LCD12864WriteCommand(column);//把列变量写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取。

}

void SetOnOff(uchar onoff)//设置显示开关函数

{

onoff=0x3e | onoff;//0x3e是关显示,0x3f是开显示。

LCD12864WriteCommand(onoff);//把开关变量写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取。

}

void SelectScreen(uchar screen)//设置选屏函数

{

switch(screen)//选屏选择位

{

case 0://全屏

CS1=0;

CS2=0;

break;

case 1://左屏(或上屏)

CS1=0;

CS2=1;

break;

case 2://右屏(或下屏)

CS1=1;

CS2=0;

break;

default:

break;

}

}

void CleanScreen(uchar screen)//设置清屏函数

{

uchar i,j;

SelectScreen(screen);//选屏

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

{

SetPage(i);//设置页数

SetColumn(0);//设置列数

for(j=0;j<64;j++)//控制列数0-63,共64列。

{

LCD12864WriteData(0x00);//把0写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取复位,即LCD12864点阵型液晶显示器清屏。

}

}

}

void LCD12864Init()//LCD12864点阵型液晶显示器初始化函数

{

ReadBuzy();//读忙

SelectScreen(0);//选全屏

SetOnOff(0);//关显示

SelectScreen(0);//选全屏

SetOnOff(1);//开显示

SelectScreen(0);//选全屏

CleanScreen(0);//清屏

SetLine(0);//设置起始行

}

void Display(uchar screen ,uchar page,uchar column,uchar *p)//显示汉字函数

{

uchar i;

SelectScreen(screen);//选屏

SetPage(page);//设置上半页

SetColumn(column);//设置列数

for(i=0;i<16;i++)//控制16列的数据输出

{

LCD12864WriteData(p[i]);//把指针变量p所在内存地址(由内存器分配)写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取

}

SetPage(page+1);//设置下半页数

SetColumn(column);//设置列数

for(i=0;i<16;i++)//控制16列的数据输出

{

LCD12864WriteData(p[i+16]);//把指针变量p所在内存地址(由内存器分配)写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取

}

}

void main()//主函数

{

LCD12864Init();//LCD12864点阵型液晶显示器初始化函数

CleanScreen(0);//设置清屏函数

SetLine(0);//设置页函数

Display(1, 0, 0 * 16, nin);//左半屏,第0页,第0列,显示“您”。

Display(1, 0, 1 * 16, hao);//左半屏,第0页,第1列,显示“好”。

Display(1, 0, 2 * 16, a);//左半屏,第0页,第2列,显示“啊”。

Display(1, 0, 3 * 16, gantanhao);//左半屏,第0页,第3列,显示“!”。

Display(2, 0, 4 * 16, huan0);//右半屏,第0页,第4列,显示“环”。

Display(2, 0, 5 * 16, ying);//右半屏,第0页,第5列,显示“迎”。

Display(2, 0, 6 * 16, lai);//右半屏,第0页,第6列,显示“来”。

Display(2, 0, 7 * 16, dao);//右半屏,第0页,第7列,显示“到”。

Display(1, 2, 0 * 16, zhe);//左半屏,第2页,第0列,显示“这”。

Display(1, 2, 1 * 16, li);//左半屏,第2页,第1列,显示“里”。

Display(1, 2, 2 * 16, de);//左半屏,第2页,第2列,显示“的”。

Display(1, 2, 3 * 16, shan);//左半屏,第2页,第3列,显示“山”。

Display(2, 2, 4 * 16, lu);//右半屏,第2页,第4列,显示“路”。

Display(2, 2, 5 * 16, shi);//右半屏,第2页,第5列,显示“十”。

Display(2, 2, 6 * 16, ba);//右半屏,第2页,第6列,显示“八”。

Display(2, 2, 7 * 16, wan);//右半屏,第2页,第7列,显示“弯”。

Display(1, 4, 0 * 16, zhe);//左半屏,第4页,第0列,显示“这”。

Display(1, 4, 1 * 16, li);//左半屏,第4页,第1列,显示“里”。

Display(1, 4, 2 * 16, de);//左半屏,第4页,第2列,显示“的”。

Display(1, 4, 3 * 16, shui);//左半屏,第4页,第3列,显示“水”。

Display(2, 4, 4 * 16, lu);//右半屏,第4页,第4列,显示“路”。

Display(2, 4, 5 * 16, jiu);//右半屏,第4页,第5列,显示“九”。

Display(2, 4, 6 * 16, lian);//右半屏,第4页,第6列,显示“连”。

Display(2, 4, 7 * 16, huan1);//右半屏,第4页,第7列,显示“环”。

Display(1, 6, 0 * 16, shan);//左半屏,第6页,第0列,显示“山”。

Display(1, 6, 1 * 16, mei);//左半屏,第6页,第1列,显示“美”。

Display(1, 6, 2 * 16, shui);//左半屏,第6页,第2列,显示“水”。

Display(1, 6, 3 * 16, mei);//左半屏,第6页,第3列,显示“美”。

Display(2, 6, 4 * 16, ren);//右半屏,第6页,第4列,显示“人”。

Display(2, 6, 5 * 16, geng);//右半屏,第6页,第5列,显示“更”。

Display(2, 6, 6 * 16, mei);//右半屏,第6页,第6列,显示“美”。

Display(2, 6, 7 * 16, a);//右半屏,第6页,第7列,显示“啊”。

while(1);

}

(2)、 不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示汉字的模块化单片机C语言程序

<1>、不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示汉字的模块化单片机C语言程序.C

#include

#include"ziku.h"

//#include

//#define uchar unsigned char

//#define uint unsigned int

//#define LCD12864Data P2//自定义P2端为变量LCD12864Data

//sbit CS1=P1^0;//选屏端

//sbit CS2=P1^1;//选屏端

//sbit LCD12864_RS=P1^5;//数据指令端

//sbit LCD12864_RW=P1^6;//读写端

//sbit LCD12864_EN=P1^7;//使能端

////您

//uchar code nin[]={0x20,0x10,0x08,0xFC,0x23,0x10,0x88,0x67,0x04,0xF4,0x04,0x24,0x54,0x8C,0x00,0x00,0x40,0x30,0x00,0x77,0x80,0x81,0x88,0xB2,0x84,0x83,0x80,0xE0,0x00,0x11,0x60,0x00,};

////好

//uchar code hao[]={0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,};

////啊

//uchar code a[]={0xFC,0x04,0xFC,0x00,0xFE,0x42,0xBE,0x00,0xF2,0x12,0xF2,0x02,0xFE,0x02,0x00,0x00,0x0F,0x04,0x0F,0x00,0xFF,0x10,0x0F,0x00,0x0F,0x04,0x4F,0x80,0x7F,0x00,0x00,0x00,};

////!

//uchar code gantanhao[]={0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};

////欢

//uchar code huan0[]={0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00,};

////迎

//uchar code ying[]={0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00,};

////来

//uchar code lai[]={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,};

////到

//uchar code dao[]={0x42,0x62,0x52,0x4A,0xC6,0x42,0x52,0x62,0xC2,0x00,0xF8,0x00,0x00,0xFF,0x00,0x00,0x40,0xC4,0x44,0x44,0x7F,0x24,0x24,0x24,0x20,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,};

////这

//uchar code zhe[]={0x40,0x40,0x42,0xCC,0x00,0x08,0x28,0x48,0x89,0x0E,0xC8,0x38,0x08,0x08,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x50,0x48,0x44,0x42,0x41,0x42,0x44,0x58,0x40,0x40,0x00,};

////里

//uchar code li[]={0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x40,0x40,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x44,0x40,0x40,0x00,};

////的

//uchar code de[]={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,};

////山

//uchar code shan[]={0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,};

////路

//uchar code lu[]={0x00,0x3E,0x22,0xE2,0x22,0x3E,0x00,0x10,0x88,0x57,0x24,0x54,0x8C,0x00,0x00,0x00,0x40,0x7E,0x40,0x3F,0x22,0x22,0x00,0x01,0xFE,0x42,0x42,0x42,0xFE,0x01,0x01,0x00,};

////十

//uchar code shi[]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};

////八

//uchar code ba[]={0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x7E,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x00,};

////弯

//uchar code wan[]={0x04,0x44,0x24,0x14,0x04,0x7C,0x05,0x06,0x04,0x7C,0x04,0x14,0x24,0x44,0x04,0x00,0x00,0x00,0x1D,0x15,0x15,0x15,0x15,0x15,0x15,0x55,0x95,0x57,0x30,0x00,0x00,0x00,};

////水

//uchar code shui[]={0x00,0x20,0x20,0x20,0xA0,0x60,0x00,0xFF,0x60,0x80,0x40,0x20,0x18,0x00,0x00,0x00,0x20,0x10,0x08,0x06,0x01,0x40,0x80,0x7F,0x00,0x01,0x02,0x04,0x08,0x10,0x10,0x00,};

////九

//uchar code jiu[]={0x00,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x78,0x00,};

////连

//uchar code lian[]={0x40,0x40,0x42,0xCC,0x00,0x04,0x44,0x64,0x5C,0x47,0xF4,0x44,0x44,0x44,0x04,0x00,0x00,0x40,0x20,0x1F,0x20,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x00,};

////环

//uchar code huan1[]={0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0x04,0x04,0x84,0xE4,0x1C,0x84,0x04,0x04,0x00,0x20,0x60,0x20,0x1F,0x10,0x10,0x04,0x02,0x01,0x00,0xFF,0x00,0x00,0x01,0x06,0x00,};

////人

//uchar code ren[]={0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x00,};

////更

//uchar code geng[]={0x02,0x02,0xF2,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0x00,0x80,0x80,0x87,0x4C,0x54,0x24,0x34,0x4F,0x44,0x44,0x84,0x84,0x87,0x80,0x80,0x00,};

////美

//uchar code mei[]={0x00,0x04,0x24,0x24,0x25,0x26,0x24,0xFC,0x24,0x26,0x25,0x24,0x24,0x04,0x00,0x00,0x81,0x89,0x89,0x49,0x49,0x29,0x19,0x0F,0x19,0x29,0x49,0x49,0x89,0x89,0x81,0x00,};

void ReadBuzy()//读忙函数

{

P2=0x00;

LCD12864_RS=0;

LCD12864_RW=1;

LCD12864_EN=1;

while(P2 & 0x80);

LCD12864_EN=0;

}

void LCD12864WriteCommand(uchar command)//写指令函数

{

ReadBuzy();//读忙

LCD12864_RS=0;

LCD12864_RW=0;

LCD12864Data=command;

LCD12864_EN=1;

_nop_();

_nop_();

LCD12864_EN=0;

}

void LCD12864WriteData(uchar value)//写数据函数

{

ReadBuzy();//读忙

LCD12864_RS=1;

LCD12864_RW=0;

LCD12864Data=value;

LCD12864_EN=1;

_nop_();

_nop_();

LCD12864_EN=0;

}

void SetPage(uchar page)//设置页函数

{

page=0xb8 | page;//0xb8是LCD12864点阵型液晶显示器显示位首页(即第0页)地址,共有8页。

LCD12864WriteCommand(page);//把页变量写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取。

}

void SetLine(uchar startline)//设置显示起始行函数

{

startline=0xc0 | startline;//0xc0是LCD12864点阵型液晶显示器显示位首小行(即第0小行)地址,共有64小行。

LCD12864WriteCommand(startline);//把小行变量写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取。

}

void SetColumn(uchar column)//设置列函数

{

column=column & 0x3f;//把LCD12864点阵型液晶显示器显示位列数最大设定为64列

column=0x40 | column;//0x40是LCD12864点阵型液晶显示器显示位首列(即第0列)地址,共有64列。

LCD12864WriteCommand(column);//把列变量写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取。

}

void SetOnOff(uchar onoff)//设置显示开关函数

{

onoff=0x3e | onoff;//0x3e是关显示,0x3f是开显示。

LCD12864WriteCommand(onoff);//把开关变量写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取。

}

void SelectScreen(uchar screen)//设置选屏函数

{

switch(screen)//选屏选择位

{

case 0://全屏

CS1=0;

CS2=0;

break;

case 1://左屏(或上屏)

CS1=0;

CS2=1;

break;

case 2://右屏(或下屏)

CS1=1;

CS2=0;

break;

default:

break;

}

}

void CleanScreen(uchar screen)//设置清屏函数

{

uchar i,j;

SelectScreen(screen);//选屏

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

{

SetPage(i);//设置页数

SetColumn(0);//设置列数

for(j=0;j<64;j++)//控制列数0-63,共64列。

{

LCD12864WriteData(0x00);//把0写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取复位,即LCD12864点阵型液晶显示器清屏。

}

}

}

void LCD12864Init()//LCD12864点阵型液晶显示器初始化函数

{

ReadBuzy();//读忙

SelectScreen(0);//选全屏

SetOnOff(0);//关显示

SelectScreen(0);//选全屏

SetOnOff(1);//开显示

SelectScreen(0);//选全屏

CleanScreen(0);//清屏

SetLine(0);//设置起始行

}

void Display(uchar screen ,uchar page,uchar column,uchar *p)//显示汉字函数

{

uchar i;

SelectScreen(screen);//选屏

SetPage(page);//设置上半页

SetColumn(column);//设置列数

for(i=0;i<16;i++)//控制16列的数据输出

{

LCD12864WriteData(p[i]);//把指针变量p所在内存地址(由内存器分配)写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取

}

SetPage(page+1);//设置下半页数

SetColumn(column);//设置列数

for(i=0;i<16;i++)//控制16列的数据输出

{

LCD12864WriteData(p[i+16]);//把指针变量p所在内存地址(由内存器分配)写入LCD12864点阵型液晶显示器内部DDRAM(Data Display Ram:数据显示随机存储器),供LCD12864点阵型液晶显示器显示读取

}

}

void main()//主函数

{

LCD12864Init();//LCD12864点阵型液晶显示器初始化函数

CleanScreen(0);//设置清屏函数

SetLine(0);//设置页函数

Display(1, 0, 0 * 16, nin);//左半屏,第0页,第0列,显示“您”。

Display(1, 0, 1 * 16, hao);//左半屏,第0页,第1列,显示“好”。

Display(1, 0, 2 * 16, a);//左半屏,第0页,第2列,显示“啊”。

Display(1, 0, 3 * 16, gantanhao);//左半屏,第0页,第3列,显示“!”。

Display(2, 0, 4 * 16, huan0);//右半屏,第0页,第4列,显示“环”。

Display(2, 0, 5 * 16, ying);//右半屏,第0页,第5列,显示“迎”。

Display(2, 0, 6 * 16, lai);//右半屏,第0页,第6列,显示“来”。

Display(2, 0, 7 * 16, dao);//右半屏,第0页,第7列,显示“到”。

Display(1, 2, 0 * 16, zhe);//左半屏,第2页,第0列,显示“这”。

Display(1, 2, 1 * 16, li);//左半屏,第2页,第1列,显示“里”。

Display(1, 2, 2 * 16, de);//左半屏,第2页,第2列,显示“的”。

Display(1, 2, 3 * 16, shan);//左半屏,第2页,第3列,显示“山”。

Display(2, 2, 4 * 16, lu);//右半屏,第2页,第4列,显示“路”。

Display(2, 2, 5 * 16, shi);//右半屏,第2页,第5列,显示“十”。

Display(2, 2, 6 * 16, ba);//右半屏,第2页,第6列,显示“八”。

Display(2, 2, 7 * 16, wan);//右半屏,第2页,第7列,显示“弯”。

Display(1, 4, 0 * 16, zhe);//左半屏,第4页,第0列,显示“这”。

Display(1, 4, 1 * 16, li);//左半屏,第4页,第1列,显示“里”。

Display(1, 4, 2 * 16, de);//左半屏,第4页,第2列,显示“的”。

Display(1, 4, 3 * 16, shui);//左半屏,第4页,第3列,显示“水”。

Display(2, 4, 4 * 16, lu);//右半屏,第4页,第4列,显示“路”。

Display(2, 4, 5 * 16, jiu);//右半屏,第4页,第5列,显示“九”。

Display(2, 4, 6 * 16, lian);//右半屏,第4页,第6列,显示“连”。

Display(2, 4, 7 * 16, huan1);//右半屏,第4页,第7列,显示“环”。

Display(1, 6, 0 * 16, shan);//左半屏,第6页,第0列,显示“山”。

Display(1, 6, 1 * 16, mei);//左半屏,第6页,第1列,显示“美”。

Display(1, 6, 2 * 16, shui);//左半屏,第6页,第2列,显示“水”。

Display(1, 6, 3 * 16, mei);//左半屏,第6页,第3列,显示“美”。

Display(2, 6, 4 * 16, ren);//右半屏,第6页,第4列,显示“人”。

Display(2, 6, 5 * 16, geng);//右半屏,第6页,第5列,显示“更”。

Display(2, 6, 6 * 16, mei);//右半屏,第6页,第6列,显示“美”。

Display(2, 6, 7 * 16, a);//右半屏,第6页,第7列,显示“啊”。

while(1);

}

<2>、不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示汉字的模块化单片机C语言程序的ziku.h

#ifndef __ZIKU_H__

#define __ZIKU_H__

#include

#include

#define LCD12864Data P2//自定义P2端为变量LCD12864Data

#define uchar unsigned char

#define uint unsigned int

sbit CS1=P1^0;//选屏端

sbit CS2=P1^1;//选屏端

sbit LCD12864_RS=P1^5;//数据指令端

sbit LCD12864_RW=P1^6;//读写端

sbit LCD12864_EN=P1^7;//使能端

void ReadBuzy();//读忙函数

void LCD12864WriteCommand(uchar command);//写指令函数

void LCD12864WriteData(uchar value);//写数据函数

void SetPage(uchar page);//设置页函数

void SetLine(uchar startline);//设置显示起始行函数

void SetColumn(uchar column);//设置列函数

void SetOnOff(uchar onoff);//设置显示开关函数

void SelectScreen(uchar screen);//设置选屏函数

void CleanScreen(uchar screen);//设置清屏函数

void LCD12864Init();//LCD12864点阵型液晶显示器初始化函数

void Display(uchar screen ,uchar page,uchar column,uchar *p);//显示汉字函数

//您

uchar code nin[]={0x20,0x10,0x08,0xFC,0x23,0x10,0x88,0x67,0x04,0xF4,0x04,0x24,0x54,0x8C,0x00,0x00,0x40,0x30,0x00,0x77,0x80,0x81,0x88,0xB2,0x84,0x83,0x80,0xE0,0x00,0x11,0x60,0x00,};

//好

uchar code hao[]={0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,};

//啊

uchar code a[]={0xFC,0x04,0xFC,0x00,0xFE,0x42,0xBE,0x00,0xF2,0x12,0xF2,0x02,0xFE,0x02,0x00,0x00,0x0F,0x04,0x0F,0x00,0xFF,0x10,0x0F,0x00,0x0F,0x04,0x4F,0x80,0x7F,0x00,0x00,0x00,};

//!

uchar code gantanhao[]={0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};

//欢

uchar code huan0[]={0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00,};

//迎

uchar code ying[]={0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00,};

//来

uchar code lai[]={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,};

//到

uchar code dao[]={0x42,0x62,0x52,0x4A,0xC6,0x42,0x52,0x62,0xC2,0x00,0xF8,0x00,0x00,0xFF,0x00,0x00,0x40,0xC4,0x44,0x44,0x7F,0x24,0x24,0x24,0x20,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,};

//这

uchar code zhe[]={0x40,0x40,0x42,0xCC,0x00,0x08,0x28,0x48,0x89,0x0E,0xC8,0x38,0x08,0x08,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x50,0x48,0x44,0x42,0x41,0x42,0x44,0x58,0x40,0x40,0x00,};

//里

uchar code li[]={0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x40,0x40,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x44,0x40,0x40,0x00,};

//的

uchar code de[]={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,};

//山

uchar code shan[]={0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,};

//路

uchar code lu[]={0x00,0x3E,0x22,0xE2,0x22,0x3E,0x00,0x10,0x88,0x57,0x24,0x54,0x8C,0x00,0x00,0x00,0x40,0x7E,0x40,0x3F,0x22,0x22,0x00,0x01,0xFE,0x42,0x42,0x42,0xFE,0x01,0x01,0x00,};

//十

uchar code shi[]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};

//八

uchar code ba[]={0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x7E,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x00,};

//弯

uchar code wan[]={0x04,0x44,0x24,0x14,0x04,0x7C,0x05,0x06,0x04,0x7C,0x04,0x14,0x24,0x44,0x04,0x00,0x00,0x00,0x1D,0x15,0x15,0x15,0x15,0x15,0x15,0x55,0x95,0x57,0x30,0x00,0x00,0x00,};

//水

uchar code shui[]={0x00,0x20,0x20,0x20,0xA0,0x60,0x00,0xFF,0x60,0x80,0x40,0x20,0x18,0x00,0x00,0x00,0x20,0x10,0x08,0x06,0x01,0x40,0x80,0x7F,0x00,0x01,0x02,0x04,0x08,0x10,0x10,0x00,};

//九

uchar code jiu[]={0x00,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x78,0x00,};

//连

uchar code lian[]={0x40,0x40,0x42,0xCC,0x00,0x04,0x44,0x64,0x5C,0x47,0xF4,0x44,0x44,0x44,0x04,0x00,0x00,0x40,0x20,0x1F,0x20,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x00,};

//环

uchar code huan1[]={0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0x04,0x04,0x84,0xE4,0x1C,0x84,0x04,0x04,0x00,0x20,0x60,0x20,0x1F,0x10,0x10,0x04,0x02,0x01,0x00,0xFF,0x00,0x00,0x01,0x06,0x00,};

//人

uchar code ren[]={0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x00,};

//更

uchar code geng[]={0x02,0x02,0xF2,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0x00,0x80,0x80,0x87,0x4C,0x54,0x24,0x34,0x4F,0x44,0x44,0x84,0x84,0x87,0x80,0x80,0x00,};

//美

uchar code mei[]={0x00,0x04,0x24,0x24,0x25,0x26,0x24,0xFC,0x24,0x26,0x25,0x24,0x24,0x04,0x00,0x00,0x81,0x89,0x89,0x49,0x49,0x29,0x19,0x0F,0x19,0x29,0x49,0x49,0x89,0x89,0x81,0x00,};

#endif

2、不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示汉字的Proteus仿真电路图

十、不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示图片

1、不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示图片的单片机C语言程序

(1)、不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示图片的整体化单片机C语言程序

(2)、 不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示图片的模块化单片机C语言程序

<1>、不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示图片的模块化单片机C语言程序.C

<2>、不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示图片的模块化单片机C语言程序的ziku.h

2、不带字库的以控制芯片KS0108为主的AMPIRE12864点阵型液晶显示器显示图片的Proteus仿真电路图

十一、带字库的以控制芯片ST7920为主的LCD12864点阵型液晶显示器显示自定义字符

1、带字库的以控制芯片ST7920为主的LCD12864点阵型液晶显示器显示自定义字符的单片机C语言程序

#include

#define uchar unsigned char

#define uint unsigned int

#define LCD12864Data P2//LCD12864点阵型液晶显示器输入输出数据/命令端口

sbit LCD12864_RS=P0^7;//LCD12864点阵型液晶显示器数据/命令选择端

sbit LCD12864_RW=P0^6;//LCD12864点阵型液晶显示器读/写端

sbit LCD12864_EN=P0^5;//LCD12864点阵型液晶显示器使能端

//太阳

uchar code sun[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x08,0x10,0x00,0x00,0x10,0x08,0x00,0x00,0x10,0x08,0x00,0x00,0x08,0x10,0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x00};

//月亮

uchar code moon[]={0x00,0x00,0x00,0x00,0x03,0x80,0x02,0x40,0x02,0x20,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x20,0x02,0x40,0x03,0x80,0x00,0x00,0x00,0x00};

//星星

uchar code star[]={0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x80,0x00,0x00,0x54,0x54,0x20,0x08,0x08,0x20,0x02,0x80,0x12,0x90,0x08,0x20,0x20,0x08,0x00,0x00,0x00,0x00};

//人

uchar code robot[]={0x07,0xE0,0x08,0x10,0x12,0x48,0x10,0x08,0x1F,0xF8,0x10,0x08,0x30,0x0C,0x50,0x0A,0x50,0x0A,0x50,0x0A,0x50,0x0A,0x5F,0xFA,0x04,0x20,0x04,0x20,0x04,0x20,0x0E,0x70};

void Delay(uint i)

{

while(--i);

}

void ReadBuzy()//读忙函数

{

P2=0x00;

LCD12864_RS=0;

LCD12864_RW=1;

LCD12864_EN=1;

while(P2 & 0x80);

LCD12864_EN=0;

}

void LCD12864WriteCommand(uchar command)//写指令函数

{

ReadBuzy();//读忙

LCD12864_RS=0;

LCD12864_RW=0;

LCD12864_EN=1;

LCD12864Data=command;

Delay(100);

LCD12864_EN=0;

}

void LCD12864WriteData(uchar value)//写数据函数

{

ReadBuzy();//读忙

LCD12864_RS=1;

LCD12864_RW=0;

LCD12864_EN=1;

LCD12864Data=value;

Delay(100);

LCD12864_EN=0;

}

void LCD12864Init()//LCD12864点阵型液晶显示器初始化函数

{

ReadBuzy();//读忙

Delay(4000);

LCD12864WriteCommand(0x30);//8位数据端口传输,且设置为基本指令集动作。

Delay(100);

LCD12864WriteCommand(0x30);//8位数据端口传输,且设置为基本指令集动作。

Delay(37);

LCD12864WriteCommand(0x0c);//设置整体显示,光标、闪烁全关,不反白。

Delay(100);

LCD12864WriteCommand(0x01);//清屏,并且DDRAM数据指针清零。

Delay(10000);

LCD12864WriteCommand(0x06);//进入点设定模式,设置地址指针自动加1。

}

void CGRAM()//写自定义字符函数

{

uchar i;

LCD12864WriteCommand(0x30);//设置LCD12864点阵型液晶显示器数据端口D0-D7为8位控制接口,且这8位控制接口接收基本指令操作。

LCD12864WriteCommand(0x40);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第1个内存地址

for(i=0;i<16;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(sun[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteData(sun[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。

}

LCD12864WriteCommand(0x50);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第2个内存地址

for(i=0;i<16;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(moon[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteData(moon[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。

}

LCD12864WriteCommand(0x60);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第3个内存地址

for(i=0;i<16;i++)//一个完整自定义字符占用LCD12864点阵型液晶显示器16(行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(star[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteData(star[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。

}

LCD12864WriteCommand(0x70);//写自定义字符到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM第4个内存地址

for(i=0;i<16;i++)//一个完整自定义字符占用LCD12864点阵型液晶显器16(示行)x16(列)显示界面,每一行占用2个字节(即16列)才显示该行某点字符,因单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,且一个完整自定义字符占用32个字节,那么要写完一个完整自定义字符占用的32个字节,必须分16次来写,这就是循环16次的原由。

{

LCD12864WriteData(robot[i*2]);//把第一个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteData(robot[i*2+1]);//把第二个字节的自定义字符写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,供LCD12864点阵型液晶显示器读取显示。为什么乘以2?由于单片机写数据是以写2个字节为一次写到LCD12864点阵型液晶显示器内部ST7920芯片的CGRAM内存地址上,所以要乘以2。

}

}

void main()//主函数

{

LCD12864Init();//LCD12864点阵型液晶显示器初始化函数

CGRAM();//写自定义字符函数

LCD12864WriteCommand(0x98);//LCD12864点阵型液晶显示器下半屏第二行第1个显示位置

LCD12864WriteData(0x00);//清空DRAM内存地址上的内容

LCD12864WriteData(0x00);//把自定义字符写进DDRAM内存地址0x00,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteCommand(0x99);//LCD12864点阵型液晶显示器下半屏第二行第2个显示位置

LCD12864WriteData(0x00);//清空DRAM内存地址上的内容

LCD12864WriteData(0x02);//把自定义字符写进DDRAM内存地址0x02,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteCommand(0x9A);//LCD12864点阵型液晶显示器下半屏第二行第3个显示位置

LCD12864WriteData(0x00);//清空DRAM内存地址上的内容

LCD12864WriteData(0x04);//把自定义字符写进DDRAM内存地址0x04,供LCD12864点阵型液晶显示器读取显示。

LCD12864WriteCommand(0x9B);//LCD12864点阵型液晶显示器下半屏第二行第4个显示位置

LCD12864WriteData(0x00);//清空DRAM内存地址上的内容

LCD12864WriteData(0x06);//把自定义字符写进DDRAM内存地址0x06,供LCD12864点阵型液晶显示器读取显示。

while(1);//固定循环

}

2、带字库的以控制芯片ST7920为主的LCD12864点阵型液晶显示器显示自定义字符的Proteus仿真电路图

十二、带字库的以控制芯片ST7920为主的LCD12864点阵型液晶显示器显示图形

1、带字库的以控制芯片ST7920为主的LCD12864点阵型液晶显示器显示自定义图形的单片机C语言程序

2、带字库的以控制芯片ST7920为主的LCD12864点阵型液晶显示器显示自定义图形的Proteus仿真电路图

🎊 相关推荐

EasyClick脚本开发教程(5)遍历组件并随机点击
bt365娱乐官网

EasyClick脚本开发教程(5)遍历组件并随机点击

📅 07-25 👀 2857
空调宝典│家用空调遥控方法大全,终于知道怎么使用空调了!
耳环的来历及原始作用是什么
bt365娱乐官网

耳环的来历及原始作用是什么

📅 09-15 👀 2311