液晶屏 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 點短接為并口。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3IwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxyMVpnTzUEVNFTS6hVMSdVYopkMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL0QTMxMDMwEjM0AjMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
由于出貨時第三腳 V0 已經通過 JP2 跳點斷開,如需要通過外部可調電阻調節,将 JP2 跳點連接配接即可。
引腳說明:
外形尺寸說明:
2、LCD12232
LCD12232 和 LCD12864 一樣,主要都是 ST7920(各種液晶廠家均有提供幾乎都是同樣規格的 LCD12232 子產品或相容子產品,基本上也都采用了相容的 IC,是以從特性上基本上是一樣的;當然,很多廠商提供了不同的字元顔色、背光色之類的顯示子產品),LCD12232 相當于是把 LCD12864 縱向截掉一半,同時橫向少了 6 個像素點。我使用的是 YB12232ZB 這款液晶屏,帶字庫,如下圖。
關于這款 LCD12232 液晶屏的串并口選擇,預設出貨為序列槽,并口通用。串 / 并口選擇必須通過短接液晶屏背面 PCB 上面絲印來選擇,S 短接為序列槽,P 點短接為并口。不能兩個同時短接!!!隻能短接其中一個!!!
序列槽引腳說明(短接 S):
并口引腳說明(短接 P):
外形尺寸說明
控制流:
3、接線圖
這裡使用 STC15W408AS(SOP20)做主要 MCU。
可通過 JP1 和 JP2 選擇液晶屏的供電電壓,3.3V 或者 5V。
可通過 JP3 确定 PSB 引腳是通過單片機 IO 控制或者直接拉高(懸空預設拉高,即并行接口,僅 LCD12864 有效)。
可通過 JP4 确定 RST 引腳是通過單片機 IO 控制或者直接拉高(低電平有效)。
可通過單片機 IO 控制液晶屏背光開關,預設開背光(低電平關背光)。
二、ST7920
1、接口時序
①、并口時序圖
寫時序圖:
讀時序圖:
②、序列槽時序圖
串行資料傳送共分三個位元組完成:
第一位元組:序列槽控制格式: 11111ABC
A 為資料傳送方向控制:H 表示資料從 LCD 到 MCU,L 表示資料從 MCU 到 LCD
B 為資料類型選擇:H 表示資料是顯示資料,L 表示資料是控制指令
C 固定為 0
第二位元組:(并行)8 位資料的高 4 位—格式 DDDD0000
第三位元組:(并行)8 位資料的低 4 位—格式 0000DDDD
串行接口時序參數:(測試條件:T=25℃ VDD=4.5V)
2、使用者指令集
1、當子產品在接受指令前,MCU 必須先确認子產品内部處于非忙碌狀态,即讀取 BF 标志時 BF 需為 0,方可接受新的指令;如果在送出一個指令前并不檢查 BF 标志,那麼在前一個指令和這個指令中間必須延遲一段較長的時間,即是等待前一個指令确實執行完成,指令執行的時間請參考指令表中的個别指令說明。
2、“RE”為基本指令集與擴充指令集的選擇控制位元,當變更“RE”位元後,往後的指令集将維持在最後的狀态,除非再次變更“RE”位元,否則使用相同指令集時,不需每次重設“RE”位元。
①、基本指令集(RE = 0)
②、擴充指令集(RE = 1)
③、具體指令介紹
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();
}
}