LCD12864點陣型液晶顯示器總結


一、LCD12864點陣型液晶顯示器介紹

LCD12864點陣型液晶顯示器是一種具有4 位或8 位並行、2 線或3線串行多種接口方式,內部可含有或不含有國標一級、二級簡體中文字庫的點陣型液晶顯示器。其中LCD12864點陣型液晶顯示器中128表示128列,64表示64行,總共有128x64=8192個點。常見LCD12864點陣型液晶顯示器內部控制器以ST7920芯片為主,內置了DDRAM(Data Display Ram:數據顯示隨機存儲器)、CGROM(Character Generation ROM:字符發生只讀存儲器)、CGRAM(Character Generation RAM:字符發生隨機存儲器)、GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)、HCGROM(Half height Character Generation ROM:半寬字符發生只讀存儲器)。在此分別介紹LCD12864點陣型液晶顯示器內部控制器ST7920芯片中的五種存儲器,如下所示。

1、DDRAM(Data Display Ram):數據顯示隨機存儲器,往里面寫啥,屏幕就會顯示啥。

2、CGROM(Character Generation ROM):字符發生只讀存儲器,里面存儲了2M的8192個字符(包括中文、英文字母、數字、符號、ASCII碼、日文字符、希臘文)的字模。在LCD12864點陣型液晶顯示器界面可用16(行)x16(列)點陣來顯示一個中文漢字。

3、CGRAM(Character Generation RAM):字符發生隨機存儲器,可以產生128K的字符,用於用戶自定義字符,一次可以自定義4個字符。在LCD12864點陣型液晶顯示器界面可用16(行)x16(列)點陣來顯示。

4、GDRAM(Graphic Display RAM):圖形顯示隨機存儲器,里面存儲了一塊16384個點的文字圖形區域,用於寫文字繪圖,往里面寫啥繪啥,屏幕就會顯示啥,它與DDRAM(數據顯示隨機存儲器)的區別在於,往DDRAM(數據顯示隨機存儲器)中寫的數據是字符的編碼,字符的顯示先是在CGROM(字符發生只讀存儲器)中找到字模,然后映射到屏幕上,而往GDRAM(圖形顯示隨機存儲器)中寫的數據是圖形的點陣信息,每個點用1bit來保存其顯示與否。

5、HCGROM(Half height Character Generation ROM):半寬字符發生只讀存儲器,里面存儲了16K的126個字符,就是英文字母、數字、符號。在LCD12864點陣型液晶顯示器界面可用16(行)x8(列)點陣來顯示一個英文字母或數字或符號。

6、LCD12864點陣型液晶顯示器 DDRAM(Data Display Ram:數據顯示隨機存儲器)、CGROM(Character Generation ROM:字符發生只讀存儲器)、CGRAM(Character Generation RAM:字符發生隨機存儲器) 、HCGROM(Half height Character Generation ROM:半寬字符發生只讀存儲器)各自作用:

(1)、DDRAM(Data Display Ram:數據顯示隨機存儲器):把讀到的數據(包括中文、英文字母、數字、符號、ASCII碼、日文字符、希臘文以及自定義字符)顯示到LCD12864點陣型液晶顯示器界面。

(2)、CGROM(Character Generation ROM:字符發生只讀存儲器):存儲了中文、英文字母、數字、符號、ASCII碼、日文字符、希臘文字符的字模編碼,是液晶屏出廠時被固化在控制芯片中,用戶不能改變其中的存儲內容,只能讀取調用。

(3)、CGRAM(Character Generation RAM:字符發生隨機存儲器):留給用戶存儲自定義的字模編碼。

(4)、HCGROM(Half height Character Generation ROM:半寬字符發生只讀存儲器):存儲英文字母、數字、符號的字模編碼。

7、LCD12864點陣型液晶顯示器 DDRAM(Data Display Ram:數據顯示隨機存儲器)、CGROM(Character Generation ROM:字符發生只讀存儲器)、CGRAM(Character Generation RAM:字符發生隨機存儲器) 、HCGROM(Half height Character Generation ROM:半寬字符發生只讀存儲器)之間的聯系:打個比方,CGRAM(Character Generation RAM:字符發生隨機存儲器)和CGROM(Character Generation ROM:字符發生只讀存儲器)中存儲的字模信息相當於廚房中的食品,CGRAM(Character Generation RAM:字符發生隨機存儲器)是用戶自行制作的菜餚,CGROM(Character Generation ROM:字符發生只讀存儲器)是廚房中現成的熟食,這些食品都要通過托盤轉移一下,才能送到餐桌上食用。這類似於LCD12864點陣型液晶顯示器界面要顯示字符,先從CGROM(Character Generation ROM:字符發生只讀存儲器)和CGRAM(Character Generation RAM:字符發生隨機存儲器)讀取到字模編碼,再寫入DDRAM(Data Display Ram:數據顯示隨機存儲器)中,經如上中轉以后,LCD12864點陣型液晶顯示器界面在相應位置才顯示出字符 

二、LCD12864點陣型液晶顯示器尺寸圖

三、LCD12864點陣型液晶顯示器示意圖

說明:由上圖可知,LCD12864點陣型液晶顯示器有128(列)x64(行),共有128x64=8192個點,可分左半屏(或上半屏)、右半屏(或下半屏),左半屏(或上半屏)對應DDRAM(Data Display Ram:數據顯示隨機存儲器)內存地址是80H~87H、90H~97H、A0H~A7H、B0H~B7H,右半屏(或下半屏)對應DDRAM(Data Display Ram:數據顯示隨機存儲器)內存地址是88H~8FH、98H~9FH、A8H~AFH、B8H~BFH,分四大行,每一大行有一大頁,共四大頁,每一大頁有兩小頁(小頁地址:從0xb8到0xa5),共八小頁,每一小頁有八行,共六十四行。 

四、LCD12864點陣型液晶顯示器連接原理圖 

1、第一種LCD12864點陣型液晶顯示器連接原理圖(LCD12864點陣型液晶顯示器引腳功能說明對應下面第一種LCD12864點陣型液晶顯示器引腳功能列表) 

2、第二種LCD12864點陣型液晶顯示器連接原理圖(LCD12864點陣型液晶顯示器引腳功能說明對應下面第二種LCD12864點陣型液晶顯示器引腳功能列表(常用))

五、LCD12864點陣型液晶顯示器引腳功能列表

1、第一種LCD12864點陣型液晶顯示器引腳功能列表

     管腳號

管腳名稱

電平

管腳功能描述

1

VSS

0

電源地

2

VDD

+5.0V

電源電壓

3

V0

-

液晶顯示器驅動電壓

 

 

 

 

 

 

4

 

 

 

 

 

 

RS(CS)

 

 

 

 

 

 

H/L

 

數據/指令選擇端:

 

RS ="H"=1為數據選擇端,RS ="L"= 0為命令選擇端。

 

RS =“H”= 1,表示數據輸入輸出引腳DB7∽DB0為顯示數據。

 

RS =“L”= 0,表示數據輸入輸出引腳DB7∽DB0為顯示指令數據。

 

 

 

 

 

 

 

5

 

 

 

 

 

 

R/W

 

 

 

 

 

 

H/L

 

讀/寫選擇端: 

 

R/W  =“H”= 1為讀選擇端,R/W =“L”= 0為寫選擇端。

 

R/W =“H”= 1,EN =“H”= 1,數據被讀到數據輸入輸出引腳DB7∽DB0。

 

R/W =“L”= 0,EN =“H→L”= 1→0,數據被寫到IR(指令寄存器)或DR(數據寄存器)。

 

 

 

 

 

6

 

 

 

 

EN(SCLK)

 

 

 

 

H/L

 

使能端 

 

R/W =“H”= 1,EN =“H”DDRAM數據讀到數據輸入輸出引腳DB7∽DB0。

 

R/W =“L”=  0,,EN信號下降沿鎖存數據輸入輸出引腳DB7∽DB0。

 

7

DB0

H/L

數據輸入輸出引腳

8

DB1

H/L

數據輸入輸出引腳

9

DB2

H/L

數據輸入輸出引腳

10

DB3

H/L

數據輸入輸出引腳

11

DB4

H/L

數據輸入輸出引腳

12

DB5

H/L

數據輸入輸出引腳

13

DB6

H/L

數據輸入輸出引腳

14

DB7

H/L

數據輸入輸出引腳

15

CS1

H/L

CS1 = 0,CS2 =  1,左半屏。

16

CS2

H/L

CS1 = 1,CS2 = 0,右半屏。

17

RST

H/L

復位信號,低電平復位。

18

VOUT

-10V

LCD驅動負電壓

19

LEDA

+

LED背光源正極

20

LEDB

-

LED背光源負極

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2、第二種LCD12864點陣型液晶顯示器引腳功能列表(常用)

管腳號

管腳名稱

電平

管腳功能描述

1

VSS

0

電源地

2

VDD

+5.0V

電源電壓

3

V0

-

液晶顯示器驅動電壓

 

 

 

 

4

 

 

 

 

RS(CS)

 

 

 

 

H/L

數據/指令選擇端:

RS="H"=1為數據選擇端,RS="L"=0為命令選擇端。

 

RS=“H”= 1,表示數據輸入輸出引腳DB7∽DB0為顯示數據。

 

RS=“L”= 0,表示數據輸入輸出引腳DB7∽DB0為顯示指令數據。

 

 

 

 

5

 

 

 

 

R/W

 

 

 

 

H/L

 讀/寫選擇端:

 R/W=“H”= 1為讀選擇端,R/W=“L”= 0為寫選擇端。

 

R/W=“H”= 1,EN=“H”= 1,數據被讀到數據輸入輸出引腳DB7∽DB0。

 

R/W=“L”= 0,EN=“H→L”= 1→0,數據被寫到IR(指令寄存器)或DR(數據寄存器)。 

 

 

 6

 

 

 EN(SCLK)

 

 

 H/L

 使能端 :

R/W=“H”= 1,EN=“H”DDRAM數據讀到數據輸入輸出引腳DB7∽DB0。

 

R/W=“L”= 0,,EN信號下降沿鎖存數據輸入輸出引腳DB7∽DB0。

7

DB0

H/L

數據輸入輸出引腳

8

DB1

H/L

數據輸入輸出引腳

9

DB2

H/L

數據輸入輸出引腳

10

DB3

H/L

數據輸入輸出引腳

11

DB4

H/L

數據輸入輸出引腳

12

DB5

H/L

數據輸入輸出引腳

13

DB6

H/L

數據輸入輸出引腳

14

DB7

H/L

數據輸入輸出引腳

15

PSB

H/L

H:並行,L串行。

16

NC

 

空腳

17

/RST

H/L

復位信號,低電平復位。

18

NC

 

空腳

19

LEDA

+

LED背光源正極

20

LEDB

-

LED背光源負極

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

六、LCD12864點陣型液晶顯示器讀寫操作

七、LCD12864點陣型液晶顯示器內部存儲器詳細介紹

1、DDRAM(Data Display Ram:數據顯示隨機存儲器)

(1)、DDRAM是什么?

DDRAM(Data Display Ram):數據顯示隨機存儲器

(2)、DDRAM有什么作用?

把存進來的數據顯示到LCD12864點陣型液晶顯示器界面上

(3)、DDRAM內存地址

80H、81H、82H、83H、84H、85H、86H、87H、88H、89H、8AH、8BH、8CH、8DH、8EH、8FH

90H、91H、92H、93H、94H、95H、96H、97H、98H、99H、9AH、9BH、9CH、9DH、9EH、9FH 

A0H、A1H、A2H、A3H、A4H、A5H、A6H、A7H、A8H、A9H、AAH、ABH、ACH、ADH、AEH、AFH

B0H、B1H、B2H、B3H、B4H、B5H、B6H、B7H、B8H、B9H、BAH、BBH、BCH、BDH、BEH、BFH

說明:紅色部分的DDRAM內存地址是LCD12864點陣型液晶顯示器左半屏(或上半屏)顯示數據的DDRAM內存地址,棕色部分的DDRAM內存地址是LCD12864點陣型液晶顯示器右半屏(或下半屏)顯示數據的DDRAM內存地址。一般用左半屏(或上半屏)前兩行DDRAM內存地址(即80H~87H與90H~97H)和右半屏(或下半屏)前兩行DDRAM內存地址(即88H~8FH與98H~9FH)作為LCD12864點陣型液晶顯示器顯示數據的DDRAM內存地址,如圖所示。(切記不可在左半屏(或上半屏)使用右半屏(或下半屏)顯示數據的DDRAM內存地址來顯示數據,也不可在右半屏(或下半屏)使用左半屏(或上半屏)顯示數據的DDRAM內存地址來顯示數據。)

