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、CGRAMCharacter 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、GDRAMGraphic 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 <reg51.h>
#include"ziku.h"
#include <intrins.h> 
#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 <reg51.h>
#include"ziku.h"
//#include <intrins.h> 
//#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<reg51.h>
#include<intrins.h>
#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 <reg52.h>
#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仿真电路图

 

posted @ 2020-07-31 21:13  吃不了就兜着走  阅读(12142)  评论(1编辑  收藏  举报