天天看点

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动

  • 一、LCD12864 / LCD12232
    • 1、LCD12864
    • 2、LCD12232
    • 3、接线图
  • 二、ST7920
    • 1、接口时序
      • ①、并口时序图
      • ②、串口时序图
    • 2、用户指令集
      • ①、基本指令集(RE = 0)
      • ②、扩展指令集(RE = 1)
      • ③、具体指令介绍
        • 1、清除显示
        • 2、位址归位
        • 3、进入设定点
        • 4、显示状态开 / 关
        • 5、游标或显示移位控制
        • 6、功能设定
        • 7、设定 CGRAM 位址
        • 8、设定 DDRAM 位址
        • 9、读取忙碌状态(BF)和位址
        • 10、写资料到 RAM
        • 11、读出 RAM 的值
        • 12、 待命模式
        • 13、卷动位址或 IRAM 位址选择
        • 14、反白选择
        • 15、睡眠模式
        • 16、扩充功能设定
        • 17、设定 IRAM 位址或卷动位址
        • 18、设定绘图 RAM 位址
  • 三、示例程序
    • 1、LCD12864并行接口
    • 2、LCD12864串行接口
    • 3、LCD12232并行接口
    • 4、LCD12232串行接口

一、LCD12864 / LCD12232

1、LCD12864

       LCD12864 带中文字库图形点阵式液晶显示器,可配合各种单片机可完成中文汉字、英文字符和图形显示,可构成全中文人机交互图形界面,模块具有功耗低、显示内容丰富等特点而应用广泛。它是利用液晶经过处理后能改变光线的传播方向,以电流刺激液晶分子产生点、线、面并配合背光灯构成画面。其显示分辨率为 128 × 64, 内置 2M 位中文字型 ROM(CGROM)8192 个(16 * 16 点阵)汉字,和 16K 位半宽字型 ROM(HCGROM)128个(16 * 8 点阵)ASCII 字符集,可以显示 8 × 4 行 16 × 16 点阵的汉字。ST7920 的字型产生 RAM(CGRAM)提供用户自定义字符生成(造字)功能,可提供 4 组 16 * 16 点阵的空间。将要显示的字符的编码写到显示 RAM(DDRAM)上,硬件自动从 CGROM 中选择将要显示的字型显示在屏幕上。绘图 RAM 提供 64 * 32 个字节的空间,最多可以控制 256 * 64 点阵的二维绘图缓冲空间。具有 4 位 / 8 位并行(适配 M6800 时序)、2 线或 3 线串行多种接口方式。各种液晶厂家均有提供几乎都是同样规格的 LCD12864 模块或兼容模块,基本上也都采用了兼容的 IC,所以从特性上基本上是一样的;当然,很多厂商提供了不同的字符颜色、背光色之类的显示模块。

       我用的这块 LCD12864 液晶屏是在优信电子上买的 12864T,带字库,如下图。

       关于这款 LCD12864 液晶屏的串并口选择,默认出货为串口,并口通用。1、在选择串并口时可以通过程序选择高低电平(PSB引脚)来完成。2、可以通过短接液晶屏背面 PCB 上面的丝印来选择,S 短接为串口,P 点短接为并口。

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

       由于出货时第三脚 V0 已经通过 JP2 跳点断开,如需要通过外部可调电阻调节,将 JP2 跳点连接即可。

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

引脚说明:

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

外形尺寸说明:

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

2、LCD12232

       LCD12232 和 LCD12864 一样,主控都是 ST7920(各种液晶厂家均有提供几乎都是同样规格的 LCD12232 模块或兼容模块,基本上也都采用了兼容的 IC,所以从特性上基本上是一样的;当然,很多厂商提供了不同的字符颜色、背光色之类的显示模块),LCD12232 相当于是把 LCD12864 纵向截掉一半,同时横向少了 6 个像素点。我使用的是 YB12232ZB 这款液晶屏,带字库,如下图。

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序
液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

       关于这款 LCD12232 液晶屏的串并口选择,默认出货为串口,并口通用。串 / 并口选择必须通过短接液晶屏背面 PCB 上面丝印来选择,S 短接为串口,P 点短接为并口。不能两个同时短接!!!只能短接其中一个!!!

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

串口引脚说明(短接 S):

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

并口引脚说明(短接 P):

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

外形尺寸说明

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

控制流:

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

3、接线图

这里使用 STC15W408AS(SOP20)做主控 MCU。

可通过 JP1 和 JP2 选择液晶屏的供电电压,3.3V 或者 5V。

可通过 JP3 确定 PSB 引脚是通过单片机 IO 控制或者直接拉高(悬空默认拉高,即并行接口,仅 LCD12864 有效)。

可通过 JP4 确定 RST 引脚是通过单片机 IO 控制或者直接拉高(低电平有效)。

可通过单片机 IO 控制液晶屏背光开关,默认开背光(低电平关背光)。

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序
液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

二、ST7920

1、接口时序

①、并口时序图

写时序图:

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

读时序图:

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

②、串口时序图

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

串行数据传送共分三个字节完成:

第一字节:串口控制格式: 11111ABC

A 为数据传送方向控制:H 表示数据从 LCD 到 MCU,L 表示数据从 MCU 到 LCD

B 为数据类型选择:H 表示数据是显示数据,L 表示数据是控制指令

C 固定为 0

第二字节:(并行)8 位数据的高 4 位—格式 DDDD0000

第三字节:(并行)8 位数据的低 4 位—格式 0000DDDD

串行接口时序参数:(测试条件:T=25℃ VDD=4.5V)

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

2、用户指令集

1、当模块在接受指令前,MCU 必须先确认模块内部处于非忙碌状态,即读取 BF 标志时 BF 需为 0,方可接受新的指令;如果在送出一个指令前并不检查 BF 标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。

2、“RE”为基本指令集与扩充指令集的选择控制位元,当变更“RE”位元后,往后的指令集将维持在最后的状态,除非再次变更“RE”位元,否则使用相同指令集时,不需每次重设“RE”位元。

①、基本指令集(RE = 0)

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

②、扩展指令集(RE = 1)

液晶屏 LCD12864 / LCD12232 串行 / 并行接口驱动一、LCD12864 / LCD12232二、ST7920三、示例程序

③、具体指令介绍

1、清除显示

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L L L L H

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

2、位址归位

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L L L H X

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

3、进入设定点

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L L H I/D S

功能:指定在显示数据的读取与写入时,设定游标的移动方向及指定显示的移位。

I/D = 1,游标右移,DDRAM 地址计数器(AC)加 1。

I/D = 0,游标左移,DDRAM 地址计数器(AC)减 1。

S:显示画面整体位移

S I/D 功能描述
H H 画面整体左移
H L 画面整体左移

4、显示状态开 / 关

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L H D C B

功能:

D = 1,整体显示 ON。

C = 1,游标 ON。

B = 1,游标位置显示反白 ON,将游标所在地址上的内容反白显示。

5、游标或显示移位控制

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L H S/C R/L X X

