一、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點陣型液晶顯示器顯示位置對應關系
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點陣型液晶顯示器傳送數據的模式


<3>、單片機驅動LCD12864點陣型液晶顯示器內部ST7920芯片以串行總線模式給LCD12864點陣型液晶顯示器傳送數據的時序圖
(6)、字符編碼在DDRAM中存儲的事項說明
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碼、日文字符、希臘文字符的編碼,所有的數據讀寫都是先送地址,然后進行讀寫。
3、CGRAM(Character 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字節。
//太陽 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、GDRAM(Graphic 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:圖形顯示隨機存儲器)內部數據讀寫

<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字符列表
八、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仿真電路圖