lcd12864簡介
帶中文字庫的128X64是一種具有4位/8位并行、2線或3線串行多種接口方式,內部含有國標一級、二級簡體中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128×64,內置8192個16*16點漢字,和128個16*8點ASCII字符集。利用該模塊靈活的接口方式和簡單、方便的操作指令,可構成全中文人機交互圖形界面。可以顯示8×4行16×16點陣的漢字。也可完成圖形顯示。低電壓低功耗是其又一顯著特點。由該模塊構成的液晶顯示方案與同類型的圖形點陣液晶顯示模塊相比,不論硬件電路結構或顯示程序都要簡潔得多,且該模塊的價格也略低于相同點陣的圖形液晶模塊。
lcd12864基本特性參數
(1)低電源電壓(VDD:+3.0--+5.5V)
(2)顯示分辨率:128×64點
(3)內置漢字字庫,提供8192個16×16點陣漢字(簡繁體可選)
(4)內置128個16×8點陣字符
(5)2MHZ時鐘頻率
(6)顯示方式:STN、半透、正顯
(7)驅動方式:1/32DUTY,1/5BIAS
(8)視角方向:6點
(9)背光方式:側部高亮白色LED,功耗僅為普通LED的1/5—1/10
(10)通訊方式:串行、并口可選
(11)內置DC-DC轉換電路,無需外加負壓
(12)無需片選信號,簡化軟件設計
(13)工作溫度:0℃-+55℃,存儲溫度:-20℃-+60℃
lcd12864引腳圖及功能

1VSS-模塊的電源地
2VDD-模塊的電源正端
3V0-LCD驅動電壓輸入端
4RS(CS)H/L并行的指令/數據選擇信號;串行的片選信號
5R/W(SID)H/L并行的讀寫選擇信號;串行的數據口
6E(CLK)H/L并行的使能信號;串行的同步時鐘
7DB0H/L數據0
8DB1H/L數據1
9DB2H/L數據2
10DB3H/L數據3
11DB4H/L數據4
12DB5H/L數據5
13DB6H/L數據6
14DB7H/L數據7
15PSBH/L并/串行接口選擇:H-并行;L-串行
16NC空腳
17/RETH/L復位低電平有效
18NC空腳
19LED_A(LED+5V)背光源正極
20LED_K(LED-OV)背光源和負極
控制器接口信號說明
1、RS,R/W的配合選擇決定控制界面的4種模式:
2、E信號
●忙標志:BFBF標志提供內部工作情況.BF=1表示模塊在進行內部操作,此時模塊不接受外部指令和數據.BF=0時,模塊為準備狀態,隨時可接受外部指令和數據。利用STATUSRD指令,可以將BF讀到DB7總線,從而檢驗模塊之工作狀態。
●字型產生ROM(CGROM)字型產生ROM(CGROM)提供8192個此觸發器是用于模塊屏幕顯示開和關的控制。DFF=1為開顯示(DISPLAYON),DDRAM的內容就顯示在屏幕上,DFF=0為關顯示(DISPLAYOFF)。DFF的狀態是指令DISPLAYON/OFF和RST信號控制的。
●顯示數據RAM(DDRAM)模塊內部顯示數據RAM提供64×2個位元組的空間,最多可控制4行16字(64個字)的中文字型顯示,當寫入顯示數據RAM時,可分別顯示CGROM與CGRAM的字型;此模塊可顯示三種字型,分別是半角英數字型(16*8)、CGRAM字型及CGROM的中文字型,三種字型的選擇,由在DDRAM中寫入的編碼選擇,在0000H—0006H的編碼中(其代碼分別是0000、0002、0004、0006共4個)將選擇CGRAM的自定義字型,02H—7FH的編碼中將選擇半角英數字的字型,至于A1以上的編碼將自動的結合下一個位元組,組成兩個位元組的編碼形成中文字型的編碼BIG5(A140—D75F),GB(A1A0-F7FFH)。
●字型產生RAM(CGRAM)字型產生RAM提供圖象定義(造字)功能,可以提供四組16×16點的自定義圖象空間,使用者可以將內部字型沒有提供的圖象字型自行定義到CGRAM中,便可和CGROM中的定義一樣地通過DDRAM顯示在屏幕中。
●地址計數器AC地址計數器是用來貯存DDRAM/CGRAM之一的地址,它可由設定指令暫存器來改變,之后只要讀取或是寫入DDRAM/CGRAM的值時,地址計數器的值就會自動加一,當RS為“0”時而R/W為“1”時,地址計數器的值會被讀取到DB6——DB0中。
光標/閃爍控制電路
此模塊提供硬體光標及閃爍控制電路,由地址計數器的值來指定DDRAM中的光標或閃爍位置。
lcd12864指令說明