功能:设定游标的移动与显示的移位控制位,这个指令并不改变 DDRAM 的内容

S/C R/L 方向 AC 的值
L L 游标向左移动 AC=AC-1
L H 游标向右移动 AC=AC+1
H L 显示向左移动,游标跟着移动 AC=AC
H H 显示向右移动,游标跟着移动 AC=AC

6、功能设定

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L H DL X RE X X

功能:

DL = 1,8位接口控制位 。DL = 0,4位接口控制位。

RE = 1,扩充指令集动作。

RE = 0,基本指令集动作。

同一指令的动作不能同时改变 DL 和 RE,需先改变 DL 再改变 RE 才确保设置正确。

7、设定 CGRAM 位址

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L H AC5 AC4 AC3 AC2 AC1 AC0

功能:设定 CGRAM 地址到地址计数器(AC),AC 范围为 00H - 3FH 需确认扩充指令中 SR = 0(卷动位置或 RAM 地址选择)。

8、设定 DDRAM 位址

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L H L AC5 AC4 AC3 AC2 AC1 AC0

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

第一行 AC 范围:80H - 8FH

第二行 AC 范围:90H - 9FH

ST7920 控制器的 128 * 64 点阵液晶其实原理上等同于 256 * 32 点阵,第三行对应的 DDRAM 地址紧接第一行,第四行对应的 DDRAM 地址紧接第二行。

在使用反白功能时,如果第一行反白,第三行必然反白,第二行反白,第四行必然反白,这是正常现象。

9、读取忙碌状态(BF)和位址

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
H L BF AC6 AC5 AC4 AC3 AC2 AC1 AC0

功能:读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出位址计数器(AC)的值

10、写资料到 RAM

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L H D7 D6 D5 D4 D3 D2 D1 D0

功能:当显示数据写入后会使 AC 改变,每个 RAM (DDRAM / CGRAM / IRAM)地址都可以连续写入 2 个字节的显示数据,当写入第二个字节时,地址计数器 AC 的值自动加一。

11、读出 RAM 的值

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
H H D7 D6 D5 D4 D3 D2 D1 D0

功能:读取后会使 AC 改变

设定 RAM(DDRAM / CGRAM / IRAM)地址后,先要 Dummy read 一次才能读取到正确的显示数据,第二次读取不需要 Dummy read,除非重新设置了 RAM 地址。

12、 待命模式

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L L L L H

功能:进入待命模式,执行其他命令都可终止待命模式,该指令不改变 RAM 的内容。

13、卷动位址或 IRAM 位址选择

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L L L H SR

功能:SR=1,允许输入垂直卷动位址。SR=0,允许输入 IRAM 位址(扩充指令)及允许设定 CGRAM 地址(基本指令)。

14、反白选择

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L L H L R0

功能:选择 2 行中的任一行作反白显示,并可决定反白的与否。R0 初始值为 0,第一次执行时为反白显示,再次执行时为正常显示。

R0 = 0,第一行。R0 = 1,第二行。

ST7920 控制器的 128 * 64 点阵液晶其实原理上等同于 256 * 32 点阵,第三行对应的 DDRAM 地址紧接第一行,第四行对应的 DDRAM 地址紧接第二行。

在使用反白功能时,如果第一行反白,第三行必然反白,第二行反白,第四行必然反白,这是正常现象。

15、睡眠模式

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L L L H SL L L

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

16、扩充功能设定

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L L H DL X RE G X

功能:

DL = 1,8位接口控制位 。DL = 0,4位接口控制位。

RE=1,扩充指令集动作。RE=0,基本指令集动作。

G=1,绘图显示 ON。G=0,绘图显示 OFF。

17、设定 IRAM 位址或卷动位址

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L L H AC5 AC4 AC3 AC2 AC1 AC0

功能:SR=1,AC5-AC0 为垂直卷动地址。SR=0,AC3-AC0 写 IRAM 地址。

18、设定绘图 RAM 位址

RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
L L H L L L AC3 AC2 AC1 AC0
L L H AC6 AC5 AC4 AC3 AC2 AC1 AC0

功能:设定 GDRAM 地址到地址计数器(AC),先设置垂直位置再设置水平位置(连续写入 2 字节数据来完成垂直与水平坐标的设置)。

垂直地址范围:AC6 - AC0

水平地址范围:AC3 - AC0

三、示例程序

单片机晶振频率或者 IRC 频率 ≥ 20MHz 时,写数据 / 指令时需要加一定时间(例如 5 毫秒)延时,某则液晶屏显示会有杂点或者乱码!!!

1、LCD12864并行接口

//-------------------------------------------------------------------------------
//创建日期: 2021.02.02
//软件环境: Keil
//硬件环境: STC15W408AS
//IRC频率:  11.0592MHz
//创建人: Calvin Chan
//-------------------------------------------------------------------------------
#include <reg51.h>
#include <intrins.h>

#ifndef uchar
	#define uchar unsigned char
#endif
#ifndef uint
	#define uint  unsigned int
#endif

#define DATA_PORT	P1		//数据口

sbit RS = P3 ^ 5;
sbit RW = P3 ^ 6;
sbit EN = P3 ^ 7;

sbit PSB = P3 ^ 4;		//串并口选择
sbit RST = P3 ^ 3;		//复位

sbit BK = P3 ^ 2;	//背光开关

