|
//********WAVE-E6000/T*************** //*MCU: AT89C51 * //*MCU-crystal: 12M * //*Version: 00 * //*Last Updata: 2005-10-19 * //*Author: www.picavr.com * //*Description: LCD1602_DISPLAY * // C Program * //*********************************** #include<reg51.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char //**************************** sbit P1_0=P1^0; sbit P1_1=P1^1; sbit P1_2=P1^2; sbit P2_0=P2^0; sbit P2_1=P2^1; sbit P2_2=P2^2; sbit P2_3=P2^3; sbit P2_4=P2^4; sbit P2_5=P2^5; sbit P2_6=P2^6; sbit P2_7=P2^7; sbit P3_6=P3^6; sbit P3_7=P3^7; sbit P0_7=P0^7; //**************************** //定義LCD的連接端口 //**************************** #define LCD_RS P2_5 #define LCD_RW P2_6 #define LCD_EN P2_7 #define BUSY P0_7 #define LCDPort0 P0 #define SCL P3_6 #define SDA P3_7 #define K1 P1_0 #define K2 P1_1 #define K3 P1_2 //******************************** static uchar bdata StateREG; //可位尋址的狀態(tài)寄存器 sbit CY1 = StateREG^1; //狀態(tài) //******************************** uchar Command_Code; uchar Command_Code_No; uchar Buf_Code; uchar Buf_Add; uchar cont; uchar code Table[]={0x48,0x65,0x6c,0x6c,0x6f,0x20,0x52,0x49, 0x53,0x49,0x4f,0x4e,0x00}; //"Hello RISION" //****************************** //函數(shù)原型聲明 ***************** //****************************** void LCDBusy(void); void LCDWrite_Command(void); void LCDWrite_Command_No(void); void INITLCD(void); void LCDWrite_Data(uchar Buf_Data); void _nop_(void); void delay_ms(uchar ms); void LCDWrite_String(void); void STA(void); void STOP(void); void Write_DATA(); void Read_DATA(); void WRBYT(uchar EEROM_Buf); //******************************* //=============================== //延時(shí)最大255毫秒 //=============================== void delay_ms(uchar ms) { uchar i,j; for(j=0;j<ms;j++) for (i=0;i<124;i++) _nop_(); } //=========================== //寫一個(gè)命令字節(jié),不進(jìn)行忙檢測(cè) //=========================== void LCDWrite_Command_No() { LCD_EN=0; LCD_RS=0; LCD_RW=0; LCDPort0=Command_Code_No; LCD_EN=1 ; _nop_(); LCD_EN=0; } //=========================== //寫一個(gè)命令字節(jié),進(jìn)行忙檢測(cè) //=========================== void LCDWrite_Command() { LCDBusy(); LCD_EN=0; LCD_RW=0; LCD_RS=0; LCD_EN=1; LCDPort0=Command_Code; LCD_EN=0; } //=========================== //LCD狀態(tài)檢測(cè) //=========================== void LCDBusy() { uchar BUSY_A; do{ LCDPort0=0xFF; LCD_EN=0; LCD_RS=0; LCD_RW=1; LCD_EN=1; BUSY_A=LCDPort0; LCD_EN=0; } while ((BUSY_A&0x80)!=0x00); } //**************************** void INITLCD() { delay_ms(15); Command_Code=0x38; LCDWrite_Command_No(); delay_ms(5); Command_Code=0x38; LCDWrite_Command_No(); delay_ms(5); Command_Code=0x38; LCDWrite_Command_No(); Command_Code=0x38; LCDWrite_Command(); //設(shè)定LCD為16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口 Command_Code=0x01; LCDWrite_Command(); //顯示清屏。 Command_Code=0x06; LCDWrite_Command(); //顯示光標(biāo)自動(dòng)右移,整屏不移動(dòng)。 Command_Code=0x0C; LCDWrite_Command(); //開顯示,不顯示光標(biāo) } //******************************** //=========================== //寫一個(gè)命令字節(jié),進(jìn)行忙檢測(cè) //=========================== void LCDWrite_Data(uchar Buf_Code) { // Buf_Code=Buf_Code|0x40; LCDBusy(); LCD_EN=0; LCD_RW=0; LCD_RS=1; LCD_EN=1; LCDPort0=Buf_Code; LCD_EN=0; } //**************************** void LCDWrite_String() { Command_Code=0x82;cont=0; do{ LCDWrite_Command(); Command_Code++; LCDWrite_Data(Table[cont]); cont++; } while(Table[cont]!=0x00); return; } //**************************** //**************************** void main() { INITLCD(); Command_Code=0x80; LCDWrite_Command(); //將數(shù)據(jù)指針設(shè)置到第一行的第一個(gè)字符。 LCDWrite_Data(0x47); LCDWrite_String(); while(1); {;} } |