一、芯片介紹
AMPIRE12864圖形點陣液晶顯示器,它主要采用動態驅動原理由行驅動—控制器和列驅動器兩部分組成了128(列)×64(行)的全點陣液晶顯示。可顯示8×4個16×16點陣漢字或16×4個16×8點陣ASCII字符集,也可完成圖形的顯示。與CPU接口采用5條位控制總線和8位并行數據總線輸入輸出,具有4位/8位并行、2線或3線串行多種接口方式。
AMPIRE12864共18個引腳其中包括8個三態數據引腳,5個控制信號引腳,1個復位引腳和4個電源相關引腳。AMPIRE12864詳細引腳描述見表2-7。
表2-7 AMPIRE12864詳細引腳描述
引腳號
|
引腳名稱
|
級 別
|
引腳功能描述
|
3
|
GND
|
0V
|
電源地
|
4
|
VCC
|
+5V
|
電源電壓
|
5
|
V0
|
0~-10V
|
LCD驅動負電壓,要求VDD-VLCD=13V
|
6
|
RS
|
H/L
|
寄存器選擇信號
|
7
|
R/W
|
H/L
|
讀/寫操作選擇信號
|
8
|
E
|
H/L
|
使能信號
|
9
|
DB0
|
H/L
|
八位三態并行數據總線
|
10
|
DB1
|
||
11
|
DB2
|
||
12
|
DB3
|
||
13
|
DB4
|
||
14
|
DB5
|
||
15
|
DB6
|
||
16
|
DB7
|
||
1
|
CS1
|
H/L
|
片選信號,當CS1=H時,液晶左半屏顯示
|
2
|
CS2
|
H/L
|
片選信號,當CS2=H時,液晶右半屏顯示
|
17
|
/RST
|
H/L
|
復位信號,低電平有效
|
18
|
Vout
|
-10V
|
輸出-10V的負電壓(單電源供電)
|
AMPIRE12864引腳圖如圖2-7所示。
圖2-7 AMPIRE12864引腳圖
1)AMPIRE12864液晶顯示器主要硬件構成
AMPIRE12864液晶顯示器主要包括以下幾個硬件模塊:
① 顯示數據RAM(DDRAM)
DDRAM(64×8×8 bits)是存儲圖形顯示數據的。此RAM的每一位數據對應顯示面板上一個點的顯示(數據為H)與不顯示(數據為L)。DDRAM的地址與顯示位置關系對照如表2-8所示。
表2-8 DDRAM的地址與顯示位置關系對照圖
CS2=1
|
CS1=1
|
||||||||
Y=
|
0
|
1
|
……
|
63
|
0
|
1
|
……
|
63
|
行號
|
X=0
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
0
7
|
……
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
8
56
|
X=7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
DB0
DB7
|
57
63
|
② I/O緩沖器(DB0~DB7)
I/O緩沖器為雙向三態數據緩沖器。是LCM(液晶顯示模塊)內部總線與MPU總線的結合部。其作用是將兩個不同時鐘下工作的系統連接起來,實現通訊。I/O緩沖器在片選信號/CS有效狀態下,I/O緩沖器開放,實現LCM(液晶顯示模塊)與MPU之間的數據傳遞。當片選信號為無效狀態時,I/O緩沖器將中斷LCM(液晶顯示模塊)內部總線與MPU數據總線的聯系,對外總線呈高阻狀態,從而不影響MPU的其它數據操作功能。
③ 輸入寄存器
輸入寄存器用于接收在MPU運行速度下傳送給LCM(液晶顯示模塊)的數據并將其鎖存在輸入寄存器內,其輸出將在LCM(液晶顯示模塊)內部工作時鐘的運作下將數據寫入指令寄存器或顯示存儲器內。
④ 輸出寄存器
輸出寄存器用于暫存從顯示存儲器讀出的數據,在MPU讀操作時,輸出寄存器將當前鎖存的數據通過I/O緩沖器送入MPU數據總線上。
⑤ 指令寄存器
指令寄存器用于接收MPU發來的指令代碼,通過譯碼將指令代碼置入相關的寄存器或觸發器內。
⑥ 狀態字寄存器
狀態字寄存器是LCM(液晶顯示模塊)與MPU通訊時唯一的“握手”信號。狀態字寄存器向MPU表示了LCM(液晶顯示模塊)當前的工作狀態。尤其是狀態字中的“忙”標志位是MPU在每次對LCM(液晶顯示模塊)訪問時必須要讀出判別的狀態位。當處于“忙”標志位時,I/O緩沖器被封鎖,此時MPU對LCM(液晶顯示模塊)的任何操作(除讀狀態字操作外)都將是無效的。
⑦ X地址寄存器
X地址寄存器是一個三位頁地址寄存器,其輸出控制著DDRAM中8個頁面的選擇,也是控制著數據傳輸通道的八選一選擇器。X地址寄存器可以由MPU以指令形式設置。X地址寄存器沒有自動修改功能,所以要想轉換頁面需要重新設置X地址寄存器的內容。
⑧ Y地址計數器
Y地址計數器是一個6位循環加一計數器。它管理某一頁面上的64個單元。Y地址計數器可以由MPU以指令形式設置,它和頁地址指針結合唯一選通顯示存儲器的一個單元,Y地址計數器具有自動加一功能。在顯示存儲器讀/寫操作后Y地址計數將自動加一。當計數器加至3FH后循環歸零再繼續加一。
2) AMPIRE12864液晶顯示器控制接口信號說明
AMPIRE12864液晶顯示器共有5個控制引腳,對應5個控制信號。它們分別是寄存器選擇信號RS,讀寫控制信號R/W,使能信號E,左屏片選信號CS1,右屏片選信號CS2。下面通過幾個表格來詳細說明這些控制信號的作用。
RS,R/W的配合選擇決定讀寫方式的4種模式,如表2-9。
表2-9 RS,R/W的配合選擇決定讀寫方式的4種模式
RS信號
|
R/W信號
|
功能說明
|
L
|
L
|
MPU寫指令到指令暫存器(IR)
|
L
|
H
|
讀出忙標志(BF)及地址記數器(AC)的狀態
|
H
|
L
|
MPU寫入數據到數據暫存器(DR)
|
H
|
H
|
MPU從數據暫存器(DR)中讀出數據
|
使能信號E控制方式見表2-10。
表2-10 使能信號E控制方式
E狀態
|
執行動作
|
功能
|
高——>低
|
I/O緩沖——> DDRAM
|
配合R/W寫數據或指令
|
高
|
DDRAM——>I/O緩沖
|
配合RS進行讀數據或指令
|
低——>高
|
無動作
|
|
3) AMPIRE12864液晶顯示器指令說明
AMPIRE12864液晶顯示器的寄存器選擇信號RS,讀寫控制信號R/W與8位三態數據口輸入輸出的控制代碼的不同組合就組成了不同的控制指令,這些指令控制液晶顯示器完成各種操作。下面就用一個表格對這些指令做出詳細的說明,如表2-11所示。
表2-11 AMPIRE12864液晶顯示器指令說明
指令
|
指令碼
|
功能
|
|||||||||
RS
|
R/W
|
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
||
清除
顯示
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
將DDRAM填滿"20H",并且設定DDRAM的地址計數器(AC)到"00H"
|
地址
歸位
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
X
|
設定DDRAM的地址計數器(AC)到"00H",并且將游標移到開頭原點位置;這個指令不改變DDRAM 的內容
|
顯示狀態開/關
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
D
|
C
|
B
|
D=1: 整體顯示 ON
C=1: 游標ON
B=1:游標位置反白允許
|
進入點
設定
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
I/D
|
S
|
指定在數據的讀取與寫入時,設定游標的移動方向及指定顯示的移位
|
游標或顯示移位控制
|
0
|
0
|
0
|
0
|
0
|
1
|
S/C
|
R/L
|
X
|
X
|
設定游標的移動與顯示的移位控制位;這個指令不改變DDRAM 的內容
|
功能
設定
|
0
|
0
|
0
|
0
|
1
|
DL
|
X
|
RE
|
X
|
X
|
DL=0/1:4/8位數據
RE=1: 擴充指令操作
RE=0: 基本指令操作
|
設定DDRAM列地址
|
0
|
0
|
1
|
0
|
AC5
|
AC4
|
AC3
|
AC2
|
AC1
|
AC0
|
設定DDRAM 列地址(Y地址)
第一行:80H-87H
第二行:90H-97H
|
設定DDRAM行地址
|
0
|
0
|
0
|
1
|
1
|
1
|
1
|
P2
|
P1
|
P0
|
設定DDRAM頁面地址(X地址)
|
讀取忙標志和地址
|
0
|
1
|
BF
|
AC6
|
AC5
|
AC4
|
AC3
|
AC2
|
AC1
|
AC0
|
讀取忙標志(BF)可以確認內部動作是否完成,同時可以讀出地址計數器(AC)的值
|
寫數據到RAM
|
1
|
0
|
數據
|
將數據D7——D0寫入到內部的RAM
|
|||||||
讀出RAM值
|
1
|
1
|
數據
|
從內部RAM讀取數據D7——D0
|
二、驅動程序源碼分析
接口定義:ucharxdata DB _at_ 0x3fff;//定義地址為3fffh的擴展口為AMPIRE12864的三態數據輸入口,當然可根據自己具體情況定義;
uchar xdata CS _at_0x5fff;//定義地址5fffh的擴展口為AMPIRE12864的左右屏選擇控制信號輸入口;
uchar xdata RSRWE _at_0x7fff;//定義地址為7fffh的擴展口為AMPIRE12864的寄存器選擇信號,讀/寫操作選擇信號和使能信號的輸入口。
1)檢測忙信號標志BF
BF標志提供內部工作情況。BF=1表示模塊在進行內部操作,此時模塊不接受外部指令和數據。BF=0時模塊為準備狀態,隨時可接受外部指令和數據。利用表2-11中的“讀取忙標志和地址”指令,可以將BF讀到DB7總線,從而檢驗模塊之工作狀態。檢測忙信號標志BF驅動函數代碼如下:
void check_busy()
{
uchar a;
RSRWE=1;//R/W=1,RS=0,E=0讀出忙標志(BF)準備
while(1)
{
RSRWE=5; //R/W=1,RS=0,E=1讀出忙標志(BF)就緒
if(!(DB&0x80))//讀取忙信號
break;//不忙跳出
RSRWE=1;
a++;
if(a>10)//防止死循環
break;
}
RSRWE=1; //R/W=1,RS=0,E=0讀出忙標志(BF)準備
}
2)寫控制命令
在AMPIRE12864的初始化,DDRAM列地址的設定和行地址的設定都是由寫控制命令來完成的。當R/W=0,RS=0時在使能信號的配合下就可以把控制命令寫入到指令暫存器(IR)。寫時序圖如圖3-5示。
圖3-5 AMPIRE12864寫時序圖
寫控制命令驅動函數代碼如下:
void write_cm(uchar command)
{
check_busy();//檢測忙信號
RSRWE=0; //R/W=0,RS=0,E=0寫控制命令準備
DB=command;//送出控制命令
RSRWE=4; //R/W=0,RS=0,E=1寫控制命令
_nop_();
_nop_();
RSRWE=0;
}
3)寫數據
當寄存器控選擇控制信號RS=0寫指令寄存器(IR)即為寫控制命令,RS=1時寫數據寄存器即為寫數據。
寫數據驅動函數代碼如下:
void write_data(uchar Data)
{
check_busy();
RSRW=2; //R/W=0,RS=1,E=0寫控數據準備
DB=Data; //送出數據
RSRW=6; //R/W=0,RS=1,E=1寫數據
_nop_();
_nop_();
RSRW=2;
}
1)設定顯示字符行列地址
在AMPIRE12864上顯示一個字符是必須先設定其行列地址,設定行列地址的操作指令見表2-11。
設定顯示字符行列地址驅動函數代碼如下:
void set_xy(uchar x,uchar y)//x為行,y為列
{
if(y>=64)//列地址大于等于64時右屏顯示
{
CS=1;
y=y-64;
}
else//列地址小于64時左屏顯示
{
CS=2;
}
write_cm(0x40|y);寫列地址
_nop_();
write_cm(0xb8|x);寫行地址
}
2)AMPIRE12864的初始化
在對AMPIRE12864操作前須初始化,對其做一些必要的設置。這些設置包括:基本指令操作設置;開顯示,關光標,不閃爍;清除顯示;光標的移動方向,DDRAM的地址計數器加1。設置的操作指令詳見表2-11。
AMPIRE12864初始化驅動函數代碼如下:
void LCD_Init()
{
write_cm (0x30);//30H--基本指令操作delayus(4);write_cm (0x0c);//開顯示,關光標,不閃爍。delayus(10);write_cm (0x01);//清除顯示delayms(10);
write_cm (0x06);//光標的移動方向左,DDRAM的地址計數器(AC)加1。
delayus(10);
}
3)AMPIRE12864顯示功能模塊
AMPIRE12864顯示功能通過函數void disp(ucharindex[4][16])實現。入口參數uchar index[4][16]為字庫索引數組,給出在指定位置顯示的字符的圖形點陣在uchar code zk[][16]中的索引地址,本系統中所有字符的圖形點陣都由字模提取軟件提取并存儲在圖形點陣數組ucharcode zk[][16]中。
在voiddisp(uchar index[4][16])調用了兩個函數:void Disp_hz(uchar R,ucharL,uchar *p)用來顯示漢字,其程序代碼如下:
void Disp_hz(uchar R,uchar L,uchar *p)
{
uchar i;
for(i=0;i<16;i++)
{
set_xy(2*R,16*L+i);//設定顯示位置
write_data(p[i]);//寫入DDRAM
set_xy(2*R+1,16*L+i);
write_data(p[i+16]);
}
}
入口參數uchar R,uchar L分別指明字符或漢字的顯示位置的行號和列號,uchar *p為圖形點陣數組的首地址指針。
voidDisp_zf(uchar R,uchar L,uchar *p)用來顯示ASCII字符,其程序代碼如下:
voidDisp_zf(uchar R,uchar L,uchar *p)
{
uchari;
for(i=0;i<8;i++)
{
set_xy(2*R,8*L+i);
write_data(p[i]);
set_xy(2*R+1,8*L+i);
write_data(p[i+8]);
}
}
入口參數uchar R,uchar L分別指明字符或漢字的顯示位置的行號和列號,uchar *p為圖形點陣數組的首地址指針。
AMPIRE12864顯示功能模塊程序代碼如下:
void disp(uchar index[4][16])
{
uchar i,j;
for(i=0;i<4;i++)
for(j=0;j<16;j++)
if(index[i][j]>14)
{
Disp_hz(i,j/2,&zk[index[i][j]][0]);//顯示漢字
j++;
}
else
Disp_zf(i,j,&zk[index[i][j]][0]);//顯示ASCII字符
}
顯示以一整屏為單位,在顯示之前應先給index[4][16]賦值以確定液晶顯示器的顯示內容。如給index[4][16]以下賦值:
index[0][2]=131;index[0][4]=133;
index[0][6]=135;index[0][8]=137;
index[0][10]=139;index[0][12]=139;
顯示的內容如圖3-6所示。
AMPIRE12864驅動程序各函數包含于頭文件12864.h中,在主函數中加入宏定義#include"12864.h"。