|
#i nclude "absacc.h" #i nclude "intrins.h"
//自定義庫(kù) 在"C:\comp51\UserLib\"文件夾中 #i nclude ".\inc\ASCII816.h" //標(biāo)準(zhǔn)ASCII庫(kù) #i nclude ".\inc\HZTable.h" //漢字點(diǎn)陣庫(kù)(自做) #i nclude ".\inc\Menu.h" //菜單庫(kù)(自做)
// LCD128*64 數(shù)據(jù)線 #define LCD12864DataPort P1
// LCD128*64 I/O 信號(hào)管腳 sbit di =P3^1; // 數(shù)據(jù)\指令 選擇 sbit rw =P3^3; // 讀\寫(xiě) 選擇 sbit en =P3^2; // 讀\寫(xiě)使能 sbit cs1 =P3^4; // 片選1,低有效(前64列) sbit cs2 =P3^5; // 片選2,低有效(后64列)
sbit reset=P0^7; // 復(fù)位
/*----------------------------------------------------------------------------------------------------*/ /* ****函數(shù)列表****
//開(kāi)關(guān)顯示 void SetOnOff(unsigned char onoff)
//選擇屏幕 //screen: 0-全屏,1-左屏,2-右 void SelectScreen(unsigned char screen)
//清屏 //screen: 0-全屏,1-左屏,2-右 void ClearScreen(unsigned char screen)
//顯示8*8點(diǎn)陣 //旋轉(zhuǎn)90度:字模被豎著切分 //lin:行(0-7), column: 列(0-15) //address : 字模區(qū)首地址 void Show88(unsigned char lin,unsigned char column,unsigned int address)
//顯示8*16字符 //旋轉(zhuǎn)90度:字模被豎著切分 //lin:行(0-3), column: 列(0-15) //character:字符代碼(標(biāo)準(zhǔn)ASCII碼) void ShowChar(unsigned char lin,unsigned char column,unsigned char character)
//顯示8*16字符串 //!!!只能顯示在一行上即: 串長(zhǎng)+column <=15 //旋轉(zhuǎn)90度:字模被豎著切分 //lin:行(0-3), column: 列(0-15) //address : 字模區(qū)首地址 void ShowString(unsigned char lin,unsigned char column, unsigned char *string)
//顯示一個(gè)漢字 //旋轉(zhuǎn)90度:字模被豎著切分 //lin:行(0-3), column: 列(0-15) //hzcode: 漢字代碼(自定義的) void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)
//顯示圖片 //旋轉(zhuǎn)90度 :字模被豎著切分 //startline :開(kāi)始行 //startcolumn:開(kāi)始列 //linechar :圖片行點(diǎn)除8(圖片以8*8點(diǎn)陣為單位) //columnchar :圖片列點(diǎn)除8(圖片以8*8點(diǎn)陣為單位) //address : 字模區(qū)首地址 void ShowPicture(unsigned char startline,unsigned char startcolumn,unsigned char linechar,unsigned char columnchar,unsigned int address) //!!問(wèn)題大戶(hù) //顯示一行漢字 //lin:行 //lineheadaddr: 此行漢字代碼區(qū)首地址 void ShowLine(unsigned char lin,unsigned int lineheadaddr)
//顯示一屏漢字 //pageheadaddr:此屏漢字代碼地址區(qū)首地址 void ShowPage(unsigned int pageheadaddr)
//反顯一個(gè)8*8字塊 //lin:行(0-3), column: 列(0-7) void ReverseShow88(unsigned char lin,unsigned char column)
//反顯一個(gè)字符 //lin:行(0-4), column: 列(0-15) void ReverseShowChar(unsigned char lin,unsigned char column)
//反顯一個(gè)漢字 //lin:行(0-3), column: 列(0-7) ReverseShowHZ(unsigned char lin,unsigned char column)
//反顯一行漢字 //lin:行 ReverseShow(unsigned char lin)
//初始化LCD void InitLCD()
****函數(shù)列表結(jié)束**** */ /*----------------------------------------------------------------------------------------------------*/ /*--基本函數(shù)源程序------------------------------------------------------------------------------------*/ //延時(shí) Lcd12864delay() { unsigned int i=500; while(i--) {;} } /*----------------------------------------------------------------------------------------------------*/ //狀態(tài)檢查 void CheckState() { unsigned char dat; di=0; rw=1; do{ LCD12864DataPort=0xff; en=1; dat=LCD12864DataPort; en=0; dat=0x90 & dat; //僅當(dāng)?shù)?,7位為0時(shí)才可操作 }while(!(dat==0x00)); } /*----------------------------------------------------------------------------------------------------*/ //寫(xiě)顯示數(shù)據(jù) //dat:顯示數(shù)據(jù) void WriteByte(unsigned char dat) { CheckState(); di=1; rw=0; LCD12864DataPort=dat; en=1; en=0; } /*-----------------------------------------------------------------------------------------------------*/ //向LCD發(fā)送命令 //command :命令 SendCommandToLCD(unsigned char command) { CheckState(); rw=0; LCD12864DataPort=command; en=1; en=0; } /*----------------------------------------------------------------------------------------------------*/ //設(shè)定行地址(頁(yè))--X 0-7 void SetLine(unsigned char line) { line=line & 0x07; // 0<=line<=7 line=line|0xb8; //1011 1xxx SendCommandToLCD(line); } //設(shè)定列地址--Y 0-63 void SetColumn(unsigned char column) { column=column &0x3f; // 0=<column<=63 column=column | 0x40; //01xx xxxx SendCommandToLCD(column); } //設(shè)定顯示開(kāi)始行--XX void SetStartLine(unsigned char startline) //0--63 { startline=startline & 0x07; startline=startline|0xc0; //1100 0000 SendCommandToLCD(startline); } //開(kāi)關(guān)顯示 void SetOnOff(unsigned char onoff) { onoff=0x3e | onoff; //0011 111x SendCommandToLCD(onoff); } /*---------------------------------------------------------------------------------------------------*/ //選擇屏幕 //screen: 0-全屏,1-左屏,2-右屏 void SelectScreen(unsigned char screen) { //北京顯示器:負(fù)有效 cs1: 0--右; cs2: 0--左 switch(screen) { case 0: cs1=0;//全屏 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); cs2=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); break; case 1: cs1=1;//左屏 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); cs2=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); break; case 2: cs1=0;//右屏 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); cs2=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); break; } } /*---------------------------------------------------------------------------------------------------*/ //清屏 //screen: 0-全屏,1-左屏,2-右 void ClearScreen(unsigned char screen) { unsigned char i,j; SelectScreen(screen); for(i=0;i<8;i++) { SetLine(i); for(j=0;j<64;j++) { WriteByte(0x00); } } } /*--------------------------------------------------------------------------------------------------*/ //顯示8*8點(diǎn)陣 //旋轉(zhuǎn)90度:字模被豎著切分 //lin:行(0-7), column: 列(0-15) //address : 字模區(qū)首地址 void Show88(unsigned char lin,unsigned char column,unsigned int address) { unsigned char i; if(column>16) {return;} if(column<8) SelectScreen(1); //如果列數(shù)<8(0,1,2,3,4,5,6,7)則寫(xiě)在第一屏上 else { SelectScreen(2); //否則 (8,9,10,11,12,13,14,15)寫(xiě)在第二屏上 column=column & 0x07; //防止越界 } SetLine(lin); SetColumn(column<<3); for(i=0;i<8;i++) WriteByte( CBYTE[address+i] ); } /*------------------------------------------------------------------------------------------------*/ //顯示8*16字符 //旋轉(zhuǎn)90度:字模被豎著切分 //lin:行(0-3), column: 列(0-15) //character:字符代碼(標(biāo)準(zhǔn)ASCII碼) void ShowChar(unsigned char lin,unsigned char column,unsigned char character) { lin=lin<<1; Show88(lin ,column,ASCII816[character-0x20] ); Show88(lin+1,column,ASCII816[character-0x20]+8 ); } /*-----------------------------------------------------------------------------------------------*/ /* //顯示8*16字符串 //!!!只能顯示在一行上即: 串長(zhǎng)+column <=15 //旋轉(zhuǎn)90度:字模被豎著切分 //lin:行(0-3), column: 列(0-15) //address : 字模區(qū)首地址 void ShowString(unsigned char lin,unsigned char column, unsigned char *string) { unsigned char ch; unsigned char i=0;
while(*string!='\0') { ch=*string; if(i+column >15) break; //(只能顯示在一行上即: 串長(zhǎng)+column <=15) ShowChar(lin,i+column,ch); string++; i++; } } */ /*----------------------------------------------------------------------------------------------*/ //顯示一個(gè)漢字 //旋轉(zhuǎn)90度:字模被豎著切分 //lin:行(0-3), column: 列(0-7) //hzcode: 漢字代碼(自定義的) //uchar code HZtable void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode) { lin=lin<<1; //lin*2
Show88(lin,column,HZTable[hzcode]); Show88(lin,column+1,HZTable[hzcode]+8); Show88(lin+1,column,HZTable[hzcode]+16); Show88(lin+1,column+1,HZTable[hzcode]+24); } /*----------------------------------------------------------------------------------------------*/ //顯示圖片 //旋轉(zhuǎn)90度 :字模被豎著切分 //startline :開(kāi)始行 //startcolumn:開(kāi)始列 //linechar :圖片行點(diǎn)除8(圖片以8*8點(diǎn)陣為單位) //columnchar :圖片列點(diǎn)除8(圖片以8*8點(diǎn)陣為單位) //address : 字模區(qū)首地址 void ShowPicture(unsigned char startline,unsigned char startcolumn,unsigned char linechar,unsigned char columnchar,unsigned int address) { unsigned char i,j; for(i=0;i<columnchar;i++) for(j=0;j<linechar;j++) Show88(startline+i , startcolumn+j , address+(i*linechar+j)*8 ); } /*----------------------------------------------------------------------------------------------*/ //顯示一行字符串(漢字,字母混排,一行16字節(jié)) //lin:行 //lineheadaddr: 此行漢字代碼區(qū)首地址 void ShowLine(unsigned char lin,unsigned char linehead[]) { unsigned char i; unsigned char byte; unsigned int hzcode; for( i=0; i<16; ) { byte=linehead[i]; if(byte < 0x80) //字母 { if(i>15) return; //!!編譯器有問(wèn)題,須強(qiáng)制退出
ShowChar(lin, i , byte); i=i+1;
} else // byte >= 0x80(漢字) { if(i>15) return; //!!編譯器有問(wèn)題,須強(qiáng)制退出
byte=byte & 0x7f; //最高位置0,即:減去0x8000 hzcode=(unsigned int)byte<<8; //?? //高8位 hzcode=hzcode+linehead[i+1]; //加低8位,組合成整型數(shù)地址 ShowHZ( lin,i,hzcode); i=i+2; } } } /*----------------------------------------------------------------------------------------------------*/ //顯示一屏漢字 //pageheadaddr:此屏漢字代碼地址區(qū)首地址 void ShowPage(unsigned char pagehead[][16]) { unsigned char i; for(i=0;i<4;i++) ShowLine(i,pagehead[i]); //1行8個(gè)漢字,16字節(jié) } /*----------------------------------------------------------------------------------------------------*/ //讀顯示數(shù)據(jù) unsigned char ReadByte() { unsigned char dat; CheckState(); di=1; rw=1; LCD12864DataPort=0xff; en=1; dat=LCD12864DataPort; en=0; return(dat); }
/*----------------------------------------------------------------------------------------------------*/ //反顯一個(gè)8*8字塊 //lin:行(0-3), column: 列(0-7) void ReverseShow88(unsigned char lin,unsigned char column) { unsigned char i; unsigned char tab[8];
if(column<8) SelectScreen(1); //如果列數(shù)<4(0,1,2,3),則寫(xiě)在第一屏上 else SelectScreen(2); //否則 (4,5,6,7), 寫(xiě)在第二屏上 //讀上部8列 column=column<<3; //每個(gè)方塊8*8大小 SetLine(lin); SetColumn(column); tab[0]=ReadByte(); //空讀!!!!! //? for(i=0;i<8;i++) tab[i]=~ReadByte(); //寫(xiě)回 SetLine(lin); SetColumn(column); for(i=0;i<8;i++) WriteByte(tab[i]); } /*----------------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------------*/ //反顯一個(gè)字符 //lin:行(0-4), column: 列(0-15) void ReverseShowChar(unsigned char lin,unsigned char column) { lin=lin<<1; ReverseShow88(lin ,column); ReverseShow88(lin+1,column); } /*----------------------------------------------------------------------------------------------------*/ //反顯一個(gè)漢字 //lin:行(0-3), column: 列(0-7) ReverseShowHZ(unsigned char lin,unsigned char column) { lin=lin<<1; column=column<<1; ReverseShow88(lin ,column ); ReverseShow88(lin ,column+1); ReverseShow88(lin+1,column ); ReverseShow88(lin+1,column+1); } /*----------------------------------------------------------------------------------------------------*/ //反顯一行漢字 //lin:行 ReverseShow(unsigned char lin) { unsigned char i; for(i=0;i<8;i++) ReverseShowHZ(lin,i); } /*----------------------------------------------------------------------------------------------------*/ void InitLCD() //初始化LCD { unsigned char i=250; //延時(shí) while(i--);
//reset=0;//復(fù)位 //reset=1;
SelectScreen(0); SetOnOff(0); //關(guān)顯示
ClearScreen(1);//清屏 ClearScreen(2);
SelectScreen(0); SetOnOff(1); //開(kāi)顯示 SelectScreen(0); SetStartLine(0); //開(kāi)始行:0 } /*----------------------------------------------------------------------------------------------------*/
void Reset() //液晶復(fù)位 { //reset 低復(fù)位 _|- reset=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); reset=1;
//全屏 cs1=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); cs2=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SendCommandToLCD(0x3F);
}
|