?? glcd.c
字號:
#include "Global.h"
#include "Hzlib.h"
///////////////////////////////////////////////////////////////////////////////
// 內部存儲區變量 0~128字節 直接尋址
// 全局變量定義
extern data uchar u8CursorX; // 光標X坐標列
extern data uchar u8CursorY; // 光標Y坐標行
extern data uchar cs; // 顯示片選
extern bdata bit reverse; // LCD底色顯示控制
//////////////////////////////////////////////////////////////////////////////
// LCD定位,列、行
///////////////////////////////////////////////////////////////////////////////
void GLCD_Locate (uchar u8Column, uchar u8Line)
{
u8CursorX = u8Column;
u8CursorY = u8Line;
}
///////////////////////////////////////////////////////////////////////////////
// LCD延時
///////////////////////////////////////////////////////////////////////////////
void LcdDelay(uchar u32Duration)
{
idata uchar i;
for(i=0;i<u32Duration;i++);
}
///////////////////////////////////////////////////////////////////////////////
// 寫指令
///////////////////////////////////////////////////////////////////////////////
void wcmd(uchar cmd)
{
E=0;
RS=0;
RW=0;
E=1;
P0=cmd;
E=0;
}
///////////////////////////////////////////////////////////////////////////////
// 寫數據
///////////////////////////////////////////////////////////////////////////////
void wdat(uchar dat)
{
E=0;
RS=1;
RW=0;
E=1;
P0=dat;
E=0;
}
///////////////////////////////////////////////////////////////////////////////
// 輸出左屏指令
///////////////////////////////////////////////////////////////////////////////
void OutLI(uchar i)
{
CS1=1; // 左屏片選
CS2=0;
wcmd(i); // 寫指令
}
///////////////////////////////////////////////////////////////////////////////
// 輸出左屏數據
///////////////////////////////////////////////////////////////////////////////
void OutLD(uchar i)
{
CS1=1; // 左屏片選
CS2=0;
wdat(i); // 寫數據
}
///////////////////////////////////////////////////////////////////////////////
// 輸出右屏指令
///////////////////////////////////////////////////////////////////////////////
void OutRI(uchar i)
{
CS1=0;
CS2=1; // 右屏片選
wcmd(i); // 寫指令
}
///////////////////////////////////////////////////////////////////////////////
// 輸出右屏數據
///////////////////////////////////////////////////////////////////////////////
void OutRD(uchar i)
{
CS1=0;
CS2=1; // 右屏片選
wdat(i); // 寫數據
}
///////////////////////////////////////////////////////////////////////////////
// 判斷LCD控制器是否忙
///////////////////////////////////////////////////////////////////////////////
void LcdWaitBusy (unsigned char u8LcdSide)
{
u8LcdSide=u8LcdSide;
LcdDelay(5);
}
///////////////////////////////////////////////////////////////////////////////
// 向LCD控制器寫指令
///////////////////////////////////////////////////////////////////////////////
void LcdInstructionWrite (uchar u8Instruction,uchar u8LcdSide)
{
LcdWaitBusy (u8LcdSide); // 如果忙就等待
if(u8LcdSide==RIGHT)
{
OutRI(u8Instruction); // 寫右屏指令
}
else if(u8LcdSide==LEFT)
{
OutLI(u8Instruction); // 寫左屏指令
}
}
///////////////////////////////////////////////////////////////////////////////
// 向LCD控制器寫數據
///////////////////////////////////////////////////////////////////////////////
void LcdDataWrite (uchar u8Data,uchar u8LcdSide)
{
LcdWaitBusy (u8LcdSide); // 如果忙就等待
if(u8LcdSide == LEFT)
{
OutLD(u8Data); // 寫左屏數據
}
else if(u8LcdSide == RIGHT)
{
OutRD(u8Data); // 寫左屏數據
}
}
///////////////////////////////////////////////////////////////////////////////
// 清LCD屏幕
//
// LCD分8頁
///////////////////////////////////////////////////////////////////////////////
void GLCD_ClearScreen ()
{
idata uchar u8Page=0;
idata uchar u8Column=0;
OutLI(START_LINE);
OutLI(X_ADRESS);
OutLI(Y_ADRESS);
OutLI(DISPLAY_ON);
OutRI(START_LINE);
OutRI(X_ADRESS);
OutRI(Y_ADRESS);
OutRI(DISPLAY_ON);
for(u8Page=0;u8Page<8;u8Page++)
{
LcdInstructionWrite(X_ADRESS|u8Page,LEFT); // 設置頁號
LcdInstructionWrite(Y_ADRESS,LEFT); // 設置列號
for(u8Column=0;u8Column<64;u8Column++)
{
LcdDataWrite(0X00,LEFT);
}
LcdInstructionWrite(X_ADRESS|u8Page,RIGHT); // 設置頁號
LcdInstructionWrite(Y_ADRESS,RIGHT); // 設置列號
for(u8Column=0;u8Column<64;u8Column++)
{
LcdDataWrite(0X00,RIGHT);
}
}
}
///////////////////////////////////////////////////////////////////////////////
// LCD控制器初始化
///////////////////////////////////////////////////////////////////////////////
void GLCD_LcdInit()
{
OutLI(START_LINE); // 起始行
OutLI(X_ADRESS);
OutLI(Y_ADRESS);
OutLI(DISPLAY_ON);
OutRI(START_LINE);
OutRI(X_ADRESS);
OutRI(Y_ADRESS);
OutRI(DISPLAY_ON);
GLCD_ClearScreen(); // 清屏
}
///////////////////////////////////////////////////////////////////////////////
// 顯示定長字符串
///////////////////////////////////////////////////////////////////////////////
void dprintf(char *fmt,uchar uLen)
{
idata char c1,c2; // 漢字占兩個ASC字符
idata uchar i=0,j,k; // 計數器
idata uchar pos; // 顯示位置
while(i<uLen)
{
if(u8CursorX <64){pos=LEFT;cs=1;}
else if((u8CursorX >63)&&(u8CursorX <128)){pos=RIGHT;cs=2;}
c1 = fmt[i];
c2 = fmt[i+1];
if(c1 >= 0)
{ // ASCII
LcdInstructionWrite (X_ADRESS + (u8CursorY/ 8),pos);
LcdInstructionWrite (Y_ADRESS + u8CursorX - (cs-1)*64,pos);
for (k=0;k<8;k++)
{
if(reverse)LcdDataWrite(~ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+k],pos);
else
LcdDataWrite(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+k],pos);
}
LcdInstructionWrite(X_ADRESS + (u8CursorY/ 8)+1,pos);
LcdInstructionWrite (Y_ADRESS + u8CursorX - (cs-1)*64,pos);
for(k=8;k<16;k++)
{
if(reverse)LcdDataWrite(~ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+k],pos);
else
LcdDataWrite(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+k],pos);
}
u8CursorX +=8;
}
else
{
// 中文
for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
{
if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
break;
}
LcdInstructionWrite(X_ADRESS + (u8CursorY/ 8),pos);
LcdInstructionWrite(Y_ADRESS + u8CursorX - (cs-1)*64,pos);
for (k=0;k<8;k++)
{
if(reverse)LcdDataWrite(~GB_16[j].Msk[k],pos);
else
LcdDataWrite(GB_16[j].Msk[k],pos);
}
u8CursorX +=8;
if(u8CursorX <64){pos=LEFT;cs=1;}
else if((u8CursorX >63)&&(u8CursorX <128)){pos=RIGHT;cs=2;}
LcdInstructionWrite(X_ADRESS + (u8CursorY/ 8),pos);
LcdInstructionWrite(Y_ADRESS + u8CursorX - (cs-1)*64,pos);
for (k=8;k<16;k++)
{
if(reverse)LcdDataWrite(~GB_16[j].Msk[k],pos);
else
LcdDataWrite(GB_16[j].Msk[k],pos);
}
u8CursorX -=8;
if(u8CursorX <64){pos=LEFT;cs=1;}
else if((u8CursorX >63)&&(u8CursorX <128)){pos=RIGHT;cs=2;}
LcdInstructionWrite(X_ADRESS + (u8CursorY/8)+1,pos);
LcdInstructionWrite(Y_ADRESS + u8CursorX - (cs-1)*64,pos);
for (k=16;k<24;k++)
{
if(reverse)LcdDataWrite(~GB_16[j].Msk[k],pos);
else
LcdDataWrite(GB_16[j].Msk[k],pos);
}
u8CursorX +=8;
if(u8CursorX <64){pos=LEFT;cs=1;}
else if((u8CursorX >63)&&(u8CursorX <128)){pos=RIGHT;cs=2;}
LcdInstructionWrite(X_ADRESS + (u8CursorY/ 8)+1,pos);
LcdInstructionWrite(Y_ADRESS + u8CursorX - (cs-1)*64,pos);
for (k=24;k<32;k++)
{
if(reverse)LcdDataWrite(~GB_16[j].Msk[k],pos);
else
LcdDataWrite(GB_16[j].Msk[k],pos);
}
u8CursorX +=8;
i++;
}
i++;
}
}
///////////////////////////////////////////////////////////////////////////////
// 顯示大字體
///////////////////////////////////////////////////////////////////////////////
void LcdPutDigit (uchar u8Char)
{
idata uchar c1; // 顯示字符
idata uchar k;
idata uchar pos; // 顯示位置
c1=u8Char;
if(u8CursorX <64){pos=LEFT;cs=1;}
else if((u8CursorX >63)&&(u8CursorX <128)){pos=RIGHT;cs=2;}
LcdInstructionWrite(X_ADRESS + (u8CursorY/ 8),pos);
LcdInstructionWrite(Y_ADRESS + u8CursorX - (cs-1)*64,pos);
LcdDataWrite(0x00,pos);
for (k=0;k<7;k++)
{
LcdDataWrite(clock_digit[(c1-0x30)*56+k],pos);
}
u8CursorX +=8;
if(u8CursorX <64){pos=LEFT;cs=1;}
else if((u8CursorX >63)&&(u8CursorX <128)){pos=RIGHT;cs=2;}
LcdInstructionWrite(X_ADRESS + (u8CursorY/ 8),pos);
LcdInstructionWrite(Y_ADRESS + u8CursorX - (cs-1)*64,pos);
for (k=7;k<14;k++)
{
LcdDataWrite(clock_digit[(c1-0x30)*56+k],pos);
}
LcdDataWrite(0x00,pos);
u8CursorX -=8;
if(u8CursorX <64){pos=LEFT;cs=1;}
else if((u8CursorX >63)&&(u8CursorX <128)){pos=RIGHT;cs=2;}
LcdInstructionWrite(X_ADRESS + (u8CursorY/8)+1,pos);
LcdInstructionWrite(Y_ADRESS + u8CursorX - (cs-1)*64,pos);
LcdDataWrite(0x00,pos);
for (k=14;k<21;k++)
{
LcdDataWrite(clock_digit[(c1-0x30)*56+k],pos);
}
u8CursorX +=8;
if(u8CursorX <64){pos=LEFT;cs=1;}
else if((u8CursorX >63)&&(u8CursorX <128)){pos=RIGHT;cs=2;}
LcdInstructionWrite(X_ADRESS + (u8CursorY/ 8)+1,pos);
LcdInstructionWrite(Y_ADRESS + u8CursorX - (cs-1)*64,pos);
for (k=21;k<28;k++)
{
LcdDataWrite(clock_digit[(c1-0x30)*56+k],pos);
}
LcdDataWrite(0x00,pos);
u8CursorX -=8;
if(u8CursorX <64){pos=LEFT;cs=1;}
else if((u8CursorX >63)&&(u8CursorX <128)){pos=RIGHT;cs=2;}
LcdInstructionWrite(X_ADRESS + (u8CursorY/8)+2,pos);
LcdInstructionWrite(Y_ADRESS + u8CursorX - (cs-1)*64,pos);
LcdDataWrite(0x00,pos);
for (k=28;k<35;k++)
{
LcdDataWrite(clock_digit[(c1-0x30)*56+k],pos);
}
u8CursorX +=8;
if(u8CursorX <64){pos=LEFT;cs=1;}
else if((u8CursorX >63)&&(u8CursorX <128)){pos=RIGHT;cs=2;}
LcdInstructionWrite(X_ADRESS + (u8CursorY/ 8)+2,pos);
LcdInstructionWrite(Y_ADRESS + u8CursorX - (cs-1)*64,pos);
for (k=35;k<42;k++)
{
LcdDataWrite(clock_digit[(c1-0x30)*56+k],pos);
}
LcdDataWrite(0x00,pos);
u8CursorX -=8;
if(u8CursorX <64){pos=LEFT;cs=1;}
else if((u8CursorX >63)&&(u8CursorX <128)){pos=RIGHT;cs=2;}
LcdInstructionWrite(X_ADRESS + (u8CursorY/8)+3,pos);
LcdInstructionWrite(Y_ADRESS + u8CursorX - (cs-1)*64,pos);
LcdDataWrite(0x00,pos);
for (k=42;k<49;k++)
{
LcdDataWrite(clock_digit[(c1-0x30)*56+k],pos);
}
u8CursorX +=8;
if(u8CursorX <64){pos=LEFT;cs=1;}
else if((u8CursorX >63)&&(u8CursorX <128)){pos=RIGHT;cs=2;}
LcdInstructionWrite(X_ADRESS + (u8CursorY/ 8)+3,pos);
LcdInstructionWrite(Y_ADRESS + u8CursorX - (cs-1)*64,pos);
for (k=49;k<56;k++)
{
LcdDataWrite(clock_digit[(c1-0x30)*56+k],pos);
}
LcdDataWrite(0x00,pos);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -