天天看點

液晶屏 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();
	}
}