備注:當IC1在接受指令前,微處理器必須先確認其內部處于非忙碌狀態,即讀取BF標志時,BF需為零,方可接受新的指令;如果在送出一個指令前并不檢查BF標志,那么在前一個指令和這個指令中間必須延長一段較長的時間,即是等待前一個指令確實執行完成。
lcd12864應用舉例
1、使用前的準備:先給模塊加上工作電壓,再按照下圖的連接方法調節LCD的對比度,使其顯示出黑色的底影。此過程亦可以初步檢測LCD有無缺段現象。
2、字符顯示:帶中文字庫的128X64-0402B每屏可顯示4行8列共32個16×16點陣的漢字,每個顯示RAM可顯示1個中文字符或2個16×8點陣全高ASCII碼字符,即每屏最多可實現32個中文字符或64個ASCII碼字符的顯示。帶中文字庫的128X64-0402B內部提供128×2字節的字符顯示RAM緩沖區(DDRAM)。字符顯示是通過將字符顯示編碼寫入該字符顯示RAM實現的。根據寫入內容的不同,可分別在液晶屏上顯示CGROM(中文字庫)、HCGROM(ASCII碼字庫)及CGRAM(自定義字形)的內容。三種不同字符/字型的選擇編碼范圍為:0000~0006H(其代碼分別是0000、0002、0004、0006共4個)顯示自定義字型,02H~7FH顯示半寬ASCII碼字符,A1A0H~F7FFH顯示8192種GB2312中文字庫字形。字符顯示RAM在液晶模塊中的地址80H~9FH。字符顯示的RAM的地址與32個字符顯示區域有著一一對應的關系,其對應關系如下表所示。
3、圖形顯示
先設垂直地址再設水平地址(連續寫入兩個字節的資料來完成垂直與水平的坐標地址)
垂直地址范圍AC5.。.AC0
水平地址范圍AC3…AC0
繪圖RAM的地址計數器(AC)只會對水平地址(X軸)自動加一,當水平地址=0FH時會重新設為00H但并不會對垂直地址做進位自動加一,故當連續寫入多筆資料時,程序需自行判斷垂直地址是否需重新設定。GDRAM的坐標地址與資料排列順序如下圖:
4、應用說明
用帶中文字庫的128X64顯示模塊時應注意以下幾點:
①欲在某一個位置顯示中文字符時,應先設定顯示字符位置,即先設定顯示地址,再寫入中文字符編碼。
②顯示ASCII字符過程與顯示中文字符過程相同。不過在顯示連續字符時,只須設定一次顯示地址,由模塊自動對地址加1指向下一個字符位置,否則,顯示的字符中將會有一個空ASCII字符位置。
③當字符編碼為2字節時,應先寫入高位字節,再寫入低位字節。
④模塊在接收指令前,向處理器必須先確認模塊內部處于非忙狀態,即讀取BF標志時BF需為“0”,方可接受新的指令。如果在送出一個指令前不檢查BF標志,則在前一個指令和這個指令中間必須延遲一段較長的時間,即等待前一個指令確定執行完成。指令執行的時間請參考指令表中的指令執行時間說明。⑤“RE”為基本指令集與擴充指令集的選擇控制位。當變更“RE”后,以后的指令集將維持在最后的狀態,除非再次變更“RE”位,否則使用相同指令集時,無需每次均重設“RE”位.
lcd12864驅動程序
/****************************************************************************/
/* */
/* Copyright (c) 2012, pcwebmaster */
/* All rights reserved. */
/* */
/* Email:pcwebmaste@163.com */
/* */
/****************************************************************************/
/****************************************************************************/
/* 文件名:LCD12864.c */
/* 版 本:Version 1.0 */
/* 描 述:實現液晶和單片機的通訊協議,根據計算機發給的命令進行人機交互 */
/* 作 者:pcwebmaste */
/* 函 數: */
/* LCD12864_init */
/* LCD12864WriteCommand */
/* LCD12864WriteByte */
/* LCD12864_init */
/* LCD12864SetXY */
/* LCD12864PrintfString */
/* 歷史記錄: */
/* pcwebmaste 2008-07-10 Creat Inital version. (Version 1.0) */
/* 模塊化 2012-06-02 Creat Inital version. (Version 2.0) */
/****************************************************************************/
#include “12864.h”
#define LOW 0
#define HIGH 1
sbit wela = P2^6;
sbit dula = P2^7;
#define LCD12864_RS(x) {if((x))P3 |= 1《《LCD12864_RS_PIN;\
else P3 &=~(1《《LCD12864_RS_PIN);}//寄存器選擇輸入
#define LCD12864_RW(x) {if((x))P3 |= 1《《LCD12864_RW_PIN;\
else P3 &=~(1《《LCD12864_RW_PIN);}//液晶讀/寫控制
#define LCD12864_EN(x) {if((x))P3 |= 1《《LCD12864_EN_PIN;\
else P3 &=~(1《《LCD12864_EN_PIN);}//液晶使能控制
#define LCD12864_MD(x) {if((x))P3 |= 1《《LCD12864_MD_PIN;\
else P3 &=~(1《《LCD12864_MD_PIN);}//串/并方式控制
#define LCDWELA(x) {if((x))P2 |= 1《《6; else P2 &=~(1《《6);}
#define LCDDULA(x) {if((x))P2 |= 1《《7; else P2 &=~(1《《7);}
#define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
/*********************************************/
/* */
/* 主程序 */
/* */
/*********************************************
void main()
{
DelayNOP(); //延時
wela=LOW;
dula=LOW;
LCD12864_init(); //初始化LCD
LCD12864PrintfString(0,1,dis1);
LCD12864PrintfString(1,0,dis2);
LCD12864PrintfString(2,0,dis3);
LCD12864PrintfString(3,1,dis4);
while(1);
}
/********************************************
*函數名稱:LCD12864_init
*輸 入:無
*輸 出:lcd_busy 為1時,忙,等待。
lcd-busy 為0時,閑,可寫指令與數據
*說 明:LCD12864LCD檢查忙狀態
/*******************************************/
bit LCD1286_busy()
{
bit result;
LCD12864_RS(LOW);
LCD12864_RW(HIGH);
LCD12864_EN(HIGH);
DelayNOP();
result = (bit)(LCD12864_PORT&0x80);
LCD12864_EN(LOW);
return(result);
}
/********************************************
*函數名稱:LCD12864WriteCommand
*輸 入:ucCmd 要寫入的命令
*輸 出:無
*說 明:LCD12864 寫命令
RS=L,RW=L,E=高脈沖,D0-D7=指令碼。
********************************************/
void LCD12864WriteCommand(unsigned char ucCmd)
{
while(LCD1286_busy());
LCD12864_RS(LOW);
LCD12864_RW(LOW);
LCD12864_EN(LOW);
_nop_();
_nop_();
LCD12864_PORT = ucCmd;
DelayNOP();
LCD12864_EN(HIGH);
DelayNOP();
LCD12864_EN(LOW);
}
/********************************************
*函數名稱:LCD12864WriteByte
*輸 入:ucByte 要寫入的字節
*輸 出:無
*說 明:LCD12864 寫字節
RS=H,RW=L,E=高脈沖,D0-D7=數據。
********************************************/
void LCD12864WriteByte(unsigned char ucByte)
{
while(LCD1286_busy());
LCD12864_RS(HIGH);
LCD12864_RW(LOW);
LCD12864_EN(LOW);
LCD12864_PORT = ucByte;
DelayNOP();
LCD12864_EN(HIGH);
DelayNOP();
LCD12864_EN(LOW);
}
/********************************************
*函數名稱:LCD12864_init
*輸 入:無
*輸 出:無
*說 明:LCD12864LCD初始化設定
/*******************************************/
void LCD12864_init()
{
LCD12864_MD(HIGH); //并口方式
LCD12864WriteCommand(0x34); //擴充指令操作
LCD12864WriteCommand(0x30); //基本指令操作
LCD12864WriteCommand(0x0C); //顯示開,關光標
LCD12864WriteCommand(0x01); //清除LCD的顯示內容
}
/********************************************
*函數名稱:LCD12864SetXY
*輸 入:x 橫坐標 y 縱坐標
*輸 出:無
*說 明:LCD12864 設置坐標
********************************************/
void LCD12864SetXY(unsigned char X,unsigned char Y)
{
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
LCD12864WriteCommand(X+Y); //顯示地址
}
/********************************************
*函數名稱:LCD12864SetXY
*輸 入:x 橫坐標 y 縱坐標
*輸 出:無
*說 明:LCD12864 設置坐標
為什么這樣寫不行呢?
********************************************
void LCD12864SetXY(unsigned char x,unsigned char y)
{
switch(y)
{
case 1:
{
LCD12864WriteCommand(0x80+x);
}
break;
case 2:
{
LCD12864WriteCommand(0x90+x);
}
break;
case 3:
{
LCD12864WriteCommand(0x88+x);
}
break;
case 4:
{
LCD12864WriteCommand(0x98+x);
}
break;
default:break;
}
// LCD12864WriteCommand(x+y); //顯示地址
}
/********************************************
*函數名稱:LCD12864PrintfString
*輸 入:x 橫坐標 y 縱坐標 s字符串
*輸 出:無
*說 明:LCD12864 打印字符串
********************************************/
void LCD12864PrintfString(unsigned char x,unsigned char y,unsigned char *s)
{
LCD12864SetXY(x,y); //設置顯示坐標
while(s && *s)
{
LCD12864WriteByte(*s); //顯示逐個字符
s++;
}
}
/****************************************************************************/
/* */
/* Copyright (c) 2012, pcwebmaster */
/* All rights reserved. */
/* */
/* Email:pcwebmaste@163.com */
/* */
/****************************************************************************/
/****************************************************************************/
/* 文件名:LCD12864.c */
/* 版 本:Version 1.0 */
/* 描 述:實現液晶和單片機的通訊協議,根據計算機發給的命令進行人機交互 */
/* 作 者:pcwebmaste */
/* 函 數: */
/* LCD12864_init */
/* LCD12864WriteCommand */
/* LCD12864WriteByte */
/* LCD12864_init */
/* LCD12864SetXY */
/* LCD12864PrintfString */
/* 歷史記錄: */
/* pcwebmaste 2008-07-10 Creat Inital version. (Version 1.0) */
/* 模塊化 2012-06-02 Creat Inital version. (Version 2.0) */
/****************************************************************************/
#ifndef __12864_H__
#define __12864_H__
#include 《reg52.h》
#include 《intrins.h》
#define LCD12864_PORT P0 //數據口
#define LCD12864_RS_PIN 5
#define LCD12864_RW_PIN 6
#define LCD12864_EN_PIN 4
#define LCD12864_MD_PIN 7
unsigned char code dis1[] = {“中國昌樂是寶石”};
unsigned char code dis2[] = {“之都,西瓜之鄉!”};
unsigned char code dis3[] = {“中國昌樂寶石城”};
unsigned char code dis4[] = {“人民歡迎您!”};
/********************************************
*函數名稱:LCD12864_init
*輸 入:無
*輸 出:lcd_busy 為1時,忙,等待。
lcd-busy 為0時,閑,可寫指令與數據
*說 明:LCD12864LCD檢查忙狀態
/*******************************************/
bit LCD1286_busy();
/********************************************
*函數名稱:LCD12864WriteCommand
*輸 入:ucCmd 要寫入的命令
*輸 出:無
*說 明:LCD12864 寫命令
RS=L,RW=L,E=高脈沖,D0-D7=指令碼。
********************************************/
void LCD12864WriteCommand(unsigned char ucCmd);
/********************************************
*函數名稱:LCD12864WriteByte
*輸 入:ucByte 要寫入的字節
*輸 出:無
*說 明:LCD12864 寫字節
RS=H,RW=L,E=高脈沖,D0-D7=數據。
********************************************/
void LCD12864WriteByte(unsigned char ucByte);
/********************************************
*函數名稱:LCD12864_init
*輸 入:無
*輸 出:無
*說 明:LCD12864LCD初始化設定
/*******************************************/
void LCD12864_init();
/********************************************
*函數名稱:LCD12864SetXY
*輸 入:x 橫坐標 y 縱坐標
*輸 出:無
*說 明:LCD12864 設置坐標
********************************************/
void LCD12864SetXY(unsigned char X,unsigned char Y);
/********************************************
*函數名稱:LCD12864PrintfString
*輸 入:x 橫坐標 y 縱坐標 s字符串
*輸 出:無
*說 明:LCD12864 打印字符串
********************************************/
void LCD12864PrintfString(unsigned char x,unsigned char y,unsigned char *s);
void LCD12864PrintfData(unsigned char x,unsigned char y,unsigned char DData);
/********************************************
*函數名稱:LCD12864PrintfNum
*輸 入:add ge shi bai
*輸 出:無
*說 明:此函數不好寫成通用函數,在連續地址里
連續寫數字半角顯示。根據情況修改
********************************************/
void LCD12864PrintfNum(unsigned char add,unsigned char ge,unsigned char shi,unsigned char bai)
{
LCD12864WriteCommand(add);
LCD12864WriteByte(bai+0x30);
LCD12864WriteByte(shi+0x30);
LCD12864WriteByte(ge+0x30);
}
#endif
評論