(4)、DDRAM(Data Display Ram:數據顯示隨機存儲器)與LCD12864點陣型液晶顯示器顯示位置對應關系

<1>、DDRAM(Data Display Ram:數據顯示隨機存儲器)存儲漢字與LCD12864點陣型液晶顯示器顯示位置對應關系

說明:上圖紅色區域表示LCD12864點陣型液晶顯示器其中一個16(行)x16(列)點陣。如果DDRAM(Data Display Ram:數據顯示隨機存儲器)內存地址存儲的是漢字,那么需要使用LCD12864點陣型液晶顯示器16(行)x16(列)點陣來顯示,相當於占用LCD12864點陣型液晶顯示器一大行中一大頁里的16(行)x16(列)(結合上圖紅色區域與字符“你”來理解),即兩小頁中的16(行)x16(列)(結合上圖紅色區域與字符“你”來理解),那么半個漢字就是占用一小頁中的8(行)x16(列)(結合上圖字符“你”來理解)。由此可知:LCD12864點陣型液晶顯示器每一個16(行)x16(列)點陣分別對應着DDRAM(Data Display Ram:數據顯示隨機存儲器)每一個內存地址(如上圖紅色區域與80H所示)。

<2>、DDRAM(Data Display Ram:數據顯示隨機存儲器)存儲半寬字符(比如:英文字母、數字、符號、ASCII碼、日文字符、希臘文字符)與LCD12864點陣型液晶顯示器顯示位置對應關系

說明:上圖紅色區域表示LCD12864點陣型液晶顯示器其中一個16(行)x8(列)點陣。如果DDRAM(Data Display Ram:數據顯示隨機存儲器)內存地址存儲的是英文字母(或者是數字、符號、ASCII碼、日文字符、希臘文字符),那么需要使用LCD12864點陣型液晶顯示器16(行)x8(列)點陣來顯示,相當於占用LCD12864點陣型液晶顯示器一大行中一大頁里的16(行)x8(列)(結合上圖紅色區域與英文字母“A”來理解),即兩小頁中的16(行)x8(列)(結合上圖紅色區域與英文字母“A”來理解),那么半個英文字母就是占用一小頁中的8(行)x8(列)(結合上圖英文字母“A”來理解)。由此可知:LCD12864點陣型液晶顯示器每一個16(行)x8(列)點陣分別對應着DDRAM(Data Display Ram:數據顯示隨機存儲器)每一個內存地址(如上圖紅色區域與80H所示)。
(5)、DDRAM(Data Display Ram:數據顯示隨機存儲器)內部數據讀寫
DDRAM(Data Display Ram:數據顯示隨機存儲器)內部存儲的數據是字符的編碼,可以寫入的編碼有ASCII碼、GB2312碼、BIG5碼等。所有數據讀寫都是先取DDRAM(Data Display Ram:數據顯示隨機存儲器)內存地址,然后把數據寫到DDRAM(Data Display Ram:數據顯示隨機存儲器)內存地址上或從DDRAM(Data Display Ram:數據顯示隨機存儲器)內存地址上把數據讀出來。
<1>、單片機從LCD12864點陣型液晶顯示器內部ST7920芯片的DDRAM(Data Display Ram:數據顯示隨機存儲器)讀取數據
先寫開啟基本指令集的指令0x30,再寫DDRAM(Data Display Ram:數據顯示隨機存儲器)指定地址,然后假讀一次,之后從LCD12864點陣型液晶顯示器內部ST7920芯片的DDRAM(Data Display Ram:數據顯示隨機存儲器)指定地址上連續讀取出2個字節的數據,讀完之后地址指針自動加一,跳到下一個字的地址,若需要讀下一個字的內容,只需再執行從LCD12864點陣型液晶顯示器內部ST7920芯片的DDRAM(Data Display Ram:數據顯示隨機存儲器)指定地址上連續讀取出2個字節的數據。這里的假讀需要注意,不光是讀DDRAM需要假讀,讀其他的CGRAM、GDRAM都需要先假讀一次,之后的讀才是真讀,假讀就是讀一次數據,但不存儲該數據,也就是說送地址之后第一次讀的數據時是錯誤的,之后的數據才是正確的。(dummy為假讀)
<2>、單片機寫數據到LCD12864點陣型液晶顯示器內部ST7920芯片的DDRAM(Data Display Ram:數據顯示隨機存儲器)
先寫開啟基本指令集的指令0x30,再寫DDRAM(Data Display Ram:數據顯示隨機存儲器)指定地址,之后連續寫入2個字節的數據到LCD12864點陣型液晶顯示器內部ST7920芯片的DDRAM(Data Display Ram:數據顯示隨機存儲器)指定地址上,如下所示。
uchar code table1[]="您好啊!歡迎來到";
uchar code table2[]="電氣項目的實驗室";
uchar code table3[]="創新是我們的靈魂";
uchar code table4[]="堅持是我們的品格";
  void DDRAM()//寫隨機字符函數
{
   uchar i;
   LCD12864WriteCommand(0x30);//設置LCD12864點陣型液晶顯示器數據端口D0-D7為8位控制接口,且這8位控制接口接收基本指令操作。
   LCD12864WriteCommand(0x80);//寫自定義字符到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM第1個內存地址
      for(i=0;i<8;i++)//一個完整自定義字符占用LCD12864點陣型液晶顯示器16(行)x16(列)顯示界面,每一行占用2個字節(即16列)才顯示該行某點字符,因單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,且一個完整自定義字符占用32個字節,那么要寫完一個完整自定義字符占用的32個字節,必須分16次來寫,這就是循環16次的原由。
  {
     LCD12864WriteData(table1[i*2]);//把第一個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。
     LCD12864WriteData(table1[i*2+1]);//把第二個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。為什么乘以2?由於單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,所以要乘以2。
    }
   LCD12864WriteCommand(0x90);//寫自定義字符到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM第2個內存地址
   for(i=0;i<8;i++)//一個完整自定義字符占用LCD12864點陣型液晶顯示器16(行)x16(列)顯示界面,每一行占用2個字節(即16列)才顯示該行某點字符,因單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,且一個完整自定義字符占用32個字節,那么要寫完一個完整自定義字符占用的32個字節,必須分16次來寫,這就是循環16次的原由。
 {
    LCD12864WriteData(table2[i*2]);//把第一個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。
    LCD12864WriteData(table2[i* 2+1]);//把第二個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。為什么乘以2?由於單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,所以要乘以2。
   }
   LCD12864WriteCommand(0x88);//寫自定義字符到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM第3個內存地址
   for(i=0;i<8;i++)//一個完整自定義字符占用LCD12864點陣型液晶顯示器16(行)x16(列)顯示界面,每一行占用2個字節(即16列)才顯示該行某點字符,因單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,且一個完整自定義字符占用32個字節,那么要寫完一個完整自定義字符占用的32個字節,必須分16次來寫,這就是循環16次的原由。
 {
    LCD12864WriteData(table3[i*2]);//把第一個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。
    LCD12864WriteData(table3[i*2+1]);//把第二個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。為什么乘以2?由於單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,所以要乘以2。
   }
   LCD12864WriteCommand(0x98);//寫自定義字符到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM第4個內存地址
   for(i=0;i<8;i++)//一個完整自定義字符占用LCD12864點陣型液晶顯器16(示行)x16(列)顯示界面,每一行占用2個字節(即16列)才顯示該行某點字符,因單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,且一個完整自定義字符占用32個字節,那么要寫完一個完整自定義字符占用的32個字節,必須分16次來寫,這就是循環16次的原由。
 {
    LCD12864WriteData(table4[i*2]);//把第一個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。
    LCD12864WriteData(table4[i*2+1]);//把第二個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。為什么乘以2?由於單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,所以要乘以2。
   }
 }

(6)、單片機驅動LCD12864點陣型液晶顯示器內部ST7920芯片給LCD12864點陣型液晶顯示器傳送數據的模式

當PSB腳接高電平時,LCD12864點陣型液晶顯示器內部ST7920芯片將進入並行模式,若功能設定指令寄存器中的寄存器單元DL=1,單片機結合RS(數據/指令選擇端)、R/W(讀/寫選擇端)、EN(使能端)、D0~D7輸出輸入引腳來驅動LCD12864點陣型液晶顯示器內部ST7920芯片以8位數據形式給LCD12864點陣型液晶顯示器傳送數據,若功能設定指令寄存器中的寄存器單元DL=0,單片機結合RS(數據/指令選擇端)、R/W(讀/寫選擇端)、EN(使能端)、D0~D7輸出輸入引腳來驅動LCD12864點陣型液晶顯示器內部ST7920芯片以4位數據形式給LCD2864點陣型液晶顯示器傳送數據。當PSB腳接接低電平時,LCD12864點陣型液晶顯示器內部ST7920芯片將進入串行模式,若功能設定指令寄存器中的寄存器單元DL=1,單片機結合RS(數據/指令選擇端)、R/W(讀/寫選擇端)、EN(使能端)、D0~D7輸出輸入引腳來驅動LCD12864點陣型液晶顯示器內部ST7920芯片以8位數據形式給LCD12864點陣型液晶顯示器傳送數據,若功能設定指令寄存器中的寄存器單元DL=0,單片機結合RS(數據/指令選擇端)、R/W(讀/寫選擇端)、EN(使能端)、D0~D7輸出輸入引腳來驅動LCD12864點陣型液晶顯示器內部ST7920芯片以4位數據形式給LCD2864點陣型液晶顯示器傳送數據。
<1>、單片機驅動LCD12864點陣型液晶顯示器內部ST7920芯片以8位數據並行總線模式給LCD12864點陣型液晶顯示器傳送數據的時序圖
<2>、單片機驅動LCD12864點陣型液晶顯示器內部ST7920芯片以4位數據並行總線模式給LCD12864點陣型液晶顯示器傳送數據的時序圖

<3>、單片機驅動LCD12864點陣型液晶顯示器內部ST7920芯片以串行總線模式給LCD12864點陣型液晶顯示器傳送數據的時序圖

(6)、字符編碼在DDRAM中存儲的事項說明

<1>、每次對DDRAM的操作單位是一個字,也就是2個字節。當往DDRAM寫入數據時,首先寫地址,然后連續送入2個字節的數據,先送高字節數據,再送低字節數據。讀數據時也是如此,先寫地址,然后讀出高字節數據,再讀出低字節數據(注意:讀數據時先假讀一次)。
<2>、顯示ASCII碼半寬字符時,往每個地址送入2個字節的ASCII編碼,對應LCD12864點陣型液晶顯示器顯示位置就會顯示2個半寬字符,左邊的為高字節字符,右邊的為低字節字符。
<3>、顯示漢字時,漢字編碼的2個字節必須存儲在同一地址空間中,不能分開放在2個地址存放,否則顯示的就不是你想要的字符。每個字中的2個字節自動結合查找字模並顯示字符。所以,如果我們往一個地址中寫入的是一個漢字的2字節編碼就會正確顯示該字符,若編碼高字節存放在前一地址低字節,編碼低字節存放在后一地址高字節,顯然他們就不會結合查找字模,而是與各地址相應字節結合查找字模。

2、CGROM(Character Generation ROM:字符發生只讀存儲器)

(1)、CGROM(Character Generation ROM:字符發生只讀存儲器)是什么?

CGROM(Character Generation ROM):字符發生只讀存儲器

(2)、CGROM(Character Generation ROM:字符發生只讀存儲器)有什么作用?

將存儲的字符(包括中文、英文、數字、符號、ASCII碼、日文字符、希臘文)供給LCD12864點陣型液晶顯示器讀取到界面上顯示

(3)、CGROM(Character Generation ROM:字符發生只讀存儲器)存儲的GB字符列表

說明:CGROM(Character Generation ROM:字符發生只讀存儲器)存儲器存儲的字符列表中字符碼A140H〜D75FH為BIG5(大五碼,包括標點符號、希臘字母及特殊符號。),字符碼A1A0H〜F7FFH為GB(國標,包括中文、英文、數字、符號、ASCII碼、日文字符、希臘文)。

(4)、CGROM(Character Generation ROM:字符發生只讀存儲器)內部數據讀寫

CGROM內部存儲的數據是中文、英文、數字、符號、ASCII碼、日文字符、希臘文字符的編碼,所有的數據讀寫都是先送地址,然后進行讀寫。

