LCD12864

介绍

LCD12864 液晶屏结构上与 LCD1602 一样,只是在 行列数与显示像素上区别很大。LCD12864,以下简称 12864,注意区分 LCD1602 和 LCD12864。12864 是 64行 128 列,当然也有可能会设计成 64 列 128 行,这里的行列不像 1602 那样,1602 是按照8行4列 标准英文字符格式,以1行16个字符,2列字符命名,而 12864 是以 128 列像素,64 行像素,也就是有 128*64 个像素点组成。就好比是 128 列 64 行的点阵。需要一行一列的去显示像素点。

​ 通常显示一个汉字需要 16X16 个像素点,所以 LCD12864 一行最多能显示 8 个汉字,最多能显示 4 行。通常显示一个字符需要 8X8 个像素点,所以LCD12864 一行最多能显示 16 个字符,最多能显示 8 行。当然这是不依靠后期取模的显示情况,如果通过取模软件取模,然后将 LCD12864 按照 12864 个像素点来显示,显示的内容就可能超过之前的,就拿字符来说,可以选择小号字体,通过取模软件将字符数据取出,然后将这些数据通过在对应的像素点上点亮或熄灭实现不同字体的显示。图像的显示原理也是这样。
​ 常用的 12864 分为带字库和不带字库两种:

带字库 LCD12864

​ 上图左侧为带字库 12864 显示字符和汉字,右侧为图形模式显示。注意:这里图形模式虽然显示了字符和汉字,但是并不是使用字库里的,显示的方法也是多样化的。
​ 对于带字库 LCD12864,最常见的标志就是在屏幕背后,会有存放字库的芯片。如下图所示:

LCD12864 带字库屏共有 20 个引脚,管脚功能如下:

  • 功能设定

  • 清屏指令

  • 进入设定点

  • 显示状态开关设置

从上图可知,LCD12864 能直接显示的地址范围如下:

第一行:0X80-0X87;(一个汉字占用 2 个字节,共 8 个汉字)

第二行:0X90-0X97;

第三行:0X88-0X8F;

第四行:0X98-0X9F;

LCD12864 与 LCD1602 有太多的相似之处,包括通信时序,简直是一模一样,所以编写 LCD12864 的驱动程序时,可完全照搬 LCD1602 的

不带字库 LCD12864

这种不带字库的 LCD12864 背面没有芯片,一般为转接板,将 12864 显示屏转接到开发板。这种显示屏的操作就像带字库的 12864 操作图片形式一样。 所有的显示都需要取模,取模方法和点阵取模一样。不带字库的 LCD12864,从外形上看其体积比带字库 LCD12864 要小很多,因此也常称之为 MiniLCD12864

软件编程

lcd12864.h

# ifndef _lcd12864_H
# define _lcd12864_H

# include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;

sbit LCD12864_RS=P2^6;//数据命令选择
sbit LCD12864_RW=P2^5;//读写选择
sbit LCD12864_E=P2^7;//使能信号
sbit LCD12864_PSB=P3^2;//8位或4并口/串口选择
# define LCD12864_DATAPORT P0//LCD12864数据端口定义

void delay_ms(u16 ms);
void lcd12864_init(void);
void lcd12864_clear(void);
void lcd12864_show_string(u8 x,u8 y,u8 *str);

# endif

lcd12864.c

# include "lcd12864.c"


void delay_ms(u16 ms)
{
	u16 i,j;
	for(i=ms;i>0;i--)
	{
		for(j=110;j>0;j--);
	}
}
/********************************************************************
***********
* 函 数 名 : lcd12864
_write
_cmd
* 函数功能 : LCD12864 写命令
* 输 入 : cmd:指令
* 输 出 : 无
*********************************************************************
**********/
void lcd12864_write_cmd(u8 cmd)
{
		LCD12864_RS=0;//选择命令
		LCD12864_WR=0;//选择写
		LCD12864_E=0;
		LCD12864_DATAPORT=cmd;//准备命令
		delay_ms(1);
		LCD12864_E=1;//使能脚 E 先上升沿写入
		delay_ms(1);
		LCD12864_E=0;//使能脚 E 后负跳变完成写入
}
/********************************************************************
***********
* 函 数 名 : lcd12864
_write
_data
* 函数功能 : LCD12864 写数据
* 输 入 : dat:数据
* 输 出 : 无
********************************************************************
**********/
void lcd12864_write_data(u8 dat)
{
		LCD12864_RS=1;//选择数据
		LCD12864_WR=0;//选择写
		LCD12864_E=0;
		LCD12864_DATAPORT=dat;//准备数据
		delay_ms(1);
		LCD12864_E=1;//使能脚 E 先上升沿写入
		delay_ms(1);
		LCD12864_E=0;//使能脚 E 后负跳变完成写入
}
/********************************************************************
***********
* 函 数 名 : lcd12864
_init
* 函数功能 : LCD12864 初始化
* 输 入 : 无
* 输 出 : 无
*********************************************************************
**********/
void lcd12864_init(void)
{
		LCD12864_PSB=1;//选择 8 位或 4 位并口方式
		lcd12864_write_cmd(0x30);//数据总线 8 位,基本指令操作
		lcd12864_write_cmd(0x0c);//整体显示关,游标显示关,游标正常显示
		lcd12864_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
		lcd12864_write_cmd(0x01);//清屏
}
/********************************************************************
***********
* 函 数 名 : lcd12864
_clear
* 函数功能 : LCD12864 清屏
* 输 入 : 无
* 输 出 : 无
*********************************************************************
**********/
void lcd12864_clear(void)
{
		lcd12864_write_cmd(0x01);
}
/********************************************************************
***********
* 函 数 名 : lcd12864
_show_string
* 函数功能 : LCD12864 显示字符串
* 输 入 : x,y:显示坐标,x=0~7,y=0~3;
str:显示字符串数据
* 输 出 : 无
*********************************************************************
**********/
void lcd12864_show_string(u8 x,u8 y,u8 *str)
{
		if(y<=0)y=0;
		if(y>3)y=3;
		x&=0x0f; //限制 x,y 不能大于显示范围
		switch(y)
		{
			case 0: x|=0x80;break;//第 1 行地址+x 的偏移
			case 1: x|=0x90;break;//第 2 行地址+x 的偏移
			case 2: x|=0x88;break;//第 3 行地址+x 的偏移
			case 3: x|=0x98;break;//第 4 行地址+x 的偏移
		}
		lcd12864_write_cmd(x);
		while(*str!='\0')
		{
			lcd12864_write_data(*str);
			str++;
		}
}

main.c

/********************************************************************
****************** 实验名称:LCD12864 液晶显示实验(带字库)
接线说明:
实验现象:下载程序后,LCD12864 上显示汉字字符信息
注意事项:
*********************************************************************
******************/
# include "lcd12864.h"
/********************************************************************
***********
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*********************************************************************
**********/
void main()
{
    lcd12864_init();//LCD12864 初始化
    lcd12864_show_string(0,0,"Hello World!");//第 1 行字符串显示
    lcd12864_show_string(0,1,"大家好!");//第 2 行字符串显示
    lcd12864_show_string(0,2,"欢迎使用 51 开发板");//第 3 行字符串显示
    lcd12864_show_string(0,3,"好好学习天天向上");//第 4 行字符串显示
    while(1)
    {
    
    }
}