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点阵型液晶显示器显示位置对应关系
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点阵型液晶显示器传送数据的模式
![](https://img2020.cnblogs.com/blog/1680900/202008/1680900-20200804143838977-289522326.png)
![](https://img2020.cnblogs.com/blog/1680900/202008/1680900-20200804162438270-1311135744.png)
<3>、单片机驱动LCD12864点阵型液晶显示器内部ST7920芯片以串行总线模式给LCD12864点阵型液晶显示器传送数据的时序图
(6)、字符编码在DDRAM中存储的事项说明
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码、日文字符、希腊文字符的编码,所有的数据读写都是先送地址,然后进行读写。
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字节。
//太阳 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:图形显示随机存储器)内部数据读写
![](https://img2020.cnblogs.com/blog/1680900/202008/1680900-20200815195923466-301690442.png)
<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字符列表
八、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地址
![](https://img2020.cnblogs.com/blog/1680900/202008/1680900-20200805114207837-80902433.png)
功能:设定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仿真电路图