unsigned char code images[] = { //128,64,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x18, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00,
	0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF0, 0xFF, 0xE7, 0xFF, 0xEF, 0xFF, 0xFF, 0xC0, 0x00,
	0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFB, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00,
	0x00, 0x03, 0xFF, 0xF7, 0xFF, 0xBE, 0x7F, 0xFB, 0xFF, 0xF3, 0xFB, 0xFF, 0xFF, 0xEF, 0x80, 0x00,
	0x00, 0x01, 0xFB, 0xF7, 0x8F, 0xF8, 0x7F, 0xF8, 0xFF, 0xF1, 0xFB, 0xC7, 0x87, 0xEF, 0x00, 0x00,
	0x00, 0x00, 0xFB, 0xF7, 0x0F, 0xF0, 0x7C, 0xF8, 0xF9, 0xF1, 0xFB, 0x87, 0x83, 0xEE, 0x00, 0x00,
	0x00, 0x00, 0xFF, 0xFF, 0x07, 0xF0, 0x7C, 0x78, 0xF9, 0xF0, 0xFF, 0x87, 0x83, 0xFE, 0x00, 0x00,
	0x00, 0x00, 0x7F, 0xFE, 0x03, 0xF8, 0x7C, 0x78, 0xF9, 0xF0, 0xFF, 0x07, 0x81, 0xFC, 0x00, 0x00,
	0x00, 0x00, 0x7F, 0xFE, 0x07, 0xF8, 0x7C, 0x78, 0xF9, 0xF0, 0x7F, 0x07, 0x81, 0xFC, 0x00, 0x00,
	0x00, 0x00, 0x3E, 0x7C, 0x0F, 0xFC, 0x7C, 0xF8, 0xF9, 0xF0, 0x7E, 0x07, 0xC0, 0xF8, 0x00, 0x00,
	0x00, 0x00, 0x3E, 0x7C, 0x3F, 0xFF, 0xFF, 0xFD, 0xFF, 0xF8, 0x3E, 0x1F, 0xF0, 0xF8, 0x00, 0x00,
	0x00, 0x00, 0x3C, 0x3C, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3C, 0x1F, 0xF0, 0x70, 0x00, 0x00,
	0x00, 0x00, 0x1C, 0x38, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3C, 0x1F, 0xF0, 0xF0, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

unsigned char code images2[] = { //64*32
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x01, 0xE0, 0xFF, 0xF0, 0xFF, 0x00,
	0x00, 0x3E, 0x01, 0xF0, 0xFF, 0xF3, 0xFF, 0x80, 0x00, 0x3E, 0x01, 0xF0, 0x79, 0xC3, 0xC7, 0xC0,
	0x00, 0x7F, 0x03, 0xF8, 0x7B, 0x87, 0x83, 0xC0, 0x00, 0x7F, 0x03, 0xF8, 0x7F, 0x07, 0x83, 0xE0,
	0x00, 0x7F, 0x87, 0xF8, 0x7F, 0x07, 0x81, 0xE0, 0x00, 0xFF, 0x87, 0xFC, 0x7F, 0x87, 0x81, 0xE0,
	0x00, 0xFF, 0x87, 0xFC, 0x7F, 0xC7, 0x83, 0xC0, 0x00, 0xE7, 0xCE, 0x3E, 0x7B, 0xE7, 0xC3, 0xC0,
	0x01, 0xE7, 0xEF, 0x3F, 0xFF, 0xF3, 0xE7, 0x80, 0x03, 0xFF, 0xFF, 0x7F, 0xFF, 0xF9, 0xFF, 0x00,
	0x03, 0xF7, 0xFF, 0x7F, 0xFF, 0xF8, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 lcd_wait_idle(void)                  //控制器忙检测子程序
{
	unsigned char i;
	DATA_PORT = 0xff;
	RS = 0;
	RW = 1;
	EN = 1;

	for(i = 0; i < 20; i++)             //
		if((DATA_PORT & 0x80) != 0x80)
			break;  //D7=0 空闲退出

	EN = 0;
}

//功能:从液晶显示控制器读数据
unsigned char lcd_rd(void)               //从液晶显示控制器读数据
{
	unsigned char d;
	lcd_wait_idle();                      //ST7920液晶显示控制器忙检测
	RS = 1;                          //RS=1 RW=1 E=高脉冲
	RW = 1;
	EN = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	d = DATA_PORT;
	EN = 0;
	return d;
}
//功能:向液晶显示控制器写数据
void lcd_wd(unsigned char d)             //向液晶显示控制器写数据
{
	lcd_wait_idle();                      //ST7920液晶显示控制器忙检测
	DATA_PORT = d;
	RS = 1;                          //RS=1 RW=0 E=高脉冲
	RW = 0;
	EN = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	EN = 0;
}
//功能:向液晶显示控制器送指令
void lcd_wc(unsigned char c)             //向液晶显示控制器送指令
{
	lcd_wait_idle();                      //ST7920液晶显示控制器忙检测
	DATA_PORT = c;
	RS = 0;                          //RS=0 RW=0 E=高脉冲
	RW = 0;
	EN = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	EN = 0;
}
//功能:开启LCD显示
void lcd_on(void)                        //LCD显示开启子程序
{
	lcd_wc(0x30);                        //设置为基本指令集
	lcd_wc(0x0c);
}
//功能:关闭LCD显示
void lcd_off(void)                       //LCD显示关闭子程序
{
	lcd_wc(0x30);                        //设置为基本指令集
	lcd_wc(0x08);
}
//功能:液晶显示控制器初始化
void lcd_init(void)                     //液晶显示控制器初始化子程序
{
	lcd_wc(0x33);                        //接口模式设置,8位,基本指令集
	Delay5ms();                         //延时3MS
	lcd_wc(0x30);                        //基本指令集,8位控制口
	Delay5ms();                         //延时3MS
	lcd_wc(0x30);                        //重复送基本指令集
	Delay5ms();                         //延时3MS
	lcd_wc(0x01);                        //清屏控制字
	Delay5ms();                         //延时3MS
	lcd_on();                            //开显示
}
//功能:开启绘图区域显示
void lcd_graph_on(void)                  //绘图区域显示开启子程序
{
	lcd_wc(0x36);							//扩充指令集,8位,开绘图
	lcd_wc(0x30);                        //恢复为基本指令集
}
//功能:关闭绘图区域显示
void lcd_graph_off(void)                  //绘图区域显示关闭子程序
{
	lcd_wc(0x34);							//扩充指令集,8位,关绘图
	lcd_wc(0x30);                        //恢复为基本指令集
}
//功能:整屏显示 c 代表的ASCII字符
void char_lcd_fill(unsigned char c) 
{
	unsigned char i;

	if(c > 128) {
		return;
	}

	lcd_wc(0x80);

	for(i = 0; i < 16; i++) {
		lcd_wd(c);
	}

	lcd_wc(0x90);

	for(i = 0; i < 16; i++) {
		lcd_wd(c);
	}

	lcd_wc(0x88);

	for(i = 0; i < 16; i++) {
		lcd_wd(c);
	}

	lcd_wc(0x98);

	for(i = 0; i < 16; i++) {
		lcd_wd(c);
	}
}
//功能:写字库自带的汉字、字符
//字库自带的汉字为 16 * 16, 字符为 8 * 16
//参数: x 横坐标 0-7
//		y 纵坐标  1-4
//		datas 需要写入的数据
void lcd_write_font(unsigned char x, unsigned char y, unsigned char *datas)
{
	if(y > 4) {
		return;
	}

	if(x > 7) {
		return;
	}

	switch(y) { //定位第几行第几列开始写汉字
		case 1 :
			lcd_wc(0x80 + x);
			break;

		case 2 :
			lcd_wc(0x90 + x);
			break;

		case 3 :
			lcd_wc(0x88 + x);
			break;

		case 4 :
			lcd_wc(0x98 + x);
			break;
	}

	while(*datas != '\0') {
		lcd_wd(*datas++);//写入汉字
	}
}

//功能:设置(GXPOS,GYPOS)对应绘图区域内部RAM指针
void g_lcd_pos(unsigned char GXPOS, unsigned char GYPOS) 
{
	lcd_wc(0x36);                        //扩展指令集,8位,开绘图

	if(GYPOS >= 32) {
		lcd_wc((GYPOS - 32) + 0x80);	//下半屏,先送Y地址
		lcd_wc((GXPOS / 16) + 0x88);	//下半屏,再送X地址

	} else {
		lcd_wc(GYPOS + 0x80);		//上半屏
		lcd_wc((GXPOS / 16) + 0x80);	//上半屏
	}

	lcd_wc(0x30);                        //恢复为基本指令集
}

//功能:清除绘图区域
void g_lcd_fill()
{
	unsigned char i, j;

	for(i = 0; i < 64; i++) {
		g_lcd_pos(0, i);

		for(j = 0; j < 16; j++) {
			lcd_wd(0x00);
		}
	}
}

//功能:在(GXPOS,GYPOS)位置绘制XSIZE列及YISZE行点阵的图形*S(XSIZE仅取8的倍数,GXPOS仅取16的倍数)
void put_size_image(unsigned char GXPOS, unsigned char GYPOS, unsigned char XSIZE, unsigned char YSIZE, unsigned char code *s)
{
	unsigned char lx, ly;

	for(ly = 0; ly < YSIZE; ly++) {
		g_lcd_pos(GXPOS, GYPOS);	//设置地址

		for(lx = 0; lx < XSIZE; lx += 8) {
			lcd_wd(*s);
			s++;
		}

		GYPOS++;	//换行
	}
}

void main()
{
	BK = 1;

	Delay500ms();//等待上电稳定
	lcd_init();

	PSB = 1;		//并口

	while(1) {
		lcd_graph_on();		//开启图形
		g_lcd_fill();		//图形区域清零
		put_size_image(0, 0, 128, 64, images);
		Delay500ms();
		Delay500ms();
		Delay500ms();
		Delay500ms();
		g_lcd_fill();
		put_size_image(0, 32, 64, 32, images2);
		put_size_image(64, 32, 64, 32, images2);
		put_size_image(0, 0, 64, 32, images2);
		put_size_image(64, 0, 64, 32, images2);
		Delay500ms();
		Delay500ms();
		Delay500ms();
		Delay500ms();
		g_lcd_fill();
		lcd_graph_off();	//关闭图形
		lcd_write_font(0, 1, "中国牛批!!!!");
		lcd_write_font(0, 2, "中国牛批!!!!");
		lcd_write_font(0, 3, "中国牛批!!!!");
		lcd_write_font(0, 4, "中国牛批!!!!");
		Delay500ms();
		Delay500ms();
		Delay500ms();
		Delay500ms();
		char_lcd_fill(' ');		//清除文字区域
	}
}
           

2、LCD12864串行接口

//-------------------------------------------------------------------------------
//创建日期: 2021.02.02
//软件环境: Keil
//硬件环境: STC15W408AS
//IRC频率:  11.0592MHz
//创建人: Calvin Chan
//-------------------------------------------------------------------------------
#include <reg51.h>
#include <intrins.h>

#ifndef uchar
	#define uchar unsigned char
#endif
#ifndef uint
	#define uint  unsigned int
#endif

#define DATA_PORT	P1		//数据口

sbit CS   = P3 ^ 5;
sbit STD  = P3 ^ 6;
sbit SCLK = P3 ^ 7;

sbit PSB = P3 ^ 4;		//串并口选择
sbit RST = P3 ^ 3;		//复位

sbit BK = P3 ^ 2;	//背光开关

unsigned char code images[] = { //128,64,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x18, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00,
	0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF0, 0xFF, 0xE7, 0xFF, 0xEF, 0xFF, 0xFF, 0xC0, 0x00,
	0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFB, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00,
	0x00, 0x03, 0xFF, 0xF7, 0xFF, 0xBE, 0x7F, 0xFB, 0xFF, 0xF3, 0xFB, 0xFF, 0xFF, 0xEF, 0x80, 0x00,
	0x00, 0x01, 0xFB, 0xF7, 0x8F, 0xF8, 0x7F, 0xF8, 0xFF, 0xF1, 0xFB, 0xC7, 0x87, 0xEF, 0x00, 0x00,
	0x00, 0x00, 0xFB, 0xF7, 0x0F, 0xF0, 0x7C, 0xF8, 0xF9, 0xF1, 0xFB, 0x87, 0x83, 0xEE, 0x00, 0x00,
	0x00, 0x00, 0xFF, 0xFF, 0x07, 0xF0, 0x7C, 0x78, 0xF9, 0xF0, 0xFF, 0x87, 0x83, 0xFE, 0x00, 0x00,
	0x00, 0x00, 0x7F, 0xFE, 0x03, 0xF8, 0x7C, 0x78, 0xF9, 0xF0, 0xFF, 0x07, 0x81, 0xFC, 0x00, 0x00,
	0x00, 0x00, 0x7F, 0xFE, 0x07, 0xF8, 0x7C, 0x78, 0xF9, 0xF0, 0x7F, 0x07, 0x81, 0xFC, 0x00, 0x00,
	0x00, 0x00, 0x3E, 0x7C, 0x0F, 0xFC, 0x7C, 0xF8, 0xF9, 0xF0, 0x7E, 0x07, 0xC0, 0xF8, 0x00, 0x00,
	0x00, 0x00, 0x3E, 0x7C, 0x3F, 0xFF, 0xFF, 0xFD, 0xFF, 0xF8, 0x3E, 0x1F, 0xF0, 0xF8, 0x00, 0x00,
	0x00, 0x00, 0x3C, 0x3C, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3C, 0x1F, 0xF0, 0x70, 0x00, 0x00,
	0x00, 0x00, 0x1C, 0x38, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3C, 0x1F, 0xF0, 0xF0, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x01, 0xE0, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x07, 0xC0, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0F, 0xC0, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

unsigned char code images2[] = { //64*32
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x01, 0xE0, 0xFF, 0xF0, 0xFF, 0x00,
	0x00, 0x3E, 0x01, 0xF0, 0xFF, 0xF3, 0xFF, 0x80, 0x00, 0x3E, 0x01, 0xF0, 0x79, 0xC3, 0xC7, 0xC0,
	0x00, 0x7F, 0x03, 0xF8, 0x7B, 0x87, 0x83, 0xC0, 0x00, 0x7F, 0x03, 0xF8, 0x7F, 0x07, 0x83, 0xE0,
	0x00, 0x7F, 0x87, 0xF8, 0x7F, 0x07, 0x81, 0xE0, 0x00, 0xFF, 0x87, 0xFC, 0x7F, 0x87, 0x81, 0xE0,
	0x00, 0xFF, 0x87, 0xFC, 0x7F, 0xC7, 0x83, 0xC0, 0x00, 0xE7, 0xCE, 0x3E, 0x7B, 0xE7, 0xC3, 0xC0,
	0x01, 0xE7, 0xEF, 0x3F, 0xFF, 0xF3, 0xE7, 0x80, 0x03, 0xFF, 0xFF, 0x7F, 0xFF, 0xF9, 0xFF, 0x00,
	0x03, 0xF7, 0xFF, 0x7F, 0xFF, 0xF8, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

//功能:送1位数据到液晶显示控制器
void trans_bit(bit d)
{
	STD = d;                          //先送数据到数据口线DI
	_nop_();
	SCLK = 1;                         //再使时钟口线发一个负脉冲
	_nop_();
	SCLK = 0;
	_nop_();
	SCLK = 1;
}
//功能:送1字节数据到液晶显示控制器
void trans_byte(unsigned char d)
{
	unsigned char i;

	for(i = 0; i < 8; i++) {
		if((d & 0x80) == 0x80)
			trans_bit(1);
		else
			trans_bit(0);

		d <<= 1;         //从高到低位送字节位数据到液晶显示控制器
	}
}
//功能:向液晶显示控制器写图形数据
void lcd_wd(unsigned char d) 
{
	CS = 1;                           //片选使能
	trans_byte(0xFA);                     //SYNCODE=0F8H,RW=0,RS=1,D0=0
	trans_byte(d & 0xF0);                 //送高四位数据,低四位补零
	trans_byte((d & 0x0F) << 4);          //送低四位数据
	CS = 0;                           //片选禁止
}
//功能:向液晶显示控制器送指令
void lcd_wc(unsigned char c)             //向液晶显示控制器送指令
{
	CS = 1;                           //片选使能
	trans_byte(0xF8);                     //SYNCODE=0F8H,RW=0,RS=0,D0=0
	trans_byte(c & 0xF0);                 //送高四位数据,低四位补零
	trans_byte((c & 0x0F) << 4);          //送低四位数据
	CS = 0;                           //片选禁止
}
//功能:开启LCD显示
void lcd_on(void)                        //LCD显示开启子程序
{
	lcd_wc(0x30);                        //设置为基本指令集
	lcd_wc(0x0c);
}
//功能:关闭LCD显示
void lcd_off(void)                       //LCD显示关闭子程序
{
	lcd_wc(0x30);                        //设置为基本指令集
	lcd_wc(0x08);
}
//功能:液晶显示控制器初始化
void lcd_init(void)                     //液晶显示控制器初始化子程序
{
	lcd_wc(0x33);                        //接口模式设置,8位,基本指令集
	Delay5ms();                         //延时3MS
	lcd_wc(0x30);                        //基本指令集,8位控制口
	Delay5ms();                         //延时3MS
	lcd_wc(0x30);                        //重复送基本指令集
	Delay5ms();                         //延时3MS
	lcd_wc(0x01);                        //清屏控制字
	Delay5ms();                         //延时3MS
	lcd_on();                            //开显示
}
//功能:开启绘图区域显示
void lcd_graph_on(void)                  //绘图区域显示开启子程序
{
	lcd_wc(0x36);							//扩充指令集,8位,开绘图
	lcd_wc(0x30);                        //恢复为基本指令集
}
//功能:关闭绘图区域显示
void lcd_graph_off(void)                  //绘图区域显示关闭子程序
{
	lcd_wc(0x34);							//扩充指令集,8位,关绘图
	lcd_wc(0x30);                        //恢复为基本指令集
}
//功能:整屏显示 c 代表的ASCII字符
void char_lcd_fill(unsigned char c) 
{
	unsigned char i;

	if(c > 128) {
		return;
	}

	lcd_wc(0x80);

	for(i = 0; i < 16; i++) {
		lcd_wd(c);
	}

	lcd_wc(0x90);

	for(i = 0; i < 16; i++) {
		lcd_wd(c);
	}

	lcd_wc(0x88);

	for(i = 0; i < 16; i++) {
		lcd_wd(c);
	}

	lcd_wc(0x98);

	for(i = 0; i < 16; i++) {
		lcd_wd(c);
	}
}
//功能:写字库自带的汉字、字符
//字库自带的汉字为 16 * 16, 字符为 8 * 16
//参数: x 横坐标 0-7
//		y 纵坐标  1-4
//		datas 需要写入的数据
void lcd_write_font(unsigned char x, unsigned char y, unsigned char *datas)
{
	if(y > 4) {
		return;
	}

	if(x > 7) {
		return;
	}

	switch(y) { //定位第几行第几列开始写汉字
		case 1 :
			lcd_wc(0x80 + x);
			break;

		case 2 :
			lcd_wc(0x90 + x);
			break;

		case 3 :
			lcd_wc(0x88 + x);
			break;

		case 4 :
			lcd_wc(0x98 + x);
			break;
	}

	while(*datas != '\0') {
		lcd_wd(*datas++);//写入汉字
	}
}

//功能:设置(GXPOS,GYPOS)对应绘图区域内部RAM指针
void g_lcd_pos(unsigned char GXPOS, unsigned char GYPOS) 
{
	lcd_wc(0x36);                        //扩展指令集,8位,开绘图

	if(GYPOS >= 32) {
		lcd_wc((GYPOS - 32) + 0x80);	//下半屏,先送Y地址
		lcd_wc((GXPOS / 16) + 0x88);	//下半屏,再送X地址

	} else {
		lcd_wc(GYPOS + 0x80);		//上半屏
		lcd_wc((GXPOS / 16) + 0x80);	//上半屏
	}

	lcd_wc(0x30);                        //恢复为基本指令集
}

//功能:清除绘图区域
void g_lcd_fill()
{
	unsigned char i, j;

	for(i = 0; i < 64; i++) {
		g_lcd_pos(0, i);

		for(j = 0; j < 16; j++) {
			lcd_wd(0x00);
		}
	}
}

//功能:在(GXPOS,GYPOS)位置绘制XSIZE列及YISZE行点阵的图形*S(XSIZE仅取8的倍数,GXPOS仅取16的倍数)
void put_size_image(unsigned char GXPOS, unsigned char GYPOS, unsigned char XSIZE, unsigned char YSIZE, unsigned char code *s)
{
	unsigned char lx, ly;

	for(ly = 0; ly < YSIZE; ly++) {
		g_lcd_pos(GXPOS, GYPOS);	//设置地址

		for(lx = 0; lx < XSIZE; lx += 8) {
			lcd_wd(*s);
			s++;
		}

		GYPOS++;	//换行
	}
}

void main()
{
	BK = 1;				//开背光

	Delay500ms();//等待上电稳定
	
	DATA_PORT = 0x00;
	PSB = 0;			//串口
	
	lcd_init();
	
	char_lcd_fill('A');
	Delay500ms();
	Delay500ms();
	Delay500ms();
	Delay500ms();
	char_lcd_fill(' ');

	while(1) {
		lcd_graph_on();		//开启图形
		g_lcd_fill();		//图形区域清零
		put_size_image(0, 0, 128, 64, images);
		Delay500ms();
		Delay500ms();
		Delay500ms();
		Delay500ms();
		g_lcd_fill();
		put_size_image(0, 32, 64, 32, images2);
		put_size_image(64, 32, 64, 32, images2);
		put_size_image(0, 0, 64, 32, images2);
		put_size_image(64, 0, 64, 32, images2);
		Delay500ms();
		Delay500ms();
		Delay500ms();
		Delay500ms();
		g_lcd_fill();
		lcd_graph_off();	//关闭图形
		lcd_write_font(0, 1, "我真的很爱中国!");
		lcd_write_font(0, 2, "我真的很爱中国!");
		lcd_write_font(0, 3, "我真的很爱中国!");
		lcd_write_font(0, 4, "我真的很爱中国!");
		Delay500ms();
		Delay500ms();
		Delay500ms();
		Delay500ms();
		char_lcd_fill(' ');
	}
}
           

3、LCD12232并行接口

//-------------------------------------------------------------------------------
//创建日期: 2021.02.02
//软件环境: Keil
//硬件环境: STC15W408AS		
//IRC频率:  11.0592MHz
//创建人: Calvin Chan
//-------------------------------------------------------------------------------
#include <reg51.h>
#include <intrins.h>

#ifndef uchar
	#define uchar unsigned char
#endif
#ifndef uint
	#define uint  unsigned int
#endif

#define DATA_PORT	P1

#define WRITE_CMD	1	//写命令
#define WRITE_DATA	0	//写数据

sbit RS = P3 ^ 5;
sbit RW = P3 ^ 6;
sbit EN = P3 ^ 7;

sbit RST = P3 ^ 3;	//复位

sbit BK = P3 ^ 2;	//背光开关

unsigned char code images[] = { //122*32
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xE0, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x1E, 0x1C, 0x3F, 0x83, 0x9F, 0xF8, 0x7F, 0xE3, 0x81, 0xFF, 0xFC, 0x0E, 0x00, 0x00, 0x00,
	0x00, 0x1E, 0x3C, 0x3F, 0xC7, 0x9F, 0xFC, 0x7F, 0xF3, 0xC1, 0xFF, 0xFC, 0x1E, 0x00, 0x00, 0x00,
	0x00, 0x0E, 0x3E, 0x3B, 0xEF, 0x1F, 0xFC, 0x7F, 0xF3, 0xC1, 0xDF, 0xDC, 0x1E, 0x00, 0x00, 0x00,
	0x00, 0x0E, 0x3E, 0x39, 0xEF, 0x1E, 0x1C, 0x78, 0x79, 0xC3, 0xC7, 0x1E, 0x1C, 0x00, 0x00, 0x00,
	0x00, 0x0F, 0x3E, 0x78, 0xFE, 0x1C, 0x1C, 0x78, 0x79, 0xE3, 0x87, 0x1E, 0x3C, 0x00, 0x00, 0x00,
	0x00, 0x0F, 0x7F, 0x70, 0xFC, 0x1C, 0x1C, 0x70, 0x79, 0xE7, 0x87, 0x0F, 0x38, 0x00, 0x00, 0x00,
	0x00, 0x07, 0x77, 0x70, 0x7C, 0x1C, 0x1C, 0x70, 0x78, 0xE7, 0x87, 0x0F, 0x78, 0x00, 0x00, 0x00,
	0x00, 0x07, 0x77, 0xF0, 0x7C, 0x1C, 0x1C, 0x70, 0x78, 0xF7, 0x07, 0x07, 0x78, 0x00, 0x00, 0x00,
	0x00, 0x07, 0xF7, 0xE0, 0xFE, 0x1C, 0x1C, 0x70, 0x78, 0x7F, 0x07, 0x07, 0xF0, 0x00, 0x00, 0x00,
	0x00, 0x03, 0xE3, 0xE1, 0xFF, 0x1C, 0x1C, 0x70, 0x78, 0x7F, 0x07, 0x07, 0xF0, 0x00, 0x00, 0x00,
	0x00, 0x03, 0xE3, 0xE1, 0xEF, 0x1C, 0x1C, 0x70, 0x78, 0x7E, 0x07, 0x03, 0xF0, 0x00, 0x00, 0x00,
	0x00, 0x03, 0xE3, 0xE3, 0xC7, 0x9C, 0x1C, 0x70, 0x78, 0x3E, 0x07, 0x03, 0xE0, 0x00, 0x00, 0x00,
	0x00, 0x03, 0xC3, 0xC7, 0x87, 0x9C, 0x1C, 0x70, 0x78, 0x3C, 0x07, 0x01, 0xE0, 0x00, 0x00, 0x00,
	0x00, 0x01, 0xC1, 0xC7, 0x83, 0x9C, 0x1C, 0x70, 0x38, 0x3C, 0x07, 0x03, 0xC0, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

//检测LCD是否忙
void lcd_wait(void)
{
	uchar i;
	DATA_PORT = 0xFF;
	RS = 0;
	RW = 1;
	EN = 1;

	for(i = 0; i < 20; i++)             //
		if((DATA_PORT & 0x80) != 0x80)
			break;  //D7=0 空闲退出

	EN = 0;
}
//写数据/命令
void lcd_write(uchar opra, uchar datas)
{
	lcd_wait();
	DATA_PORT = datas;

	if(opra == 1) {	//写命令
		RS = 0;
	} else {		//写数据
		RS = 1;
	}

	RW = 0;
	EN = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	EN = 0;
}
//从LCD读取数据
uchar lcd_read_data(void)
{
	uchar datas;
	lcd_wait();
	RS = 0;
	RW = 1;
	EN = 1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	datas = DATA_PORT;
	EN = 0;
	return datas;
}

//开启LCD显示
void lcdon(void)
{
	lcd_write(WRITE_CMD, 0x30);                        //设置为基本指令集
	lcd_write(WRITE_CMD, 0x0c);
}
//关闭LCD显示
void lcdoff(void)                       //LCD显示关闭子程序
{
	lcd_write(WRITE_CMD, 0x30);                        //设置为基本指令集
	lcd_write(WRITE_CMD, 0x08);
}

//LCD初始化
void lcd_init(void)
{
	lcd_write(WRITE_CMD, 0x33);		//发送基本指令集
	Delay5ms();
	lcd_write(WRITE_CMD, 0x30);		//发送基本指令集
	Delay5ms();
	lcd_write(WRITE_CMD, 0x30);		//发送基本指令集
	Delay5ms();
	lcd_write(WRITE_CMD, 0x0C);		//开显示,关游标,关游标位置反白
	Delay5ms();
	lcd_write(WRITE_CMD, 0x01);		//清屏
	Delay5ms();
	lcdon();
}

//字符操作区域
//12232ZB字符区域定义为:
//XPOS(0-15) 对应于第1列到第16列位置,每个字符列位置实际占位8点,总计对应128点
//由于显示只有122点,所以最后的6点不能显示出来.
//YPOS(0-1)对应于第1行到第2行,每个行位置实际占位16点,总计对应32点
void lcd_write_ddram(uchar x, uchar y, uchar *datas)
{
	if(x > 15) {
		return;
	}

	if(y > 1) {
		return;
	}

	if(y == 0) {
		lcd_write(WRITE_CMD, 0x80 + x);
	} else {
		lcd_write(WRITE_CMD, 0x90 + x);
	}

	while(*datas != '\0') {
		lcd_write(WRITE_DATA, *datas++);
	}

}

//功能:整屏显示 c 代表的ASCII字符
void char_lcd_fill(unsigned char c) 
{
	uchar x, y;

	for(y = 0; y < 2; y++) {
		if(y == 0) {
			lcd_write(WRITE_CMD, 0x80);
		} else {
			lcd_write(WRITE_CMD, 0x90);
		}

		for(x = 0; x < 15; x++) {
			lcd_write(WRITE_DATA, c);
		}
	}
}

//功能:开启绘图区域显示
void lcd_graph_on(void)
{
	lcd_write(WRITE_CMD, 0x36);							//扩充指令集,8位,开绘图
	lcd_write(WRITE_CMD, 0x30);                        //恢复为基本指令集
}
//功能:关闭绘图区域显示
void lcd_graph_off(void)                  //绘图区域显示关闭子程序
{
	lcd_write(WRITE_CMD, 0x34);							//扩充指令集,8位,关绘图
	lcd_write(WRITE_CMD, 0x30);                        //恢复为基本指令集
}

//功能:设置(GXPOS,GYPOS)对应绘图区域内部RAM指针
void g_lcd_pos(unsigned char GXPOS, unsigned char GYPOS) 
{
	lcd_write(WRITE_CMD, 0x36);                       //扩展指令集,8位,开绘图
	lcd_write(WRITE_CMD, (GYPOS + 0x80));		//Y
	lcd_write(WRITE_CMD, ((GXPOS / 16) | 0x80));//X
	lcd_write(WRITE_CMD, 0x30);                        //恢复为基本指令集
}

//功能:清除图形区域
void g_lcd_fill()
{
	unsigned char i, j;

	for(i = 0; i < 32; i++) {
		g_lcd_pos(0, i);

		for(j = 0; j < 16; j++) {
			lcd_write(WRITE_DATA, 0x00);
		}
	}
}

//功能:在(GXPOS,GYPOS)位置绘制XSIZE列及YISZE行点阵的图形*S(XSIZE仅取8的倍数,GXPOS仅取16的倍数)
void put_size_image(unsigned char GXPOS, unsigned char GYPOS, unsigned char XSIZE, unsigned char YSIZE, unsigned char code *s)
{
	unsigned char lx, ly;

	for(ly = 0; ly < YSIZE; ly++) {
		g_lcd_pos(GXPOS, GYPOS);	//设置地址

		for(lx = 0; lx < XSIZE; lx += 8) {
			lcd_write(WRITE_DATA, *s);
			s++;
		}

		GYPOS++;	//换行
	}
}
void main()
{
	BK = 1;

	Delay500ms();//等待上电稳定
	lcd_init();
	
	while(1) {
		lcd_write_ddram(0, 0, "我爱中国真的爱 ");
		lcd_write_ddram(0, 1, "我爱中国真的爱 ");
		Delay500ms();
		Delay500ms();
		Delay500ms();
		Delay500ms();
		char_lcd_fill(' ');
		lcd_write_ddram(0, 0, "ABCDEFGHIJKLMO");
		lcd_write_ddram(0, 1, "PQRSTUVWXYZabc");
		Delay500ms();
		Delay500ms();
		Delay500ms();
		Delay500ms();
		char_lcd_fill(' ');
		lcd_graph_on();
		g_lcd_fill();
		put_size_image(0, 0, 122, 32, images);
		Delay500ms();
		Delay500ms();
		Delay500ms();
		Delay500ms();
		lcd_graph_off();
	}
}
           

4、LCD12232串行接口

//-------------------------------------------------------------------------------
//创建日期: 2021.02.02
//软件环境: Keil
//硬件环境: STC15W408AS		
//IRC频率:  11.0592MHz
//创建人: Calvin Chan
//-------------------------------------------------------------------------------
#include <reg51.h>
#include <intrins.h>

#ifndef uchar
	#define uchar unsigned char
#endif
#ifndef uint
	#define uint  unsigned int
#endif

#define DATA_PORT	P1

#define WRITE_CMD	1	//写命令
#define WRITE_DATA	0	//写数据

sbit CS   = P3 ^ 5;
sbit STD  = P3 ^ 6;
sbit SCLK = P3 ^ 7;

sbit RST = P3 ^ 3;	//复位

sbit BK = P3 ^ 2;	//背光开关

unsigned char code images[] = { //122*32
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xE0, 0x03, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x1E, 0x1C, 0x3F, 0x83, 0x9F, 0xF8, 0x7F, 0xE3, 0x81, 0xFF, 0xFC, 0x0E, 0x00, 0x00, 0x00,
	0x00, 0x1E, 0x3C, 0x3F, 0xC7, 0x9F, 0xFC, 0x7F, 0xF3, 0xC1, 0xFF, 0xFC, 0x1E, 0x00, 0x00, 0x00,
	0x00, 0x0E, 0x3E, 0x3B, 0xEF, 0x1F, 0xFC, 0x7F, 0xF3, 0xC1, 0xDF, 0xDC, 0x1E, 0x00, 0x00, 0x00,
	0x00, 0x0E, 0x3E, 0x39, 0xEF, 0x1E, 0x1C, 0x78, 0x79, 0xC3, 0xC7, 0x1E, 0x1C, 0x00, 0x00, 0x00,
	0x00, 0x0F, 0x3E, 0x78, 0xFE, 0x1C, 0x1C, 0x78, 0x79, 0xE3, 0x87, 0x1E, 0x3C, 0x00, 0x00, 0x00,
	0x00, 0x0F, 0x7F, 0x70, 0xFC, 0x1C, 0x1C, 0x70, 0x79, 0xE7, 0x87, 0x0F, 0x38, 0x00, 0x00, 0x00,
	0x00, 0x07, 0x77, 0x70, 0x7C, 0x1C, 0x1C, 0x70, 0x78, 0xE7, 0x87, 0x0F, 0x78, 0x00, 0x00, 0x00,
	0x00, 0x07, 0x77, 0xF0, 0x7C, 0x1C, 0x1C, 0x70, 0x78, 0xF7, 0x07, 0x07, 0x78, 0x00, 0x00, 0x00,
	0x00, 0x07, 0xF7, 0xE0, 0xFE, 0x1C, 0x1C, 0x70, 0x78, 0x7F, 0x07, 0x07, 0xF0, 0x00, 0x00, 0x00,
	0x00, 0x03, 0xE3, 0xE1, 0xFF, 0x1C, 0x1C, 0x70, 0x78, 0x7F, 0x07, 0x07, 0xF0, 0x00, 0x00, 0x00,
	0x00, 0x03, 0xE3, 0xE1, 0xEF, 0x1C, 0x1C, 0x70, 0x78, 0x7E, 0x07, 0x03, 0xF0, 0x00, 0x00, 0x00,
	0x00, 0x03, 0xE3, 0xE3, 0xC7, 0x9C, 0x1C, 0x70, 0x78, 0x3E, 0x07, 0x03, 0xE0, 0x00, 0x00, 0x00,
	0x00, 0x03, 0xC3, 0xC7, 0x87, 0x9C, 0x1C, 0x70, 0x78, 0x3C, 0x07, 0x01, 0xE0, 0x00, 0x00, 0x00,
	0x00, 0x01, 0xC1, 0xC7, 0x83, 0x9C, 0x1C, 0x70, 0x38, 0x3C, 0x07, 0x03, 0xC0, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

//功能:送1位数据到液晶显示控制器
void trans_bit(bit d)
{
	STD = d;                          //先送数据到数据口线DI
	_nop_();
	SCLK = 1;                         //再使时钟口线发一个负脉冲
	_nop_();
	SCLK = 0;
	_nop_();
	SCLK = 1;
}
//功能:送1字节数据到液晶显示控制器
void trans_byte(unsigned char d)
{
	unsigned char i;

	for(i = 0; i < 8; i++) {
		if((d & 0x80) == 0x80)
			trans_bit(1);
		else
			trans_bit(0);

		d <<= 1;                        //从高到低位送字节位数据到液晶显示控制器
	}
}
//功能:向液晶显示控制器写图形数据
void lcd_wd(unsigned char d)
{
	CS = 1;                           //片选使能
	trans_byte(0xFA);                     //SYNCODE=0F8H,RW=0,RS=1,D0=0
	trans_byte(d & 0xF0);                 //送高四位数据,低四位补零
	trans_byte((d & 0x0F) << 4);          //送低四位数据
	CS = 0;                           //片选禁止
}
//功能:向液晶显示控制器送指令
void lcd_wc(unsigned char c)
{
	CS = 1;                           //片选使能
	trans_byte(0xF8);                     //SYNCODE=0F8H,RW=0,RS=0,D0=0
	trans_byte(c & 0xF0);                 //送高四位数据,低四位补零
	trans_byte((c & 0x0F) << 4);          //送低四位数据
	CS = 0;                           //片选禁止
}

//写数据/命令
void lcd_write(uchar opra, uchar datas)
{
	if(opra == 1) {	//写命令
		lcd_wc(datas);
	} else {		//写数据
		lcd_wd(datas);
	}
}

//开启LCD显示
void lcdon(void)
{
	lcd_write(WRITE_CMD, 0x30);                        //设置为基本指令集
	lcd_write(WRITE_CMD, 0x0c);
}
//关闭LCD显示
void lcdoff(void)                       //LCD显示关闭子程序
{
	lcd_write(WRITE_CMD, 0x30);                        //设置为基本指令集
	lcd_write(WRITE_CMD, 0x08);
}

//LCD初始化
void lcd_init(void)
{
	lcd_write(WRITE_CMD, 0x33);		//发送基本指令集
	Delay5ms();
	lcd_write(WRITE_CMD, 0x30);		//发送基本指令集
	Delay5ms();
	lcd_write(WRITE_CMD, 0x30);		//发送基本指令集
	Delay5ms();
	lcd_write(WRITE_CMD, 0x0C);		//开显示,关游标,关游标位置反白
	Delay5ms();
	lcd_write(WRITE_CMD, 0x01);		//清屏
	Delay5ms();
	lcdon();
}

//字符操作区域
//12232ZB字符区域定义为:
//XPOS(0-15) 对应于第1列到第16列位置,每个字符列位置实际占位8点,总计对应128点
//由于显示只有122点,所以最后的6点不能显示出来.
//YPOS(0-1)对应于第1行到第2行,每个行位置实际占位16点,总计对应32点
void lcd_write_ddram(uchar x, uchar y, uchar *datas)
{
	if(x > 15) {
		return;
	}

	if(y > 1) {
		return;
	}

	if(y == 0) {
		lcd_write(WRITE_CMD, 0x80 + x);
	} else {
		lcd_write(WRITE_CMD, 0x90 + x);
	}

	while(*datas != '\0') {
		lcd_write(WRITE_DATA, *datas++);
	}

}

//功能:整屏显示 c 代表的ASCII字符
void char_lcd_fill(unsigned char c) 
{
	uchar x, y;

	for(y = 0; y < 2; y++) {
		if(y == 0) {
			lcd_write(WRITE_CMD, 0x80);
		} else {
			lcd_write(WRITE_CMD, 0x90);
		}

		for(x = 0; x < 15; x++) {
			lcd_write(WRITE_DATA, c);
		}
	}
}

//功能:开启绘图区域显示
void lcd_graph_on(void)
{
	lcd_write(WRITE_CMD, 0x36);							//扩充指令集,8位,开绘图
	lcd_write(WRITE_CMD, 0x30);                        //恢复为基本指令集
}
//功能:关闭绘图区域显示
void lcd_graph_off(void)                  //绘图区域显示关闭子程序
{
	lcd_write(WRITE_CMD, 0x34);							//扩充指令集,8位,关绘图
	lcd_write(WRITE_CMD, 0x30);                        //恢复为基本指令集
}

//功能:设置(GXPOS,GYPOS)对应绘图区域内部RAM指针
void g_lcd_pos(unsigned char GXPOS, unsigned char GYPOS) 
{
	lcd_write(WRITE_CMD, 0x36);                       //扩展指令集,8位,开绘图
	lcd_write(WRITE_CMD, (GYPOS + 0x80));		//Y
	lcd_write(WRITE_CMD, ((GXPOS / 16) | 0x80));//X
	lcd_write(WRITE_CMD, 0x30);                        //恢复为基本指令集
}

//功能:清除图形区域
void g_lcd_fill()
{
	unsigned char i, j;

	for(i = 0; i < 32; i++) {
		g_lcd_pos(0, i);

		for(j = 0; j < 16; j++) {
			lcd_write(WRITE_DATA, 0x00);
		}
	}
}

//功能:在(GXPOS,GYPOS)位置绘制XSIZE列及YISZE行点阵的图形*S(XSIZE仅取8的倍数,GXPOS仅取16的倍数)
void put_size_image(unsigned char GXPOS, unsigned char GYPOS, unsigned char XSIZE, unsigned char YSIZE, unsigned char code *s)
{
	unsigned char lx, ly;

	for(ly = 0; ly < YSIZE; ly++) {
		g_lcd_pos(GXPOS, GYPOS);	//设置地址

		for(lx = 0; lx < XSIZE; lx += 8) {
			lcd_write(WRITE_DATA, *s);
			s++;
		}

		GYPOS++;	//换行
	}
}
void main()
{
	DATA_PORT = 0x00;
	BK = 1;

	Delay500ms();//等待上电稳定
	lcd_init();

	while(1) {
		lcd_write_ddram(0, 0, "中国牛批666666");
		lcd_write_ddram(0, 1, "中国牛批666666");
		Delay500ms();
		Delay500ms();
		Delay500ms();
		Delay500ms();
		char_lcd_fill(' ');
		lcd_write_ddram(0, 0, "ABCDEFGHIJKLMO");
		lcd_write_ddram(0, 1, "PQRSTUVWXYZabc");
		Delay500ms();
		Delay500ms();
		Delay500ms();
		Delay500ms();
		char_lcd_fill(' ');
		lcd_graph_on();
		g_lcd_fill();
		put_size_image(0, 0, 122, 32, images);
		Delay500ms();
		Delay500ms();
		Delay500ms();
		Delay500ms();
		lcd_graph_off();
	}
}