|
/*------------------------------------------------------------
ST7920中文字庫液晶顯示模塊LCD12232并行8位顯示C30演示程序
C30菜鳥HotPower@126.com 2007.12.8 于雁塔菜地
-------------------------------------------------------------*/
#include "lcd.h"
unsigned char LcdRowWriteEnable[2] = {0, 0};//顯示行刷新允許標志
unsigned char LcdBuffer[2][15];//LCD顯示緩沖區(2行15個字符)
unsigned char LcdRow = 0, LcdCol = 0;//虛擬光標
void LcdInit(void)//LCD初始化
{
LcdIOInit();//LCD管腳初始化
LcdClearBuffer();//清空LCD顯示緩沖區
// LcdWriteCommand(0x20);//發送功能設定控制命令(4位)
LcdWriteCommand(0x30);//發送功能設定控制命令(8位)
LcdWriteCommand(0x02);//發送位址歸位命令,設定DDRAM位址計數器為0
LcdWriteCommand(0x04);//發送進入點命令
LcdWriteCommand(0x0c);//發送開顯示關光標命令
LcdWriteCommand(0x01);//發送清除顯示命令
LcdWriteCommand(0x80);//發送設定DDRAM地址0x00命令,光標定位到(0,0)
/*----------------------------------------------------------------------
LcdWriteCommand(0x30);//發送功能設定控制命令(8位)
LcdWriteCommand(0x30);//發送功能設定控制命令(8位)
LcdWriteCommand(0x30);//發送功能設定控制命令(8位)
LcdWriteCommand(0x01);//發送清除顯示命令
LcdWriteCommand(0x06);//發送進入點命令0x06
LcdWriteCommand(0x0a);//發送開關顯示關光標命令
LcdWriteCommand(0x0c);//發送開顯示關光標命令
LcdWriteCommand(0x02);//發送位址歸位命令,設定DDRAM位址計數器為0
LcdWriteCommand(0x17);//游標或顯示移位控制
LcdWriteCommand(0x80);//發送設定DDRAM地址0x00命令,光標定位到(0,0)
----------------------------------------------------------------------*/
LCD_BK = 0;//打開背光
}
void LcdIOInit(void)//LCD管腳初始化
{
LCD_BK = 0;//打開背光
LCD_E = 0;//不使能
LCD_RW = 1;//寫讀數據
TRIS_E = PORTOUTMODE;//定義E為輸出IO
TRIS_RW = PORTOUTMODE;//定義RW為輸出IO
TRIS_RS = PORTOUTMODE;//定義RS為輸出IO
TRIS_BK = PORTOUTMODE;//定義BK為輸出IO
TRIS_DATA = 0;//定義RE0~RE7為輸出IO
}
void LcdWriteCommand(unsigned char Command)//寫LCD命令字
{
LCD_RS = 0;//命令
Nop();
LCD_RW = 0;//寫命令
Nop();
LCD_E = 1;//使能
Nop();
LCD_BUS = Command;//發送8位命令
Nop();
LCD_E = 0;//不使能,讀出數據 打入命令
Nop();
LCD_RW = 1;//寫命令結束
if (Command == 0x01)//清除顯示命令,需要等待時間相對較長
{
_delay_loop(1600);//st7920要求等待1.6mS
}
else
{
_delay_loop(72);//st7920要求等待72uS
}
}
void LcdWriteData(unsigned char data)//寫LCD顯示數據
{
LCD_RS = 1;//數據
Nop();
LCD_RW = 0;//寫數據
Nop();
LCD_E = 1;//使能
Nop();
LCD_BUS = data;//發送8位數據
Nop();
LCD_E = 0;//不使能,打入數據
Nop();
LCD_RW = 1;//寫數據結束
_delay_loop(72);//st7920要求等待72uS
}
void LcdWaitBusy(void)//LCD忙標志測試(有時死機,故沒用)
{
TRIS_DATA = 0xff;//定義RE0~RE7為輸入IO
LCD_BUS = 0xff;
Nop();
LCD_RS = 0;//命令
Nop();
LCD_RW = 1;//讀數據
Nop();
LCD_E = 1;//使能
Nop();
while(LCD_BF)//讀取忙碌標志BF(LCD_DATA.7)
{
Nop();//搞不清有時死機在此處,所以用_delay_loop()代替
}
LCD_E = 0;//不使能,讀出狀態
Nop();
TRIS_DATA = 0;//定義RE0~RE7為輸出IO
Nop();
}
void LcdClearBuffer(void)
{
unsigned char i, j;
for (i = 0;i < 2;i ++)//2行字符
{//2行漢字
for (j = 0;j < 15; j ++)//15個字符
{//每行7個半漢字15個字符
LcdBuffer[j] = ' ';//空白字符
}
LcdRowWriteEnable = 1;//允許此行刷新漢字顯示
}
LcdRow = 0;//虛擬光標定位在0行
LcdCol = 0;//虛擬光標定位在0列
}
void LcdDisplayPos(unsigned char row, unsigned char col)
{
if ((row < 2) && (col < 15))//容錯處理,光標越界
{
LcdRow = row;//刷新虛擬光標
LcdCol = col;//刷新虛擬光標
LcdRowWriteEnable[row] = 1;//允許此行刷新漢字顯示
}
}
void LcdDisplay(const char * string)//不真的LCD顯示
{
while(*string)//0字符結束
{
LcdBuffer[LcdRow][LcdCol ++] = *string ++;//寫入顯示緩沖區
}
}
unsigned char LcdDisplayBuffer(void)//顯示刷新LCD緩沖區內的數據(一般0.25S~0.5S刷新一次)
{
unsigned char i, j;
unsigned char num = 0;//刷新字符個數
for (i = 0; i < 2; i ++)
{//2行漢字
if (LcdRowWriteEnable)
{//允許此行刷新漢字顯示
LcdWriteCommand(0x80 + (i << 4));//移動真的LCD光標
for (j = 0; j < 15; j ++)
{//每行7個半漢字15個字符
LcdWriteData(LcdBuffer[j]);//刷新顯示字符
num ++;//刷新字符個數計數
}
LcdRowWriteEnable = 0;//過后不允許此行刷新漢字顯示
}
}
return num;//返回實際刷新字符個數
}
void _delay_loop(unsigned long count)//軟件延時
{
while(count --)
{
//ClrWdt();//注意大延時要記住喂狗
}
}
St7920中文字庫LCD驅動控制器資料 |
|