#include
#define uchar unsigned char
sbit rs=P2^0; //lcd1602 rs端
sbit rw=P2^1; //lcd1602 rw端
sbit en=P2^2; //lcd1602 e端
uchar code table[]="wang yun";
uchar code tt1[]={0x1F,0x1F,0x04,0x0E,0x0E,0x04,0x1F,0x1F}; //王
uchar code tt2[]={0x0E,0x0E,0x00,0x1F,0x1F,0x0C,0x19,0x1F}; //云
///////////////////////////////////////
void delay(uchar H,uchar L) //定時器延時程序段
{ TF0=0;TH0=H;TL0=L;
while(!TF0);
}
////////////////////////////////////// 寫指令程序段
void w_comd(uchar lcd1602_code)
{ en=1;rs=0;rw=0;
P0=lcd1602_code;
delay(0xff,0xd8);
en=0; //en端下降沿觸發(fā)數(shù)據(jù)發(fā)送
delay(0xff,0xd8); //本程序沒有 忙檢測程序,所以此處必須給足夠長的延時,保證數(shù)據(jù)發(fā)送完全
}
///////////////////////////////////////寫數(shù)據(jù)程序段
void w_data(uchar lcd1602_data)
{ en=1;rs=1;rw=0;
P0=lcd1602_data;
delay(0xff,0xd8);
en=0; //en端下降沿觸發(fā)數(shù)據(jù)發(fā)送
delay(0xec,0x78);
}
//////////////////////////////////// 初始化lcd1602
void set_lcd1602()
{ w_comd(0x01); //清屏
delay(0xf9,0x98);
w_comd(0x02); //地址指針歸位
delay(0xf9,0x98);
w_comd(0x06); //
w_comd(0x0c); //開顯示屏
w_comd(0x38); //8位傳送數(shù)據(jù) 2行顯示
}
/////////////////////////////////// 顯示程序段
void view_lcd1602(uchar addr,uchar *i) //*i為所傳字符串指針
{ int j;
w_comd(addr); //寫入地址
while(*i>0)
{ w_data(*i); //寫入數(shù)據(jù)
i++;
for(j=0;j<=100;j++)
delay(0x15,0xa0);
w_comd(0x18); //左移指令
}
}
/////////////////////////////////////// cgram寫入程序段
void cgram_set_lcd1602(uchar addr,uchar*i)
{ int j;
w_comd(addr); //地址寫入
for(j=0;j<8;j++)
{ w_data(*i); //自定義數(shù)據(jù)寫入
i++;
}
}
////////////////////////////////////// 主程序
void main()
{
TMOD=0x00; //設(shè)定定時器
TR0=1; //定時器0開
set_lcd1602(); //初始化LCD1602
view_lcd1602(0x8f,table);
cgram_set_lcd1602(0x40,tt1);
cgram_set_lcd1602(0x48,tt2);
w_comd(0xca); w_data(0x00); w_data(0x01); //自定義字符顯示
while(1);
}