目录
- 1.LCD12864介绍
-
- [1.1 带字库LCD12864](#1.1 带字库LCD12864)
- [1.2 LCD12864管脚介绍](#1.2 LCD12864管脚介绍)
- [1.3 功能设定](#1.3 功能设定)
- [1.4 清屏指令](#1.4 清屏指令)
- [1.5 进入设定点](#1.5 进入设定点)
- [1.6 显示状态开关设置](#1.6 显示状态开关设置)
- [1.7 显示区间](#1.7 显示区间)
- [1.8 不带字库LCD12864](#1.8 不带字库LCD12864)
- 2.硬件设计
- 3.软件设计
- 4.实验现象
1.LCD12864介绍
LCD12864跟LCD1602是一样的,只是在行,列数,和显示像素上区别不同,12864可以显示128个像素,行有128个像素,总共有64行,所以根据像素点可以知道它是128 * 64个像素,所以也叫12864显示屏。

这种显示屏跟1602也是有区别的,比如,LCD12864它是以像素点的,128 * 64个像素点,而1602它是字符型一个液晶屏,它显示是由5 * 7或者5 * 10为一个字符,在字符与字符之间有一个间隔,而且行与行之间也有一个间隔,所以对于1602来说,它不能完整显示一幅图,因为它的每一个字符与每一个字符都有一个间隙,而12864是完整的像素点,也就是说在显示屏上面,一行有128个像素点,总共有64行,它是构成完整的像素点,那么可以根据要显示的东西进行点亮或者熄灭,这就可以显示完整的图像了,通常显示一个汉字需要16 * 16个像素点,因此根据12864是128*64个像素点的话,所以一行可以显示128 / 16 = 8个汉字,可以显示64 / 16 = 4行,一个汉字是2个字节,一个字符是一个字节,所以一个汉字相当于2个字符,从上面左边图也可以看出第一行是2012-10-06,这里两个字符相当于可以显示一个汉字,20一个汉字,12一个汉字,-1一个汉字,0- 一个汉字,06一个汉字,字符这里相当于可以显示5个汉字加上后面星期六,三个汉字,一共8个汉字,一共显示了4行。
除了可以显示汉字外,还可以显示图形,右边图这种,可以从上图看出左边汉字字体和右边汉字字体不一样,右边显示的字体更大,不是左边那种字体中规中矩的,那么右边的字体如何操作的呢?这是因为12864左边图显示的汉字是以固定的模式来显示,12864它是带字库的,根据字库提取的数据,显示的就是左边图这种汉字,而右边图的字体汉字是通过我们自己用户去取模得到的一个汉字数据,来发送到对应的坐标点上来显示,而用户自己去取模的话可以根据需求,我显示什么样的字体,或者多大的都可以,通过取模软件都可以实现,通过对应的一个坐标点显示就行了。
如果说是自己取模的话,显示的字数或者是行数,不一定是四行和一行八个字了,比如右边这个图,里面的字体明显比较大的,可以看出一行最多显示5个汉字这么大的,所以说并不是显示的一行汉字数量并不是严格意义上的八个,严格意义的一行显示8个汉字是使用了我们LCD12864内部字库里面的数据,我只能显示八个汉字,或者16个字符, 字符就是数字或者符号或者字母等等,而我们取模的可以根据取模的字体大小,来决定我是显示多少个,如果说我取模的是比较小号的字体,那么我们可能一行显示16个汉字,或者一行显示10个等等。
1.1 带字库LCD12864

可以看出左边图,这里显示的汉字,是12864内部芯片自动取好的汉字的模,那么我吧显示的数据存进去就行了,
对于12864显示汉字,我们自己要显示什么汉字就写什么汉字,芯片内部会自动转换,12864已经完成了这个处理。

可以看下12864的背面,这个是带字库的12864的背面实物图,可以看出中间三个黑色的圆是控制器,字库芯片都在这里面,它完成了汉字的解码。我们要显示什么汉字就输入对应的汉字就可以了,这种带字库的汉字呢体积会比较大,屏幕比较大,可以看到带字库12864最下面是它的管脚可以看到,总共有20个管脚,它的管脚命名可以看下。
1.2 LCD12864管脚介绍

1号管脚:VSS,电源负极
2号管脚:VDD,电源正极(5V)
3号管脚:VO,对比度,偏压信号
这个跟前面介绍1602是一样的,通过电位器可以调节, 在我们12864背面有一个这种电位器,但是我们不要自己去调节,要是自己调节不好,会显示的很暗很暗,字可能就看不清楚了,对方厂家已经设置好了,就不需要动它,这个电位器就是调节VO对比度的。
4号引脚:RS
这个是用来对数据和命令的选择,跟1602是一样的,如果是高电平,设置1,它是对数据的进行选择,如果设置低电平,设置0,它是对命令进行选择。
5号引脚:R/W
这个引脚跟1602是一样的,如果是高电平是用来选择读,如果是低电平用来选择写,通常对12864都是写的功能。
6号引脚:E
使能信号,跟1602是一样的。
7号-14号引脚:DB0 - DB7
八位并行口,通过一组单片机端口就可以实现控制。
15号引脚,16号引脚:片选信号
低电平有效,通常这个地方给它接入GND,或者单片机引脚输出低电平,它是对左右半屏的像素点的使能。
17号引脚:RST,复位引脚,低电平有效。
通常情况下这个引脚接入5V就可以了,始终处于工作的状态。
18号引脚:负压输入输出端
电压信号
19号引脚:背光正极
20号引脚:背光负极
1.3 功能设定

第一位和第二位:设置0 0
这里是RS和RW都设置的0 0,RS设置0就是设置命令,RW设置0写的操作
最后两位任意值以及中间也有一位任意值:x
通常设置 0
DL:设置数据总线位数
如果设置1是8位,如果设置0是4位,通常情况我们DL使用的是8位,所以设置1
RE:设置指令集选择控制位
设置1就是扩充指令集,设置0就是基本指令集,但我们使用的是基本的指令集,所以设置0
这样一来设置的指令是0011 0000对应16进制编码是0X30
1.4 清屏指令
这个清屏指令跟1602完全一样,对应的16进制是0X01,清除DDRAM的数据,并且吧光标定位到第一行,第一个位置。
1.5 进入设定点

这个用来设置,光标,屏幕移动方向等等,前面6位是固定的0000 01,可变的是I/D和S。
D:设置光标移动。
如果I/D设置1,光标向右移动,如果I/D设置0,光标左移。通常情况设置1
S:设置画面屏幕移动
如果设置高电平,画面整体左移动,如果设置低电平,画面整体右移动,我们通常设置0,不移动,也就是画面右移动。
所以这8位设置 0000 0110,对应的16进制是0X06
1.6 显示状态开关设置

前面5位固定,0000 1
D:设置12864显示开关
如果设置0,显示关闭,设置1,显示开,我们通常设置打开,所以设置1
C:设置光标开关
如果设置0,关闭光标,设置1,开启光标,我们不想要光标,所以设置0
B:光标闪烁
如果设置0,关闭光标闪烁,设置1,开启光标闪烁,由于我们设置关闭光标,所以这个光标闪烁设置就没有意义,那么就设置0
最终的8位设置是 0000 1100 对应的16进制是0X0C
1.7 显示区间

一行8个,行有8个,一共64个字节,这里分了,一区,二区,三区,四区,其中一区和而去是可以显示的,对应的12864里面是可以显示的,12864一行可以显示8个汉字,可以显示4行,其中一个汉字可以包括两个字节,也就是说在80H要显示字符的时候可以显示2个字符,同样81H也可以显示2个字符,但是要显示汉字的话,80H和81H只能显示各是1个汉字。
对应地址值
第一行首地址是80,第一行是80 - 87
第二行首地址是90,第二行是90 - 97
第三行首地址是88,第三行是88 - 8F
第四行首地址是98,第四行是98 - 9F
这个是12864实际能显示区域的地址位置。
1.8 不带字库LCD12864

这张图就是不带字库的12864的显示屏,不带字库的12864体积通常比较小,不带字库的12864背面没有相应的控制器,汉字芯片等等,它通常是一块转接板,将12864显示屏转接到开发板上面,相当于吧12864控制管脚转接到下面来,屏幕呢,本身有一块排线,焊接到PCB板子上,转出来它的控制管脚,连接到开发板上面进行显示。
这种显示屏的操作就跟带字库的12864显示屏一样,所有的显示都需要取模,取模方法跟点阵取模是一样的,不带字库的12864从外形上看呢它的体积比带字库的体积要小很多,因此我们称之为mili LCD12864,对于mili 12864要想显示汉字或者字符,都需要取模软件来实现的,因为这个mili 12864是不带字库,要显示汉字,字符,都需要取模,取模将这些数据通过单片机发送到12864对应的坐标点上,因为它是128*64个像素点,吧对应的像素点点亮,那么对应的组成就显示了对应的汉字,或者是字符,这种显示方式要比我们带字库的显示方式要复杂一些,如果说要吧带字库的12864要显示其他一些图像其他一些汉字或者字体大小的汉字,也是需要取模的,这种使用方式也是跟不带字库的12864使用方式是一样的,它完全是通过取模软件去取模,将取模得到的数据通过我们单片机写入到对应的坐标来显示我们取模到的数据,汉字或者图形。
那这种不带字库的12864内部是含有控制器的,通过控制器来控制12864对应的一些指令,比如说用到的ST7565p,ST7793等等,通过对控制器寄存器的操作来对12864mili来进行显示,这种显示屏通常需要初始化,初始化也就是对一些寄存器一些设置,才能对12864操作,这种操作通常比带字库的12864要复杂一些。
2.硬件设计

1,2:GND和VCC
3:调节对比度,12864背面去调节,通常我们不管
4:RS引脚 连接在P2.6
5:WR引脚 连接P2.5
6: EN引脚 连接P2.7
7 - 14:连接到8位P0口
15,16:控制片选信号 P3.2和P3.3
用来控制左右半屏的点阵使能信号,这两个管脚控制左右半屏控制
17:复位引脚,低电平有效,连接了VCC
18:偏压输出
19,20:背光电源正极和负极
3.软件设计
实现功能:带字库的LCD12864显示汉字、字符信息。
main.c
main.c
c
#include "public.h"
#include "lcd12864.h"
void main()
{
lcd12864_init();
lcd12864_show_string(0,0,"Hello world!");
lcd12864_show_string(0,1,"哈喽哈喽!");
lcd12864_show_string(0,2,"欢迎使用51开发板");
lcd12864_show_string(0,3,"好好学习天天向上");
while(1)
{
}
}
public.c
c
#include "public.h"
void delay_10us(u16 us) {
while(us--);
}
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
public.h
c
#ifndef _public_H
#define _public_H
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
void delay_10us(u16 us);
void delay_ms(u16 ms);
#endif
lcd12864.c
c
#include "lcd12864.h"
//写命令
void lcd12864_write_cmd(u8 cmd)
{
LCD12864_RS = 0; //低电平写命令
LCD12864_WR = 0;
LCD12864_EN = 0;
LCD12864_DATAPORT = cmd;
delay_ms(1);
LCD12864_EN = 1;
delay_ms(1);
LCD12864_EN = 0;
}
//写数据
void lcd12864_write_data(u8 dat)
{
LCD12864_RS = 1; //高电平写数据
LCD12864_WR = 0;
LCD12864_EN = 0;
LCD12864_DATAPORT = dat;
delay_ms(1);
LCD12864_EN = 1;
delay_ms(1);
LCD12864_EN = 0;
}
//初始化12864
void lcd12864_init(void)
{
lcd12864_write_cmd(0X30); //设置12864 8位数据 2行 基本指令集
lcd12864_write_cmd(0x0c); //设置12864 开启显示功能 是否使用光标 光标是否闪烁
//这里设置的不使用光标 如果设置不使用光标 光标闪烁设置0和1无所谓,这里设置0
lcd12864_write_cmd(0X06); //设置光标移动方向和显示屏移动
//这里每当写入一个数据后,光标后移动一位,以及屏幕整体不动进行设置
lcd12864_write_cmd(0X01); //清屏指令设置
}
//清屏
void lcd12864_clear(void)
{
lcd12864_write_cmd(0x01);
}
//在指定的坐标显示字符串
void lcd12864_show_string(u8 x, u8 y, u8* str)
{
u8 i = 0;
if (y <= 0) y = 0;
if (y > 3) y = 3;
x &= 0x0f; //如果x超过16,初始化x = 16,x>0 && x<16那么x的值是本身
switch(y)
{
//起始地址 + x偏移量
case 0: x |= 0x80; break; //第一行起始地址
case 1: x |= 0x90; break; //第二行起始地址
case 2: x |= 0x88; break; //第三行起始地址
case 3: x |= 0x98; break; //第四行起始地址
}
lcd12864_write_cmd(x);
while((*str) != '\0')
{
lcd12864_write_data(*str);
str++;
}
}
lcd12864.h
c
#ifndef _lcd12864_H
#define _lcd12864_H
#include "public.h"
sbit LCD12864_WR = P2^5;
sbit LCD12864_RS = P2^6;
sbit LCD12864_EN = P2^7;
#define LCD12864_DATAPORT P0
//写命令
void lcd12864_write_cmd(u8 cmd);
//写数据
void lcd12864_write_data(u8 dat);
//初始化12864
void lcd12864_init(void);
//清屏
void lcd12864_clear(void);
//在指定的坐标显示字符串
void lcd12864_show_string(u8 x, u8 y, u8* str);
#endif
4.实验现象
