//LCG模組函式 //lcg.H 適用於繪圖型LCG #ifndef _LCG_H_ #define _LCG_H_ #include /* ======= 硬體接腳的定義 ============= */ // 使用P0埠做資料輸出線(D0~D7), P1.0~P1.控制線 // S=P1.0; RW=P1.1; E=P1.2 #define DBPORT P0; // 定義P0為資料輸出埠 sbit DI=P1^0 ; // P1.0之代稱為DI sbit RW=P1^1 ; // P1.1之代稱為RW sbit E=P1^2 ; // P1.2之代稱為E sbit CS1=P1^3 ; // P1.3之代稱為CS1 sbit CS2=P1^4 ; // P1.4之代稱為CS2 /* ======= LCG基本顯示驅動 ============= */ void LCG_CMD(char cmd); // 寫入指令暫存器函式 void LCG_DATA(char data1); // 寫入資料暫存器函式 void Chk_Busy(); // 等待LCG之時間延遲函式 void delay1ms(int count); //時間延遲 /* ======= LCG顯示 ============= */ void DISP_LCG(bit sidexy, char code *ptr,unsigned int offset); //宣告函式 void DISP_16X16(char *ptr,char xpage,char y,int offset); void DISP_8X8(char *ptr,char xpage,char y,int offset); /* ======= LCG動態顯示 ============= */ enum {Left=0,Right=1}; //宣告左右移動常數 enum {Down=0,Up=1}; //宣告左右移動常數 void Move8X8Img(char *ptr,char xpage,char y,int offset,bit direct,char step,char delay); void Move16X16Img(char *ptr,char xpage,char y,int offset,bit direct,char step,char delay); unsigned char MaskGenerator(char nbit); unsigned char MaskGenerator(char nbit); void Show8X8Ex(char *ptr,char x,char y,int offset); void PerpMove8X8Img(char *ptr,char x,char y,int offset,bit direct,char step,char delay); /* ================================ */ // 寫入指令暫存器函式 void LCG_CMD(char cmd) { P0=cmd ; //送出命令值 DI=0 ;RW=0 ;E=1 ; //為指令,寫入,致能LCD E=0 ;RW=1 ; //為禁能LCD,讀取 Chk_Busy(); // 呼叫LCD忙碌檢查等待 } // 寫入資料暫存器函式 void LCG_DATA(char data1) { P0=data1 ; //送出資料 DI=1 ;RW=0 ;E=1 ; //為資料,寫入,致能LCD E=0 ;RW=1 ; //為禁能LCD,讀取 Chk_Busy() ; //等待LCD完成命令 } // 等待LCG之時間延遲函式 void Chk_Busy() { unsigned char status ; P0=0xff ; //P0設定為輸入埠 do{ DI=0 ;RW=1 ;E=1 ; //為指令,讀取,致能LCD status= P0 ; //讀取狀態值 E=0 ; //禁能LCD } while(status&0x80) ; //等到忙碌旗標(BF)為零才離開 } // LCG 初始化 void Init_LCG() { CS1=1;CS2=1 ; //致能全部繪圖型LCD delay1ms(5); //呼叫延遲5毫秒,等待電源穩定 LCG_CMD(0x3f) ; //開啟顯示器 } void DISP_LCG(bit sidexy, char code *ptr,unsigned int offset) { char page,y; //宣告字元變數為 i,page,y if(sidexy==0){ CS1=1 ;CS2=0 ; //致能上半部繪圖型LCD } else{ CS1=0 ;CS2=1 ; //致能下半部繪圖型LCD } for(y=0;y<64;y++){ //左右半部各佔64點,每次向右移動32點 for(page=0;page<8;page++){ //共有8個頁面 LCG_CMD(0xb8+page) ; //設定 X 軸位置 LCG_CMD(0x40+y) ; //設定 Y 軸位置 LCG_DATA(~ptr[page+y*8+offset]) ;//寫出資料 } // end for -page } // end for -y } void delay1ms(int count) { int i,j; for(i=0;i>=1; } return ret; } void Show8X8Ex(char *ptr,char x,char y,int offset) { char sendData=0x00,Reserved=0x00; char page=x/8,left=x%8; char i; if (left==0){ DISP_8X8(ptr,page,y,offset); return; } for (i=y;i>8-left)^MaskGenerator(8-left)); } } void PerpMove8X8Img(char *ptr,char x,char y,int offset,bit direct,char step,char delay) { char i,j; for (i=0;i