<1>、單片機從LCD12864點陣型液晶顯示器內部ST7920芯片的CGROM(Character Generation ROM:字符發生只讀存儲器)讀取數據
 
<2>、單片機寫數據到LCD12864點陣型液晶顯示器內部ST7920芯片的CGROM(Character Generation ROM:字符發生只讀存儲器)
 

3、CGRAMCharacter Generation RAM:字符發生隨機存儲器)

(1)、CGRAM(Character Generation RAM:字符發生隨機存儲器)是什么?

CGRAM(Character Generation RAM):字符發生隨機存儲器

(2)、CGRAM(Character Generation RAM:字符發生隨機存儲器)有什么作用?

將存儲用戶自定義的字符供給LCD12864點陣型液晶顯示器讀取到界面上顯示

(3)、CGRAM(Character Generation RAM:字符發生隨機存儲器)存儲自定義字符地址列表

明:CGRAM(Character Generation RAM:字符發生隨機存儲器)可以自定義4個字符,分別存儲在0x40、0x50、0x60、0x70的CGRAM(Character Generation RAM:字符發生隨機存儲器)內存地址上,要在LCD12864點陣型液晶顯示器界面顯示,只需把這4個自定義字符分別對應寫進DDRAM(Data Display Ram:數據顯示隨機存儲器)內存地址0000H、0002H、 0004H、0006H即可。而上圖只在CGRAM(Character Generation RAM:字符發生隨機存儲器)中自定義2個字符的CGRAM(Character Generation RAM:字符發生隨機存儲器)空間畫出,另外還有2個。由此可以看出CGRAM((Character Generation RAM:字符發生隨機存儲器)內部自定義字符都是用16(行)x16(列)點陣來顯示,每一行使用2個字節,則一個自定義字符占用空間是32字節。

(4)、CGRAM(Character Generation RAM:字符發生隨機存儲器)內部數據讀寫
讀寫之前先寫開啟基本指令集的指令0x30,再寫地址,寫CGRAM(Character Generation RAM:字符發生隨機存儲器)的地址指令為0x40+地址,地址每次做加一變化,之后從LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM(Character Generation RAM:字符發生隨機存儲器)指定地址上連續讀取2個字節的數據或寫入2個字節的數據到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM(Character Generation RAM:字符發生隨機存儲器)指定地址上。
<1>、單片機從LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM(Character Generation RAM:字符發生隨機存儲器)讀取數據
先寫開啟基本指令集的指令0x30,再寫CGRAM(Character Generation RAM:字符發生隨機存儲器)中指定地址,然后假讀一次,接着從LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM(Character Generation RAM:字符發生隨機存儲器)指定地址上連續讀取2個字節的數據。
<2>、單片機寫數據到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM(Character Generation RAM:字符發生隨機存儲器)
先寫開啟基本指令集的指令0x30, 再寫CGRAM(Character Generation RAM:字符發生隨機存儲器)中內存首地址0x40,接着連續寫入2個字節的數據到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM(Character Generation RAM:字符發生隨機存儲器)內存地址0x40上,直到在LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM(Character Generation RAM:字符發生隨機存儲器)內存地址0x40上寫完32個字節的數據為止。例如:先寫開啟基本指令集的指令0x30,取CGRAM(Character Generation RAM:字符發生隨機存儲器)中第一個字符內存首地址0x40,再寫入2個字節的數據到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM(Character Generation RAM:字符發生隨機存儲器)內存地址0x40上,之后地址指針每次會自動加一,跳到下一行的地址,再寫入2個字節的數據到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM(Character Generation RAM:字符發生隨機存儲器)內存地址0x40上,直到在LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM(Character Generation RAM:字符發生隨機存儲器)內存地址0x40上寫完32個字節的數據為止,如下所示
//太陽
uchar code sun[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x08,0x10,0x00,0x00,0x10,0x08,0x00,0x00,0x10,0x08,0x00,0x00,0x08,0x10,0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x00};
//月亮
uchar code moon[]={0x00,0x00,0x00,0x00,0x03,0x80,0x02,0x40,0x02,0x20,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x20,0x02,0x40,0x03,0x80,0x00,0x00,0x00,0x00};
//星星
uchar code star[]={0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x80,0x00,0x00,0x54,0x54,0x20,0x08,0x08,0x20,0x02,0x80,0x12,0x90,0x08,0x20,0x20,0x08,0x00,0x00,0x00,0x00};
//
uchar code robot[]={0x07,0xE0,0x08,0x10,0x12,0x48,0x10,0x08,0x1F,0xF8,0x10,0x08,0x30,0x0C,0x50,0x0A,0x50,0x0A,0x50,0x0A,0x50,0x0A,0x5F,0xFA,0x04,0x20,0x04,0x20,0x04,0x20,0x0E,0x70};
  void CGRAM()//寫自定義字符函數
{
   uchar i;
   LCD12864WriteCommand(0x30);//設置LCD12864點陣型液晶顯示器數據端口D0-D7為8位控制接口,且這8位控制接口接收基本指令操作。
   LCD12864WriteCommand(0x40);//寫自定義字符到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM第1個內存地址
    for(i=0;i<16;i++)//一個完整自定義字符占用LCD12864點陣型液晶顯示器16(行)x16(列)顯示界面,每一行占用2個字節(即16列)才顯示該行某點字符,因單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,且一個完整自定義字符占用32個字節,那么要寫完一個完整自定義字符占用的32個字節,必須分16次來寫,這就是循環16次的原由。
  {
     LCD12864WriteData(sun[i*2]);//把第一個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。
     LCD12864WriteData(sun[i*2+1]);//把第二個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。為什么乘以2?由於單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,所以要乘以2。
    }
   LCD12864WriteCommand(0x50);//寫自定義字符到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM第2個內存地址
   for(i=0;i<16;i++)//一個完整自定義字符占用LCD12864點陣型液晶顯示器16(行)x16(列)顯示界面,每一行占用2個字節(即16列)才顯示該行某點字符,因單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,且一個完整自定義字符占用32個字節,那么要寫完一個完整自定義字符占用的32個字節,必須分16次來寫,這就是循環16次的原由。
 {
    LCD12864WriteData(moon[i*2]);//把第一個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。
    LCD12864WriteData(moon[i*2+1]);//把第二個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。為什么乘以2?由於單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,所以要乘以2。
   }
   LCD12864WriteCommand(0x60);//寫自定義字符到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM第3個內存地址
   for(i=0;i<16;i++)//一個完整自定義字符占用LCD12864點陣型液晶顯示器16(行)x16(列)顯示界面,每一行占用2個字節(即16列)才顯示該行某點字符,因單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,且一個完整自定義字符占用32個字節,那么要寫完一個完整自定義字符占用的32個字節,必須分16次來寫,這就是循環16次的原由。
 {
    LCD12864WriteData(star[i*2]);//把第一個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。
    LCD12864WriteData(star[i*2+1]);//把第二個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。為什么乘以2?由於單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,所以要乘以2。
   }
   LCD12864WriteCommand(0x70);//寫自定義字符到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM第4個內存地址
   for(i=0;i<16;i++)//一個完整自定義字符占用LCD12864點陣型液晶顯器16(示行)x16(列)顯示界面,每一行占用2個字節(即16列)才顯示該行某點字符,因單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,且一個完整自定義字符占用32個字節,那么要寫完一個完整自定義字符占用的32個字節,必須分16次來寫,這就是循環16次的原由。
 {
    LCD12864WriteData(robot[i*2]);//把第一個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。
    LCD12864WriteData(robot[i*2+1]);//把第二個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。為什么乘以2?由於單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,所以要乘以2。
   }
 }

4、GDRAMGraphic Display RAM:圖形顯示隨機存儲器)

(1)、GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)是什么?

GDRAM(Graphic Display RAM):圖形顯示隨機存儲器

(2)、GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)有什么作用?

把存進來的數據顯示到LCD12864點陣型液晶顯示器界面上

(3)、GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)坐標位址圖

說明:LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)內存地址本來可供給LCD12864點陣型液晶顯示器顯示界面繪制32行x256列的圖像,但LCD12864點陣型液晶顯示器內在結構被分成了上下兩屏顯示,上半屏(左半屏)是32行x128列,下半屏(右半屏)是32行x128列。

(4)、LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)內存地址與LCD12864點陣型液晶顯示器顯示位址對應關系

說明:LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)內存地址本來可供LCD12864點陣型液晶顯示器顯示界面繪制32行x256列的圖像,但LCD12864點陣型液晶顯示器內在結構被分成了上下兩屏顯示,上半屏(左半屏)是32行x128列,下半屏(右半屏)是32行x128列。由上圖可知:LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)內存地址把LCD12864點陣型液晶顯示器顯示界面分成兩種坐標來顯示圖像,分別是水平坐標(列地址或水平地址X)與垂直坐標(行地址或垂直地址Y)。其中水平坐標(列地址或水平地址X)范圍為:00H~15H,垂直坐標(行地址或垂直地址Y)范圍為00H~31H。因LCD12864點陣型液晶顯示器內在結構被分成了上下兩屏顯示,那么水平坐標(列地址或水平地址X)上半屏坐標范圍為:00H~07H,下半屏坐標范圍為:08H~15H,而垂直坐標(行地址或垂直地址Y)上下半屏坐標范圍一樣,都為00H~31H。並且水平坐標(列地址或水平地址X)上每一個坐標X表示16列(或16個點),而垂直坐標(行地址或垂直地址Y)上的每一個坐標Y表示1行。

說明:LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)內存地址本來可供LCD12864點陣型液晶顯示器顯示界面繪制32行x256列的圖像,但LCD12864點陣型液晶顯示器內在結構被分成了上下兩屏顯示,上半屏(左半屏)是32行x128列,下半屏(右半屏)是32行x128列。由上圖可知:LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)內存地址把LCD12864點陣型液晶顯示器顯示界面分成兩種坐標來顯示圖像,分別是水平坐標(列地址或水平地址X)與垂直坐標(行地址或垂直地址Y)。其中水平坐標(列地址或水平地址X)范圍為:00H~0FH,垂直坐標(行地址或垂直地址Y)范圍為00H~1FH。因LCD12864點陣型液晶顯示器內在結構被分成了上下兩屏顯示,那么水平坐標(列地址或水平地址X)上半屏坐標范圍為:00H~07H,下半屏坐標范圍為:08H~0FH,而垂直坐標(行地址或垂直地址Y)上下半屏坐標范圍一樣,都為00H~1FH。並且水平坐標(列地址或水平地址X)上每一個坐標X表示16列(或16個點),而垂直坐標(行地址或垂直地址Y)上的每一個坐標Y表示1行。

(5)、GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)內部數據讀寫

讀寫之前先寫開啟擴展指令集的指令0x34,再寫地址,寫GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)的地址指令為0x80+地址,地址每次做加一變化,之后從LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)指定地址上連續讀取2個字節的數據或寫入2個字節的數據到LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)指定地址上。
<1>、單片機從LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)讀取數據
先寫開啟擴展指令集的指令0x34,再寫垂直坐標(行地址或垂直地址Y),即0x80+Y,然后寫水平坐標(列地址或水平地址X),即0x80+X,且假讀一次,之后從LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)垂直坐標(行地址或垂直地址Y)和水平坐標(列地址或水平地址X)指定地址上連續讀取2個字節的數據 (先讀高字節數據,后讀低字節數據。),並且GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)的地址計數器(即AC)只會對水平坐標(列地址或水平地址X)自動加1,垂直坐標(行地址或垂直地址Y)要用數據循環寫入。 單片機從LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)讀取數據時序圖如下所示。

<2>、單片機寫數據到LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)

先寫開啟擴展指令集的指令0x34,再寫坐標【(即寫坐標指令:0x80+坐標),這里的坐標分有2個,分別是水平坐標(列地址或水平地址X)與垂直坐標(行地址或垂直地址Y)。上圖中水平坐標(列地址或水平地址X)就是00H~0FH(上半屏坐標范圍為:00H~07H,下半屏坐標范圍為:08H~0FH。),垂直坐標(行地址或垂直地址Y)就是00H~1FH垂直坐標(上下半屏坐標范圍一樣,都為00H~1FH。)】,就是先寫垂直坐標(行地址或垂直地址Y),即0x80+Y,再寫水平坐標(列地址或水平地址X),即0x80+X,之后連續寫入2個字節的數據到LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)垂直坐標(行地址或垂直地址Y)和水平坐標(列地址或水平地址X)指定地址上,並且GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)的地址計數器(即AC)只會對水平坐標(列地址或水平地址X)自動加1,而垂直坐標(行地址或垂直地址Y)要用數據循環寫入,如下所示。

第一種 

    unsigned char code image[]=
 {
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,
     0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFC,0x00,0x00,0x00,
     0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,
     0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xE0,0x00,0x00,0x00,
     0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0x00,0x00,
     0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,
     0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x00,0x00,
     0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xE0,0x00,0x00,0x00,0x00,
     0x00,0x00,0x07,0xF8,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,
     0x00,0x00,0x0F,0xF8,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x1F,0xF8,0x00,0x00,0x00,0x00,0x7F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x03,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFC,0x00,0x00,0x00,0x1F,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFE,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0x00,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0x80,0x00,0x3F,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xC0,0x01,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xE0,0x0F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xF0,0x7F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x1F,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x0F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x03,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x01,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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 ClearGDRAM()//清空GDAM內存地址上內容的函數
{
   uchar i,j;
   LCD12864WriteCommand(0x34);//設置LCD12864點陣型液晶顯示器數據端口D0-D7為8位控制接口,且這8位控制接口接收擴展指令操作。
   LCD12864WriteCommand(0x34);//設置關LCD12864點陣型液晶顯示器繪圖功能,與上面的0x34不沖突,在此表示關LCD12864點陣型液晶顯示器繪圖功能。
   for(i=0;i<32;i++)//32表示LCD12864點陣型液晶顯示器上半屏32行
 {    
    LCD12864WriteCommand(0x80+i);//設置垂直坐標(行地址或垂直地址Y)從LCD12864點陣型液晶顯示器上半屏第1行第一個位置開始 
    LCD12864WriteCommand(0x80);//設置水平坐標(列地址或水平地址X)從LCD12864點陣型液晶顯示器上半屏第1行第一個位置開始,GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)的地址計數器(即AC)只會對水平坐標(列地址或水平地址X)自動加1,垂直坐標(行地址或垂直地址Y)要用數據循環寫入。
    for(j=0;j<16;j++)//一個完整圖案占用LCD12864點陣型液晶顯示器32(行)x128(列)顯示界面,上半屏每一行占用16個字節(即128列)才顯示該行某些圖案,要寫完該行某些圖案占用的16個字節,必須分16次來寫,這就是循環16次的原由。
  {
     LCD12864WriteData(0x00);//清空GDAM內存地址上的內容
    }
  }
   for(i=0;i<32;i++)//32表示LCD12864點陣型液晶顯示器下半屏32行
 {
    LCD12864WriteCommand(0x80+i);//設置垂直坐標(行地址或垂直地址Y)從LCD12864點陣型液晶顯示器下半屏第1行第一個位置開始 
    LCD12864WriteCommand(0x88);//設置水平坐標(列地址或水平地址X)從LCD12864點陣型液晶顯示器下半屏第1行第一個位置開始,GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)的地址計數器(即AC)只會對水平坐標(列地址或水平地址X)自動加1,垂直坐標(行地址或垂直地址Y)要用數據循環寫入。
    for(j=0;j<16;j++)//一個完整圖案占用LCD12864點陣型液晶顯示器32(行)x128(列)顯示界面,上半屏每一行占用16個字節(即128列)才顯示該行某些圖案,要寫完該行某些圖案占用的16個字節,必須分16次來寫,這就是循環16次的原由。
  {
     LCD12864WriteData(0x00);//清空GDAM內存地址上的內容
    }
    }
   LCD12864WriteCommand(0x36);//設置開LCD12864點陣型液晶顯示器繪圖功能
   LCD12864WriteCommand(0x30);//設置LCD12864點陣型液晶顯示器數據端口D0-D7為8位控制接口,且這8位控制接口接收基本指令操作。
  }
  void GDRAM(uchar *address)//寫繪圖函數
{
   uchar i,j;
   LCD12864WriteCommand(0x34);//設置LCD12864點陣型液晶顯示器數據端口D0-D7為8位控制接口,且這8位控制接口接收擴展指令操作。
   LCD12864WriteCommand(0x34);//設置關LCD12864點陣型液晶顯示器繪圖功能,與上面的0x34不沖突,在此表示關LCD12864點陣型液晶顯示器繪圖功能。
   for(i=0;i<32;i++)//32表示LCD12864點陣型液晶顯示器上半屏32行
 {    
    LCD12864WriteCommand(0x80+i);//設置垂直坐標(行地址或垂直地址Y)從LCD12864點陣型液晶顯示器上半屏第1行第一個位置開始 
    LCD12864WriteCommand(0x80);//設置水平坐標(列地址或水平地址X)從LCD12864點陣型液晶顯示器上半屏第1行第一個位置開始,GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)的地址計數器(即AC)只會對水平坐標(列地址或水平地址X)自動加1,垂直坐標(行地址或垂直地址Y)要用數據循環寫入。
    for(j=0;j<16;j++)//一個完整圖案占用LCD12864點陣型液晶顯示器32(行)x128(列)顯示界面,上半屏每一行占用16個字節(即128列)才顯示該行某些圖案,要寫完該行某些圖案占用的16個字節,必須分16次來寫,這就是循環16次的原由。
  {
     LCD12864WriteData(*address);//*adress對應數組image[]中的某位數值
     address++;//adress對應數組image[]的序列
    }
   }
   for(i=0;i<32;i++)//32表示LCD12864點陣型液晶顯示器下半屏32行
 {    
    LCD12864WriteCommand(0x80+i);//設置垂直坐標(行地址或垂直地址Y)從LCD12864點陣型液晶顯示器下半屏第1行第一個位置開始 
    LCD12864WriteCommand(0x88);//設置水平坐標(列地址或水平地址X)從LCD12864點陣型液晶顯示器下半屏第1行第一個位置開始,GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)的地址計數器(即AC)只會對水平坐標(列地址或水平地址X)自動加1,垂直坐標(行地址或垂直地址Y)要用數據循環寫入。
    for(j=0;j<16;j++)//一個完整圖案占用LCD12864點陣型液晶顯示器32(行)x128(列)顯示界面,下半屏每一行占用16個字節(即128列)才顯示該行某些圖案,要寫完該行某些圖案占用的16個字節,必須分16次來寫,這就是循環16次的原由。
  {
     LCD12864WriteData(*address);//*adress對應數組image[]中的某位數值
     address++;//adress對應數組image[]的序列
    }
   }
   LCD12864WriteCommand(0x36);//設置開LCD12864點陣型液晶顯示器繪圖功能
   LCD12864WriteCommand(0x30);//設置LCD12864點陣型液晶顯示器數據端口D0-D7為8位控制接口,且這8位控制接口接收基本指令操作。
  }

第二種

    unsigned char code image[]=
 {
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFE,0x00,0x00,0x00,
     0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFC,0x00,0x00,0x00,
     0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,
     0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xE0,0x00,0x00,0x00,
     0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0x00,0x00,
     0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,
     0x00,0x00,0x01,0xF8,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xF8,0x00,0x00,0x00,0x00,
     0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xE0,0x00,0x00,0x00,0x00,
     0x00,0x00,0x07,0xF8,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,
     0x00,0x00,0x0F,0xF8,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x1F,0xF8,0x00,0x00,0x00,0x00,0x7F,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x03,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFC,0x00,0x00,0x00,0x1F,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFE,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0x00,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0x80,0x00,0x3F,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xC0,0x01,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xE0,0x0F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xF0,0x7F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x1F,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x0F,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x07,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x03,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x01,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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 ClearGDRAM()//清空GDAM內存地址上內容的函數
{
   uchar i,j,k;
   LCD12864_X=0x80;//設置水平坐標(列地址或水平地址X)從LCD12864點陣型液晶顯示器第1行第一個位置開始,GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)的地址計數器(即AC)只會對水平坐標(列地址或水平地址X)自動加1,垂直坐標(行地址或垂直地址Y)要用數據循環寫入。  
   LCD12864_Y=0x80;//設置垂直坐標(行地址或垂直地址Y)從LCD12864點陣型液晶顯示器第1行第一個位置開始  
   LCD12864WriteCommand(0x34);//設置LCD12864點陣型液晶顯示器數據端口D0-D7為8位控制接口,且這8位控制接口接收擴展指令操作。
   LCD12864WriteCommand(0x34);//設置關LCD12864點陣型液晶顯示器繪圖功能,與上面的0x34不沖突,在此表示關LCD12864點陣型液晶顯示器繪圖功能。
   for(i=0;i<2;i++)//LCD12864點陣型液晶顯示器分為上下兩屏
 {
    for(j=0;j<32;j++)//32表示LCD12864點陣型液晶顯示器上半屏或下半屏32行
  {
     LCD12864WriteCommand(LCD12864_Y+j);//設置垂直坐標(行地址或垂直地址Y)從LCD12864點陣型液晶顯示器第1行第一個位置開始  
     LCD12864WriteCommand(LCD12864_X);//設置水平坐標(列地址或水平地址X)從LCD12864點陣型液晶顯示器第1行第一個位置開始,GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)的地址計數器(即AC)只會對水平坐標(列地址或水平地址X)自動加1,垂直坐標(行地址或垂直地址Y)要用數據循環寫入。
     for(k=0;k<16;k++)//一個完整圖案占用LCD12864點陣型液晶顯示器32(行)x128(列)顯示界面,上半屏每一行占用16個字節(即128列)才顯示該行某些圖案,要寫完該行某些圖案占用的16個字節,必須分16次來寫,這就是循環16次的原由。
   {
      LCD12864WriteData(0x00);//清空GDAM內存地址上的內容
     }
   }
    LCD12864_X=0x88;//設置水平坐標(列地址或水平地址X)從LCD12864點陣型液晶顯示器下半屏第1行第一個位置開始
  }
   LCD12864WriteCommand(0x36);//設置開LCD12864點陣型液晶顯示器繪圖功能
   LCD12864WriteCommand(0x30);//設置LCD12864點陣型液晶顯示器數據端口D0-D7為8位控制接口,且這8位控制接口接收基本指令操作。 
  }
  void GDRAM(uchar *p)//寫繪圖函數
{
   uchar i,j,k;
   LCD12864_X=0x80;//設置水平坐標(列地址或水平地址X)從LCD12864點陣型液晶顯示器第1行第一個位置開始,GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)的地址計數器(即AC)只會對水平坐標(列地址或水平地址X)自動加1,垂直坐標(行地址或垂直地址Y)要用數據循環寫入。  
   LCD12864_Y=0x80;//設置垂直坐標(行地址或垂直地址Y)從LCD12864點陣型液晶顯示器第1行第一個位置開始  
   LCD12864WriteCommand(0x34);//設置LCD12864點陣型液晶顯示器數據端口D0-D7為8位控制接口,且這8位控制接口接收擴展指令操作。
   LCD12864WriteCommand(0x34);//設置關LCD12864點陣型液晶顯示器繪圖功能,與上面的0x34不沖突,在此表示關LCD12864點陣型液晶顯示器繪圖功能。
   for(i=0;i<2;i++)//LCD12864點陣型液晶顯示器分為上下兩屏
 {
    for(j=0;j<32;j++)//32表示LCD12864點陣型液晶顯示器上半屏或下半屏32行
  {
     LCD12864WriteCommand(LCD12864_Y+j);//設置垂直坐標(行地址或垂直地址Y)從LCD12864點陣型液晶顯示器第1行第一個位置開始 
     LCD12864WriteCommand(LCD12864_X);//設置水平坐標(列地址或水平地址X)從LCD12864點陣型液晶顯示器第1行第一個位置開始,GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)的地址計數器(即AC)只會對水平坐標(列地址或水平地址X)自動加1,垂直坐標(行地址或垂直地址Y)要用數據循環寫入。
     for(k=0;k<16;k++)//一個完整圖案占用LCD12864點陣型液晶顯示器32(行)x128(列)顯示界面,上半屏每一行占用16個字節(即128列)才顯示該行某些圖案,要寫完該行某些圖案占用的16個字節,必須分16次來寫,這就是循環16次的原由。
   {
      LCD12864WriteData(*p++);//*p對應數組image[]中的某位數值,而p++對應image[]中的序列。
     }
   }
    LCD12864_X=0x88;//設置水平坐標(列地址或水平地址X)從LCD12864點陣型液晶顯示器下半屏第1行第一個位置開始
  }
   LCD12864WriteCommand(0x36);//設置開LCD12864點陣型液晶顯示器繪圖功能
   LCD12864WriteCommand(0x30);//設置LCD12864點陣型液晶顯示器數據端口D0-D7為8位控制接口,且這8位控制接口接收基本指令操作。
 }

單片機寫數據到LCD12864點陣型液晶顯示器內部ST7920芯片的GDRAM(Graphic Display RAM:圖形顯示隨機存儲器)時序圖如下所示。

5、HCGROM(Half height Character Generation ROM:半寬字符發生只讀存儲器)

(1)、HCGROM是什么?

HCGROM(Half height Character Generation ROM):半寬字符發生只讀存儲器

(2)、HCGROM有什么作用?

將存儲的字符(包括英文、數字、符號)供給LCD12864點陣型液晶顯示器讀取到界面上顯示

(3)、HCGROM字符列表

(4)、HCGROM數據讀寫
 
<1>、單片機從LCD12864點陣型液晶顯示器內部ST7920芯片的HCGROM讀取數據
 
<2>、單片機寫數據到LCD12864點陣型液晶顯示器內部ST7920芯片的HCGROM
 

八、LCD12864點陣型液晶顯示器內部ST7920芯片控制指令(提供2套控制指令集,分別是基本指令和擴充指令。

1、當功能設定寄存器的寄存器單元RE=0時,LCD12864點陣型液晶顯示器內部ST7920芯片執行基本指令集,基本指令集列表如下。

說明:當LCD12864點陣型液晶顯示器內部ST7920芯片在接受指令前,微處理器必須先確認LCD12864點陣型液晶顯示器內部ST7920芯片是否處於非忙碌狀態,即讀取BF 標志時BF需為0,方可接受新的指令;如果在送出一個指令前並不檢查BF標志,那么在前一個指令和這個指令中間必須延遲一段較長的時間,即是等待前一個指令確實執行完成“RE”為基本指令集與擴充指令集的選擇控制位,當變更“RE”位后,往后的指令集將維持在最后的狀態,除非再次變更“RE”位,否則使用相同指令集時,不需每次重設“RE”位。 

(1)、清除顯示

功能:將DDRAM 填滿“20H”(空格),把DDRAM 地址計數器調整“00H”,重新進入點設定,將I/D設為“1”,光標右移,AC加1。

(2)、地址歸位

功能:把DDRAM 地址計數器調整為“00H”,光標回原點,該功能不影響顯示DDRAM。

(3)、輸入點設置

功能:設定光標移動方向,並指定整體顯示是否移動。I/D=1 ,光標右移,AC自動加1; I/D=0 ,光標左移,AC自動減1。S=1 且DDRAM為寫狀態,整體顯示移動,方向由I/D決定(I/D=1,整體左移,I/D=0,整體右移。S=0 或DDRAM 為讀狀態:整體顯示不移動。

(4)、顯示狀態開/關

功能:D=1:整體顯示ON ; D=0:整體顯示OFF。C=1: 光標顯示ON ; C=0:光標顯示OFF。B=1:光標位置反白且閃爍 ; B=0:光標位置不反白閃爍

(5)、顯示開/關設置

功能:該功能適用於以控制芯片KS0108為主的LCD12864點陣型液晶顯示器(比如:Proteus仿真電路中的AMPIRE12864點陣型液晶顯示器仿真元件)。由上圖可知:當DB0=0時,即0x3E,關顯示;當DB0=1時,即0x3F,開顯示,讓LCD12864點陣型液晶顯示器顯示內容。

(6)、顯示起始行設置

功能:該功能適用於以控制芯片KS0108為主的LCD12864點陣型液晶顯示器(比如:Proteus仿真電路中的AMPIRE12864點陣型液晶顯示器仿真元件)。由上圖可知:DDRAM(Data Display Ram:數據顯示隨機存儲器)起始行地址是0xC0,對應LCD12864點陣型液晶顯示器第0小行,而DDRAM(Data Display Ram:數據顯示隨機存儲器)終止行地址是0xFF,對應LCD12864點陣型液晶顯示器第63小行,由此可知:DDRAM(Data Display Ram:數據顯示隨機存儲器)設置行地址范圍為:0xC0-0xFF,分別對應着LCD12864點陣型液晶顯示器第0小行到第63小行。 

(7)、頁地址(X地址)設置

功能:該功能適用於以控制芯片KS0108為主的LCD12864點陣型液晶顯示器(比如:Proteus仿真電路中的AMPIRE12864點陣型液晶顯示器仿真元件)。由上圖可知:DDRAM(Data Display Ram:數據顯示隨機存儲器)首頁地址(X地址)是0xB8,對應LCD12864點陣型液晶顯示器第0頁(或第0小頁),而DDRAM(Data Display Ram:數據顯示隨機存儲器)終止頁地址是0xBF,對應LCD12864點陣型液晶顯示器第7頁(或第7小頁),由此可知:DDRAM(Data Display Ram:數據顯示隨機存儲器)設置頁地址范圍為:0xB8-0xBF,分別對應着LCD12864點陣型液晶顯示器第0頁(第0小頁)到第7頁(第7小頁)  

(8)、列地址(Y地址)設置

功能:該功能適用於以控制芯片KS0108為主的LCD12864點陣型液晶顯示器(比如:Proteus仿真電路中的AMPIRE12864點陣型液晶顯示器仿真元件)。由上圖可知:DDRAM(Data Display Ram:數據顯示隨機存儲器)首列地址(X地址)是0x40,對應LCD12864點陣型液晶顯示器第0小列,而DDRAM(Data Display Ram:數據顯示隨機存儲器)終止列地址是0x7F,對應LCD12864點陣型液晶顯示器第63小列,由此可知:DDRAM(Data Display Ram:數據顯示隨機存儲器)設置列地址范圍為:0x40-0x7F,分別對應着LCD12864點陣型液晶顯示器第0小列到第63小列。  

(9)、光標或顯示移位顯示控制

功能:S/C:光標左/右移動,AC減/加1。R/L:整體顯示左/右移動,光標跟隨移動,AC值不變。

(10)、功能設定

功能:DL=1: 8位控制接口; DL=0: 4位控制接口。RE=1: 擴充指令集動作; RE=0: 基本指令集動作。

(11)、設定CGRAM地址

功能:設定CGRAM地址到地址計數器(AC),需確定擴充指令中SR=0(卷動地址或RAM地址選擇)。

(12)、設定DDRAM地址

功能:設定DDRAM地址到地址計數器(AC) 

(13)、讀取忙碌狀態(BF)和地址

功能:讀取忙碌狀態(BF)可以確認內部動作是否完成,同時可以讀出地址計數器(AC)的值,當BF=1,表示內部忙碌中,此時不可下指令,需等BF=0時,才可下新指令。

(14)、寫數據到DDRAM/CGRAM/GDRAM

功能:單片機寫數據到LCD12864點陣型液晶顯示器內部ST7920芯片的DDRAM/CGRAM/GDRAM,每個RAM地址都要連續寫入兩個字節的數據。

(15)、從DDRAM/CGRAM/GDRAM讀取數據

功能:從LCD12864點陣型液晶顯示器內部ST7920芯片的DDRAM/CGRAM/GDRAM,當設定地址指令后,若需讀取數據時,需先執行一次空的讀數據,才會讀取到正確數據,第二次讀取時則不需要,除非又下設定地址指令。

2、當功能設定寄存器的寄存器單元RE=1時,LCD12864點陣型液晶顯示器內部ST7920芯片執行擴充指令集,擴充指令集列表如下。

說明:當LCD12864點陣型液晶顯示器內部ST7920芯片在接受指令前,微處理器必須先確認LCD12864點陣型液晶顯示器內部ST7920芯片是否處於非忙碌狀態,即讀取BF 標志時BF需為0,方可接受新的指令;如果在送出一個指令前並不檢查BF標志,那么在前一個指令和這個指令中間必須延遲一段較長的時間,即是等待前一個指令確實執行完成。“RE”為基本指令集與擴充指令集的選擇控制位,當變更“RE”位后,往后的指令集將維持在最后的狀態,除非再次變更“RE”位,否則使用相同指令集時,不需每次重設“RE”位。 

(1)、待機模式

功能:進入待機模式,執行其它命令都可終止待機模式。

(2)、設置卷動/IRAM地址功能:SR=1:允許輸入卷動地址;SR=0:允許設定CGRAM地址(基本指令)或IRAM地址(擴充指令)。

(3)、反白選擇功能:當R1,R0 初值分別為0時,選擇LCD2864點陣型液晶顯示器四行中的任一行作反白顯示,並可決定反白與否。第一次設定為反白顯示,再次設定時為正常顯示。

(4)、睡眠模式功能:

功能:SL=1:脫離睡眠模式; SL=0:進入睡眠模式。

(5)、擴充功能設定功能:DL=1:8位控制接口;DL=0:4位控制接口,RE=1:擴充指令集動作;RE=0:基本指令集動作,G=1:繪圖顯示ON; G=0:繪圖顯示OFF。 

(6)、卷動地址設定功能:SR=1: AC5~AC0 為垂直卷動地址,SR=0:AC3~AC0為 ICON RAM位址。

(7)、設定CGRAM地址功能:設定GDRAM地址到地址計數器(AC),先設垂直地址,再設水平地址,即連續寫入兩個字節的坐標地址,垂直地址范圍AC6~AC0,水平地址范圍AC3~AC0

九、不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示漢字

1、不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示漢字的單片機C語言程序

(1)、不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示漢字的整體化單片機C語言程序

#include <reg51.h>
#include"ziku.h"
#include <intrins.h> 
#define uchar unsigned char
#define uint unsigned int
#define LCD12864Data P2//自定義P2端為變量LCD12864Data
sbit CS1=P1^0;//選屏端
sbit CS2=P1^1;//選屏端 
sbit LCD12864_RS=P1^5;//數據指令端
sbit LCD12864_RW=P1^6;//讀寫端
sbit LCD12864_EN=P1^7;//使能端
//
uchar code nin[]={0x20,0x10,0x08,0xFC,0x23,0x10,0x88,0x67,0x04,0xF4,0x04,0x24,0x54,0x8C,0x00,0x00,0x40,0x30,0x00,0x77,0x80,0x81,0x88,0xB2,0x84,0x83,0x80,0xE0,0x00,0x11,0x60,0x00,};
//
uchar code hao[]={0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,};
//
uchar code a[]={0xFC,0x04,0xFC,0x00,0xFE,0x42,0xBE,0x00,0xF2,0x12,0xF2,0x02,0xFE,0x02,0x00,0x00,0x0F,0x04,0x0F,0x00,0xFF,0x10,0x0F,0x00,0x0F,0x04,0x4F,0x80,0x7F,0x00,0x00,0x00,};
//
uchar code gantanhao[]={0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
//
uchar code huan0[]={0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00,};
//
uchar code ying[]={0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00,};
//
uchar code lai[]={0x00,0x08,0x08,0x28,0xC8,0x08,0x08,0xFF,0x08,0x08,0x88,0x68,0x08,0x08,0x00,0x00,0x21,0x21,0x11,0x11,0x09,0x05,0x03,0xFF,0x03,0x05,0x09,0x11,0x11,0x21,0x21,0x00,};
//
uchar code dao[]={0x42,0x62,0x52,0x4A,0xC6,0x42,0x52,0x62,0xC2,0x00,0xF8,0x00,0x00,0xFF,0x00,0x00,0x40,0xC4,0x44,0x44,0x7F,0x24,0x24,0x24,0x20,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,};
//
uchar code zhe[]={0x40,0x40,0x42,0xCC,0x00,0x08,0x28,0x48,0x89,0x0E,0xC8,0x38,0x08,0x08,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x50,0x48,0x44,0x42,0x41,0x42,0x44,0x58,0x40,0x40,0x00,};
//
uchar code li[]={0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x40,0x40,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x44,0x40,0x40,0x00,};
//
uchar code de[]={0x00,0xF8,0x0C,0x0B,0x08,0x08,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x43,0x80,0x40,0x3F,0x00,0x00,};
//
uchar code shan[]={0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,};
//
uchar code lu[]={0x00,0x3E,0x22,0xE2,0x22,0x3E,0x00,0x10,0x88,0x57,0x24,0x54,0x8C,0x00,0x00,0x00,0x40,0x7E,0x40,0x3F,0x22,0x22,0x00,0x01,0xFE,0x42,0x42,0x42,0xFE,0x01,0x01,0x00,};
//
uchar code shi[]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
//
uchar code ba[]={0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x7E,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x00,};
//
uchar code wan[]={0x04,0x44,0x24,0x14,0x04,0x7C,0x05,0x06,0x04,0x7C,0x04,0x14,0x24,0x44,0x04,0x00,0x00,0x00,0x1D,0x15,0x15,0x15,0x15,0x15,0x15,0x55,0x95,0x57,0x30,0x00,0x00,0x00,};
//
uchar code shui[]={0x00,0x20,0x20,0x20,0xA0,0x60,0x00,0xFF,0x60,0x80,0x40,0x20,0x18,0x00,0x00,0x00,0x20,0x10,0x08,0x06,0x01,0x40,0x80,0x7F,0x00,0x01,0x02,0x04,0x08,0x10,0x10,0x00,};
//
uchar code jiu[]={0x00,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x78,0x00,};
//
uchar code lian[]={0x40,0x40,0x42,0xCC,0x00,0x04,0x44,0x64,0x5C,0x47,0xF4,0x44,0x44,0x44,0x04,0x00,0x00,0x40,0x20,0x1F,0x20,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x00,};
//
uchar code huan1[]={0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0x04,0x04,0x84,0xE4,0x1C,0x84,0x04,0x04,0x00,0x20,0x60,0x20,0x1F,0x10,0x10,0x04,0x02,0x01,0x00,0xFF,0x00,0x00,0x01,0x06,0x00,};
//
uchar code ren[]={0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x00,};
//
uchar code geng[]={0x02,0x02,0xF2,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0x00,0x80,0x80,0x87,0x4C,0x54,0x24,0x34,0x4F,0x44,0x44,0x84,0x84,0x87,0x80,0x80,0x00,};
//
uchar code mei[]={0x00,0x04,0x24,0x24,0x25,0x26,0x24,0xFC,0x24,0x26,0x25,0x24,0x24,0x04,0x00,0x00,0x81,0x89,0x89,0x49,0x49,0x29,0x19,0x0F,0x19,0x29,0x49,0x49,0x89,0x89,0x81,0x00,}; 
  void ReadBuzy()//讀忙函數
{
   P2=0x00;
   LCD12864_RS=0;
   LCD12864_RW=1;
   LCD12864_EN=1;
   while(P2 & 0x80);
   LCD12864_EN=0;
 }
  void LCD12864WriteCommand(uchar command)//寫指令函數
{
   ReadBuzy();//讀忙
   LCD12864_RS=0;
   LCD12864_RW=0;
   LCD12864Data=command;
   LCD12864_EN=1;
   _nop_();
   _nop_();
   LCD12864_EN=0;
 }
  void LCD12864WriteData(uchar value)//寫數據函數
{
   ReadBuzy();//讀忙
   LCD12864_RS=1;
   LCD12864_RW=0;
   LCD12864Data=value;
   LCD12864_EN=1;
   _nop_();
   _nop_();
   LCD12864_EN=0;
 }
  void SetPage(uchar page)//設置頁函數
{
   page=0xb8 | page;//0xb8是LCD12864點陣型液晶顯示器顯示位首頁(即第0頁)地址,共有8頁。
   LCD12864WriteCommand(page);//把頁變量寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取。
 }
  void SetLine(uchar startline)//設置顯示起始行函數
{
   startline=0xc0 | startline;//0xc0是LCD12864點陣型液晶顯示器顯示位首小行(即第0小行)地址,共有64小行。
   LCD12864WriteCommand(startline);//把小行變量寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取。
 }
  void SetColumn(uchar column)//設置列函數
{
   column=column & 0x3f;//把LCD12864點陣型液晶顯示器顯示位列數最大設定為64列
   column=0x40 | column;//0x40是LCD12864點陣型液晶顯示器顯示位首列(即第0列)地址,共有64列。
   LCD12864WriteCommand(column);//把列變量寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取。
 }
  void SetOnOff(uchar onoff)//設置顯示開關函數
{
   onoff=0x3e | onoff;//0x3e是關顯示,0x3f是開顯示。
   LCD12864WriteCommand(onoff);//把開關變量寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取。
 }
  void SelectScreen(uchar screen)//設置選屏函數
{
   switch(screen)//選屏選擇位
 {
    case 0://全屏
           CS1=0;
           CS2=0;
           break;
    case 1://左屏(或上屏)
           CS1=0;
           CS2=1;
           break;
    case 2://右屏(或下屏)
           CS1=1;
           CS2=0;
           break;
   default:
           break;

  }
 }
  void CleanScreen(uchar screen)//設置清屏函數
{
   uchar i,j;
   SelectScreen(screen);//選屏
   for(i=0;i<8;i++)//控制頁數0-7,共8頁。
 {
    SetPage(i);//設置頁數
    SetColumn(0);//設置列數
    for(j=0;j<64;j++)//控制列數0-63,共64列。
  {
     LCD12864WriteData(0x00);//把0寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取復位,即LCD12864點陣型液晶顯示器清屏。
   }
  }
 }
  void LCD12864Init()//LCD12864點陣型液晶顯示器初始化函數
{
   ReadBuzy();//讀忙
   SelectScreen(0);//選全屏
   SetOnOff(0);//關顯示
   SelectScreen(0);//選全屏
   SetOnOff(1);//開顯示
   SelectScreen(0);//選全屏
   CleanScreen(0);//清屏
   SetLine(0);//設置起始行
 }
  void Display(uchar screen ,uchar page,uchar column,uchar *p)//顯示漢字函數
{  
   uchar i;
   SelectScreen(screen);//選屏
   SetPage(page);//設置上半頁
   SetColumn(column);//設置列數
   for(i=0;i<16;i++)//控制16列的數據輸出
 {
    LCD12864WriteData(p[i]);//把指針變量p所在內存地址(由內存器分配)寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取
   }
   SetPage(page+1);//設置下半頁數
   SetColumn(column);//設置列數
   for(i=0;i<16;i++)//控制16列的數據輸出
 {
    LCD12864WriteData(p[i+16]);//把指針變量p所在內存地址(由內存器分配)寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取
   }
 }
  void main()//主函數
{
   LCD12864Init();//LCD12864點陣型液晶顯示器初始化函數
   CleanScreen(0);//設置清屏函數
   SetLine(0);//設置頁函數
   Display(1, 0, 0 * 16, nin);//左半屏,第0頁,第0列,顯示“您”。
   Display(1, 0, 1 * 16, hao);//左半屏,第0頁,第1列,顯示“好”。
   Display(1, 0, 2 * 16, a);//左半屏,第0頁,第2列,顯示“啊”。
   Display(1, 0, 3 * 16, gantanhao);//左半屏,第0頁,第3列,顯示“!”。
   Display(2, 0, 4 * 16, huan0);//右半屏,第0頁,第4列,顯示“環”。
   Display(2, 0, 5 * 16, ying);//右半屏,第0頁,第5列,顯示“迎”。
   Display(2, 0, 6 * 16, lai);//右半屏,第0頁,第6列,顯示“來”。
   Display(2, 0, 7 * 16, dao);//右半屏,第0頁,第7列,顯示“到”。

   Display(1, 2, 0 * 16, zhe);//左半屏,第2頁,第0列,顯示“這”。
   Display(1, 2, 1 * 16, li);//左半屏,第2頁,第1列,顯示“里”。
   Display(1, 2, 2 * 16, de);//左半屏,第2頁,第2列,顯示“的”。
   Display(1, 2, 3 * 16, shan);//左半屏,第2頁,第3列,顯示“山”。
   Display(2, 2, 4 * 16, lu);//右半屏,第2頁,第4列,顯示“路”。
   Display(2, 2, 5 * 16, shi);//右半屏,第2頁,第5列,顯示“十”。
   Display(2, 2, 6 * 16, ba);//右半屏,第2頁,第6列,顯示“八”。
   Display(2, 2, 7 * 16, wan);//右半屏,第2頁,第7列,顯示“彎”。

   Display(1, 4, 0 * 16, zhe);//左半屏,第4頁,第0列,顯示“這”。
   Display(1, 4, 1 * 16, li);//左半屏,第4頁,第1列,顯示“里”。
   Display(1, 4, 2 * 16, de);//左半屏,第4頁,第2列,顯示“的”。
   Display(1, 4, 3 * 16, shui);//左半屏,第4頁,第3列,顯示“水”。
   Display(2, 4, 4 * 16, lu);//右半屏,第4頁,第4列,顯示“路”。
   Display(2, 4, 5 * 16, jiu);//右半屏,第4頁,第5列,顯示“九”。
   Display(2, 4, 6 * 16, lian);//右半屏,第4頁,第6列,顯示“連”。
   Display(2, 4, 7 * 16, huan1);//右半屏,第4頁,第7列,顯示“環”。

   Display(1, 6, 0 * 16, shan);//左半屏,第6頁,第0列,顯示“山”。
   Display(1, 6, 1 * 16, mei);//左半屏,第6頁,第1列,顯示“美”。
   Display(1, 6, 2 * 16, shui);//左半屏,第6頁,第2列,顯示“水”。
   Display(1, 6, 3 * 16, mei);//左半屏,第6頁,第3列,顯示“美”。
   Display(2, 6, 4 * 16, ren);//右半屏,第6頁,第4列,顯示“人”。
   Display(2, 6, 5 * 16, geng);//右半屏,第6頁,第5列,顯示“更”。
   Display(2, 6, 6 * 16, mei);//右半屏,第6頁,第6列,顯示“美”。
   Display(2, 6, 7 * 16, a);//右半屏,第6頁,第7列,顯示“啊”。
   while(1);
 }

(2)、 不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示漢字的模塊化單片機C語言程序

 <1>、不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示漢字的模塊化單片機C語言程序.C

#include <reg51.h>
#include"ziku.h"
//#include <intrins.h> 
//#define uchar unsigned char
//#define uint unsigned int
//#define LCD12864Data P2//自定義P2端為變量LCD12864Data
//sbit CS1=P1^0;//選屏端
//sbit CS2=P1^1;//選屏端 
//sbit LCD12864_RS=P1^5;//數據指令端
//sbit LCD12864_RW=P1^6;//讀寫端
//sbit LCD12864_EN=P1^7;//使能端
////您
//uchar code nin[]={0x20,0x10,0x08,0xFC,0x23,0x10,0x88,0x67,0x04,0xF4,0x04,0x24,0x54,0x8C,0x00,0x00,0x40,0x30,0x00,0x77,0x80,0x81,0x88,0xB2,0x84,0x83,0x80,0xE0,0x00,0x11,0x60,0x00,};
////好
//uchar code hao[]={0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,};
////啊
//uchar code a[]={0xFC,0x04,0xFC,0x00,0xFE,0x42,0xBE,0x00,0xF2,0x12,0xF2,0x02,0xFE,0x02,0x00,0x00,0x0F,0x04,0x0F,0x00,0xFF,0x10,0x0F,0x00,0x0F,0x04,0x4F,0x80,0x7F,0x00,0x00,0x00,};
////!
//uchar code gantanhao[]={0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
////歡
//uchar code huan0[]={0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00,};
////迎
//uchar code ying[]={0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00,};
////來
//uchar code lai[]={0x00,0x08,0x08,0x28,0xC8,0x08,0x08,0xFF,0x08,0x08,0x88,0x68,0x08,0x08,0x00,0x00,0x21,0x21,0x11,0x11,0x09,0x05,0x03,0xFF,0x03,0x05,0x09,0x11,0x11,0x21,0x21,0x00,};
////到
//uchar code dao[]={0x42,0x62,0x52,0x4A,0xC6,0x42,0x52,0x62,0xC2,0x00,0xF8,0x00,0x00,0xFF,0x00,0x00,0x40,0xC4,0x44,0x44,0x7F,0x24,0x24,0x24,0x20,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,};
////這
//uchar code zhe[]={0x40,0x40,0x42,0xCC,0x00,0x08,0x28,0x48,0x89,0x0E,0xC8,0x38,0x08,0x08,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x50,0x48,0x44,0x42,0x41,0x42,0x44,0x58,0x40,0x40,0x00,};
////里
//uchar code li[]={0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x40,0x40,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x44,0x40,0x40,0x00,};
////的
//uchar code de[]={0x00,0xF8,0x0C,0x0B,0x08,0x08,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x43,0x80,0x40,0x3F,0x00,0x00,};
////山
//uchar code shan[]={0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,};
////路
//uchar code lu[]={0x00,0x3E,0x22,0xE2,0x22,0x3E,0x00,0x10,0x88,0x57,0x24,0x54,0x8C,0x00,0x00,0x00,0x40,0x7E,0x40,0x3F,0x22,0x22,0x00,0x01,0xFE,0x42,0x42,0x42,0xFE,0x01,0x01,0x00,};
////十
//uchar code shi[]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
////八
//uchar code ba[]={0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x7E,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x00,};
////彎
//uchar code wan[]={0x04,0x44,0x24,0x14,0x04,0x7C,0x05,0x06,0x04,0x7C,0x04,0x14,0x24,0x44,0x04,0x00,0x00,0x00,0x1D,0x15,0x15,0x15,0x15,0x15,0x15,0x55,0x95,0x57,0x30,0x00,0x00,0x00,};
////水
//uchar code shui[]={0x00,0x20,0x20,0x20,0xA0,0x60,0x00,0xFF,0x60,0x80,0x40,0x20,0x18,0x00,0x00,0x00,0x20,0x10,0x08,0x06,0x01,0x40,0x80,0x7F,0x00,0x01,0x02,0x04,0x08,0x10,0x10,0x00,};
////九
//uchar code jiu[]={0x00,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x78,0x00,};
////連
//uchar code lian[]={0x40,0x40,0x42,0xCC,0x00,0x04,0x44,0x64,0x5C,0x47,0xF4,0x44,0x44,0x44,0x04,0x00,0x00,0x40,0x20,0x1F,0x20,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x00,};
////環
//uchar code huan1[]={0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0x04,0x04,0x84,0xE4,0x1C,0x84,0x04,0x04,0x00,0x20,0x60,0x20,0x1F,0x10,0x10,0x04,0x02,0x01,0x00,0xFF,0x00,0x00,0x01,0x06,0x00,};
////人
//uchar code ren[]={0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x00,};
////更
//uchar code geng[]={0x02,0x02,0xF2,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0x00,0x80,0x80,0x87,0x4C,0x54,0x24,0x34,0x4F,0x44,0x44,0x84,0x84,0x87,0x80,0x80,0x00,};
////美
//uchar code mei[]={0x00,0x04,0x24,0x24,0x25,0x26,0x24,0xFC,0x24,0x26,0x25,0x24,0x24,0x04,0x00,0x00,0x81,0x89,0x89,0x49,0x49,0x29,0x19,0x0F,0x19,0x29,0x49,0x49,0x89,0x89,0x81,0x00,}; 
  void ReadBuzy()//讀忙函數
{
   P2=0x00;
   LCD12864_RS=0;
   LCD12864_RW=1;
   LCD12864_EN=1;
   while(P2 & 0x80);
   LCD12864_EN=0;
 }
  void LCD12864WriteCommand(uchar command)//寫指令函數
{
   ReadBuzy();//讀忙
   LCD12864_RS=0;
   LCD12864_RW=0;
   LCD12864Data=command;
   LCD12864_EN=1;
   _nop_();
   _nop_();
   LCD12864_EN=0;
 }
  void LCD12864WriteData(uchar value)//寫數據函數
{
   ReadBuzy();//讀忙
   LCD12864_RS=1;
   LCD12864_RW=0;
   LCD12864Data=value;
   LCD12864_EN=1;
   _nop_();
   _nop_();
   LCD12864_EN=0;
 }
  void SetPage(uchar page)//設置頁函數
{
   page=0xb8 | page;//0xb8是LCD12864點陣型液晶顯示器顯示位首頁(即第0頁)地址,共有8頁。
   LCD12864WriteCommand(page);//把頁變量寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取。
 }
  void SetLine(uchar startline)//設置顯示起始行函數
{
   startline=0xc0 | startline;//0xc0是LCD12864點陣型液晶顯示器顯示位首小行(即第0小行)地址,共有64小行。
   LCD12864WriteCommand(startline);//把小行變量寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取。
 }
  void SetColumn(uchar column)//設置列函數
{
   column=column & 0x3f;//把LCD12864點陣型液晶顯示器顯示位列數最大設定為64列
   column=0x40 | column;//0x40是LCD12864點陣型液晶顯示器顯示位首列(即第0列)地址,共有64列。
   LCD12864WriteCommand(column);//把列變量寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取。
 }
  void SetOnOff(uchar onoff)//設置顯示開關函數
{
   onoff=0x3e | onoff;//0x3e是關顯示,0x3f是開顯示。
   LCD12864WriteCommand(onoff);//把開關變量寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取。
 }
  void SelectScreen(uchar screen)//設置選屏函數
{
   switch(screen)//選屏選擇位
 {
    case 0://全屏
           CS1=0;
           CS2=0;
           break;
    case 1://左屏(或上屏)
           CS1=0;
           CS2=1;
           break;
    case 2://右屏(或下屏)
           CS1=1;
           CS2=0;
           break;
   default:
           break;

  }
 }
  void CleanScreen(uchar screen)//設置清屏函數
{
   uchar i,j;
   SelectScreen(screen);//選屏
   for(i=0;i<8;i++)//控制頁數0-7,共8頁。
 {
    SetPage(i);//設置頁數
    SetColumn(0);//設置列數
    for(j=0;j<64;j++)//控制列數0-63,共64列。
  {
     LCD12864WriteData(0x00);//把0寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取復位,即LCD12864點陣型液晶顯示器清屏。
   }
  }
 }
  void LCD12864Init()//LCD12864點陣型液晶顯示器初始化函數
{
   ReadBuzy();//讀忙
   SelectScreen(0);//選全屏
   SetOnOff(0);//關顯示
   SelectScreen(0);//選全屏
   SetOnOff(1);//開顯示
   SelectScreen(0);//選全屏
   CleanScreen(0);//清屏
   SetLine(0);//設置起始行
 }
  void Display(uchar screen ,uchar page,uchar column,uchar *p)//顯示漢字函數
{  
   uchar i;
   SelectScreen(screen);//選屏
   SetPage(page);//設置上半頁
   SetColumn(column);//設置列數
   for(i=0;i<16;i++)//控制16列的數據輸出
 {
    LCD12864WriteData(p[i]);//把指針變量p所在內存地址(由內存器分配)寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取
   }
   SetPage(page+1);//設置下半頁數
   SetColumn(column);//設置列數
   for(i=0;i<16;i++)//控制16列的數據輸出
 {
    LCD12864WriteData(p[i+16]);//把指針變量p所在內存地址(由內存器分配)寫入LCD12864點陣型液晶顯示器內部DDRAM(Data Display Ram:數據顯示隨機存儲器),供LCD12864點陣型液晶顯示器顯示讀取
   }
 }
  void main()//主函數
{
   LCD12864Init();//LCD12864點陣型液晶顯示器初始化函數
   CleanScreen(0);//設置清屏函數
   SetLine(0);//設置頁函數
   Display(1, 0, 0 * 16, nin);//左半屏,第0頁,第0列,顯示“您”。
   Display(1, 0, 1 * 16, hao);//左半屏,第0頁,第1列,顯示“好”。
   Display(1, 0, 2 * 16, a);//左半屏,第0頁,第2列,顯示“啊”。
   Display(1, 0, 3 * 16, gantanhao);//左半屏,第0頁,第3列,顯示“!”。
   Display(2, 0, 4 * 16, huan0);//右半屏,第0頁,第4列,顯示“環”。
   Display(2, 0, 5 * 16, ying);//右半屏,第0頁,第5列,顯示“迎”。
   Display(2, 0, 6 * 16, lai);//右半屏,第0頁,第6列,顯示“來”。
   Display(2, 0, 7 * 16, dao);//右半屏,第0頁,第7列,顯示“到”。

   Display(1, 2, 0 * 16, zhe);//左半屏,第2頁,第0列,顯示“這”。
   Display(1, 2, 1 * 16, li);//左半屏,第2頁,第1列,顯示“里”。
   Display(1, 2, 2 * 16, de);//左半屏,第2頁,第2列,顯示“的”。
   Display(1, 2, 3 * 16, shan);//左半屏,第2頁,第3列,顯示“山”。
   Display(2, 2, 4 * 16, lu);//右半屏,第2頁,第4列,顯示“路”。
   Display(2, 2, 5 * 16, shi);//右半屏,第2頁,第5列,顯示“十”。
   Display(2, 2, 6 * 16, ba);//右半屏,第2頁,第6列,顯示“八”。
   Display(2, 2, 7 * 16, wan);//右半屏,第2頁,第7列,顯示“彎”。

   Display(1, 4, 0 * 16, zhe);//左半屏,第4頁,第0列,顯示“這”。
   Display(1, 4, 1 * 16, li);//左半屏,第4頁,第1列,顯示“里”。
   Display(1, 4, 2 * 16, de);//左半屏,第4頁,第2列,顯示“的”。
   Display(1, 4, 3 * 16, shui);//左半屏,第4頁,第3列,顯示“水”。
   Display(2, 4, 4 * 16, lu);//右半屏,第4頁,第4列,顯示“路”。
   Display(2, 4, 5 * 16, jiu);//右半屏,第4頁,第5列,顯示“九”。
   Display(2, 4, 6 * 16, lian);//右半屏,第4頁,第6列,顯示“連”。
   Display(2, 4, 7 * 16, huan1);//右半屏,第4頁,第7列,顯示“環”。

   Display(1, 6, 0 * 16, shan);//左半屏,第6頁,第0列,顯示“山”。
   Display(1, 6, 1 * 16, mei);//左半屏,第6頁,第1列,顯示“美”。
   Display(1, 6, 2 * 16, shui);//左半屏,第6頁,第2列,顯示“水”。
   Display(1, 6, 3 * 16, mei);//左半屏,第6頁,第3列,顯示“美”。
   Display(2, 6, 4 * 16, ren);//右半屏,第6頁,第4列,顯示“人”。
   Display(2, 6, 5 * 16, geng);//右半屏,第6頁,第5列,顯示“更”。
   Display(2, 6, 6 * 16, mei);//右半屏,第6頁,第6列,顯示“美”。
   Display(2, 6, 7 * 16, a);//右半屏,第6頁,第7列,顯示“啊”。
   while(1);
 }

 <2>、不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示漢字的模塊化單片機C語言程序的ziku.h

#ifndef __ZIKU_H__
#define __ZIKU_H__
#include<reg51.h>
#include<intrins.h>
#define LCD12864Data P2//自定義P2端為變量LCD12864Data
#define uchar unsigned char
#define uint unsigned int
sbit CS1=P1^0;//選屏端
sbit CS2=P1^1;//選屏端 
sbit LCD12864_RS=P1^5;//數據指令端
sbit LCD12864_RW=P1^6;//讀寫端
sbit LCD12864_EN=P1^7;//使能端  
void ReadBuzy();//讀忙函數
void LCD12864WriteCommand(uchar command);//寫指令函數
void LCD12864WriteData(uchar value);//寫數據函數
void SetPage(uchar page);//設置頁函數
void SetLine(uchar startline);//設置顯示起始行函數
void SetColumn(uchar column);//設置列函數
void SetOnOff(uchar onoff);//設置顯示開關函數
void SelectScreen(uchar screen);//設置選屏函數
void CleanScreen(uchar screen);//設置清屏函數
void LCD12864Init();//LCD12864點陣型液晶顯示器初始化函數
void Display(uchar screen ,uchar page,uchar column,uchar *p);//顯示漢字函數
//
uchar code nin[]={0x20,0x10,0x08,0xFC,0x23,0x10,0x88,0x67,0x04,0xF4,0x04,0x24,0x54,0x8C,0x00,0x00,0x40,0x30,0x00,0x77,0x80,0x81,0x88,0xB2,0x84,0x83,0x80,0xE0,0x00,0x11,0x60,0x00,};
//
uchar code hao[]={0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,};
//
uchar code a[]={0xFC,0x04,0xFC,0x00,0xFE,0x42,0xBE,0x00,0xF2,0x12,0xF2,0x02,0xFE,0x02,0x00,0x00,0x0F,0x04,0x0F,0x00,0xFF,0x10,0x0F,0x00,0x0F,0x04,0x4F,0x80,0x7F,0x00,0x00,0x00,};
//
uchar code gantanhao[]={0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
//
uchar code huan0[]={0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00,};
//
uchar code ying[]={0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00,};
//
uchar code lai[]={0x00,0x08,0x08,0x28,0xC8,0x08,0x08,0xFF,0x08,0x08,0x88,0x68,0x08,0x08,0x00,0x00,0x21,0x21,0x11,0x11,0x09,0x05,0x03,0xFF,0x03,0x05,0x09,0x11,0x11,0x21,0x21,0x00,};
//
uchar code dao[]={0x42,0x62,0x52,0x4A,0xC6,0x42,0x52,0x62,0xC2,0x00,0xF8,0x00,0x00,0xFF,0x00,0x00,0x40,0xC4,0x44,0x44,0x7F,0x24,0x24,0x24,0x20,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,};
//
uchar code zhe[]={0x40,0x40,0x42,0xCC,0x00,0x08,0x28,0x48,0x89,0x0E,0xC8,0x38,0x08,0x08,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x50,0x48,0x44,0x42,0x41,0x42,0x44,0x58,0x40,0x40,0x00,};
//
uchar code li[]={0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x40,0x40,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x44,0x40,0x40,0x00,};
//
uchar code de[]={0x00,0xF8,0x0C,0x0B,0x08,0x08,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x7F,0x21,0x21,0x21,0x21,0x7F,0x00,0x00,0x00,0x43,0x80,0x40,0x3F,0x00,0x00,};
//
uchar code shan[]={0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,};
//
uchar code lu[]={0x00,0x3E,0x22,0xE2,0x22,0x3E,0x00,0x10,0x88,0x57,0x24,0x54,0x8C,0x00,0x00,0x00,0x40,0x7E,0x40,0x3F,0x22,0x22,0x00,0x01,0xFE,0x42,0x42,0x42,0xFE,0x01,0x01,0x00,};
//
uchar code shi[]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
//
uchar code ba[]={0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x7E,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x00,};
//
uchar code wan[]={0x04,0x44,0x24,0x14,0x04,0x7C,0x05,0x06,0x04,0x7C,0x04,0x14,0x24,0x44,0x04,0x00,0x00,0x00,0x1D,0x15,0x15,0x15,0x15,0x15,0x15,0x55,0x95,0x57,0x30,0x00,0x00,0x00,};
//
uchar code shui[]={0x00,0x20,0x20,0x20,0xA0,0x60,0x00,0xFF,0x60,0x80,0x40,0x20,0x18,0x00,0x00,0x00,0x20,0x10,0x08,0x06,0x01,0x40,0x80,0x7F,0x00,0x01,0x02,0x04,0x08,0x10,0x10,0x00,};
//
uchar code jiu[]={0x00,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x78,0x00,};
//
uchar code lian[]={0x40,0x40,0x42,0xCC,0x00,0x04,0x44,0x64,0x5C,0x47,0xF4,0x44,0x44,0x44,0x04,0x00,0x00,0x40,0x20,0x1F,0x20,0x44,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x00,};
//
uchar code huan1[]={0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0x04,0x04,0x84,0xE4,0x1C,0x84,0x04,0x04,0x00,0x20,0x60,0x20,0x1F,0x10,0x10,0x04,0x02,0x01,0x00,0xFF,0x00,0x00,0x01,0x06,0x00,};
//
uchar code ren[]={0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x00,};
//
uchar code geng[]={0x02,0x02,0xF2,0x92,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0x00,0x80,0x80,0x87,0x4C,0x54,0x24,0x34,0x4F,0x44,0x44,0x84,0x84,0x87,0x80,0x80,0x00,};
//
uchar code mei[]={0x00,0x04,0x24,0x24,0x25,0x26,0x24,0xFC,0x24,0x26,0x25,0x24,0x24,0x04,0x00,0x00,0x81,0x89,0x89,0x49,0x49,0x29,0x19,0x0F,0x19,0x29,0x49,0x49,0x89,0x89,0x81,0x00,};
#endif

2、不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示漢字的Proteus仿真電路圖

十、不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示圖片

 

1、不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示圖片的單片機C語言程序

 

(1)、不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示圖片的整體化單片機C語言程序

 

(2)、 不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示圖片的模塊化單片機C語言程序

 <1>、不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示圖片的模塊化單片機C語言程序.C

 

 <2>、不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示圖片的模塊化單片機C語言程序的ziku.h

2、不帶字庫的以控制芯片KS0108為主的AMPIRE12864點陣型液晶顯示器顯示圖片的Proteus仿真電路圖

 

 

 

十一、帶字庫的以控制芯片ST7920為主的LCD12864點陣型液晶顯示器顯示自定義字符

1、帶字庫的以控制芯片ST7920為主的LCD12864點陣型液晶顯示器顯示自定義字符的單片機C語言程序

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD12864Data P2//LCD12864點陣型液晶顯示器輸入輸出數據/命令端口
sbit LCD12864_RS=P0^7;//LCD12864點陣型液晶顯示器數據/命令選擇端
sbit LCD12864_RW=P0^6;//LCD12864點陣型液晶顯示器讀/寫端
sbit LCD12864_EN=P0^5;//LCD12864點陣型液晶顯示器使能端
//太陽
uchar code sun[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x08,0x10,0x00,0x00,0x10,0x08,0x00,0x00,0x10,0x08,0x00,0x00,0x08,0x10,0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x00};
//月亮
uchar code moon[]={0x00,0x00,0x00,0x00,0x03,0x80,0x02,0x40,0x02,0x20,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x10,0x02,0x20,0x02,0x40,0x03,0x80,0x00,0x00,0x00,0x00};
//星星
uchar code star[]={0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x80,0x00,0x00,0x54,0x54,0x20,0x08,0x08,0x20,0x02,0x80,0x12,0x90,0x08,0x20,0x20,0x08,0x00,0x00,0x00,0x00};
//
uchar code robot[]={0x07,0xE0,0x08,0x10,0x12,0x48,0x10,0x08,0x1F,0xF8,0x10,0x08,0x30,0x0C,0x50,0x0A,0x50,0x0A,0x50,0x0A,0x50,0x0A,0x5F,0xFA,0x04,0x20,0x04,0x20,0x04,0x20,0x0E,0x70};
  void Delay(uint i)
{
   while(--i);
 }
  void ReadBuzy()//讀忙函數
{
   P2=0x00;
   LCD12864_RS=0;
   LCD12864_RW=1;
   LCD12864_EN=1;
   while(P2 & 0x80);
   LCD12864_EN=0;
 }
  void LCD12864WriteCommand(uchar command)//寫指令函數
{
   ReadBuzy();//讀忙
   LCD12864_RS=0;
   LCD12864_RW=0;
   LCD12864_EN=1;
   LCD12864Data=command;
   Delay(100);
   LCD12864_EN=0;
 }
  void LCD12864WriteData(uchar value)//寫數據函數
{
   ReadBuzy();//讀忙
   LCD12864_RS=1;
   LCD12864_RW=0;
   LCD12864_EN=1;
   LCD12864Data=value;
   Delay(100);
   LCD12864_EN=0;
 }
  void LCD12864Init()//LCD12864點陣型液晶顯示器初始化函數
{
   ReadBuzy();//讀忙
   Delay(4000);
   LCD12864WriteCommand(0x30);//8位數據端口傳輸,且設置為基本指令集動作。
   Delay(100);
   LCD12864WriteCommand(0x30);//8位數據端口傳輸,且設置為基本指令集動作。
   Delay(37);
   LCD12864WriteCommand(0x0c);//設置整體顯示,光標、閃爍全關,不反白。
   Delay(100);
   LCD12864WriteCommand(0x01);//清屏,並且DDRAM數據指針清零。
   Delay(10000);
   LCD12864WriteCommand(0x06);//進入點設定模式,設置地址指針自動加1。
 }
  void CGRAM()//寫自定義字符函數
{
   uchar i;
   LCD12864WriteCommand(0x30);//設置LCD12864點陣型液晶顯示器數據端口D0-D7為8位控制接口,且這8位控制接口接收基本指令操作。
   LCD12864WriteCommand(0x40);//寫自定義字符到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM第1個內存地址
   for(i=0;i<16;i++)//一個完整自定義字符占用LCD12864點陣型液晶顯示器16(行)x16(列)顯示界面,每一行占用2個字節(即16列)才顯示該行某點字符,因單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,且一個完整自定義字符占用32個字節,那么要寫完一個完整自定義字符占用的32個字節,必須分16次來寫,這就是循環16次的原由。
  {
    LCD12864WriteData(sun[i*2]);//把第一個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。
    LCD12864WriteData(sun[i*2+1]);//把第二個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。為什么乘以2?由於單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,所以要乘以2。
   }
   LCD12864WriteCommand(0x50);//寫自定義字符到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM第2個內存地址
   for(i=0;i<16;i++)//一個完整自定義字符占用LCD12864點陣型液晶顯示器16(行)x16(列)顯示界面,每一行占用2個字節(即16列)才顯示該行某點字符,因單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,且一個完整自定義字符占用32個字節,那么要寫完一個完整自定義字符占用的32個字節,必須分16次來寫,這就是循環16次的原由。
 {
    LCD12864WriteData(moon[i*2]);//把第一個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。
    LCD12864WriteData(moon[i*2+1]);//把第二個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。為什么乘以2?由於單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,所以要乘以2。
   }
   LCD12864WriteCommand(0x60);//寫自定義字符到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM第3個內存地址
   for(i=0;i<16;i++)//一個完整自定義字符占用LCD12864點陣型液晶顯示器16(行)x16(列)顯示界面,每一行占用2個字節(即16列)才顯示該行某點字符,因單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,且一個完整自定義字符占用32個字節,那么要寫完一個完整自定義字符占用的32個字節,必須分16次來寫,這就是循環16次的原由。
 {
    LCD12864WriteData(star[i*2]);//把第一個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。
    LCD12864WriteData(star[i*2+1]);//把第二個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。為什么乘以2?由於單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,所以要乘以2。
   }
   LCD12864WriteCommand(0x70);//寫自定義字符到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM第4個內存地址
   for(i=0;i<16;i++)//一個完整自定義字符占用LCD12864點陣型液晶顯器16(示行)x16(列)顯示界面,每一行占用2個字節(即16列)才顯示該行某點字符,因單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,且一個完整自定義字符占用32個字節,那么要寫完一個完整自定義字符占用的32個字節,必須分16次來寫,這就是循環16次的原由。
 {
    LCD12864WriteData(robot[i*2]);//把第一個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。
    LCD12864WriteData(robot[i*2+1]);//把第二個字節的自定義字符寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,供LCD12864點陣型液晶顯示器讀取顯示。為什么乘以2?由於單片機寫數據是以寫2個字節為一次寫到LCD12864點陣型液晶顯示器內部ST7920芯片的CGRAM內存地址上,所以要乘以2。
   }
 }
  void main()//主函數
{
   LCD12864Init();//LCD12864點陣型液晶顯示器初始化函數
   CGRAM();//寫自定義字符函數
   LCD12864WriteCommand(0x98);//LCD12864點陣型液晶顯示器下半屏第二行第1個顯示位置
   LCD12864WriteData(0x00);//清空DRAM內存地址上的內容
   LCD12864WriteData(0x00);//把自定義字符寫進DDRAM內存地址0x00,供LCD12864點陣型液晶顯示器讀取顯示。
   LCD12864WriteCommand(0x99);//LCD12864點陣型液晶顯示器下半屏第二行第2個顯示位置
   LCD12864WriteData(0x00);//清空DRAM內存地址上的內容
   LCD12864WriteData(0x02);//把自定義字符寫進DDRAM內存地址0x02,供LCD12864點陣型液晶顯示器讀取顯示。
   LCD12864WriteCommand(0x9A);//LCD12864點陣型液晶顯示器下半屏第二行第3個顯示位置
   LCD12864WriteData(0x00);//清空DRAM內存地址上的內容
   LCD12864WriteData(0x04);//把自定義字符寫進DDRAM內存地址0x04,供LCD12864點陣型液晶顯示器讀取顯示。
   LCD12864WriteCommand(0x9B);//LCD12864點陣型液晶顯示器下半屏第二行第4個顯示位置
   LCD12864WriteData(0x00);//清空DRAM內存地址上的內容
   LCD12864WriteData(0x06);//把自定義字符寫進DDRAM內存地址0x06,供LCD12864點陣型液晶顯示器讀取顯示。
   while(1);//固定循環
 }

2、帶字庫的以控制芯片ST7920為主的LCD12864點陣型液晶顯示器顯示自定義字符的Proteus仿真電路圖

十二、帶字庫的以控制芯片ST7920為主的LCD12864點陣型液晶顯示器顯示圖形

 

1、帶字庫的以控制芯片ST7920為主的LCD12864點陣型液晶顯示器顯示自定義圖形的單片機C語言程序

 

2、帶字庫的以控制芯片ST7920為主的LCD12864點陣型液晶顯示器顯示自定義圖形的Proteus仿真電路圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM