#include #include void main()
#include
#define lcd_bus P0 // 數(shù)據(jù)總線
sbit rs =P2^4; // 數(shù)據(jù)&指令選擇,H:寫數(shù)據(jù),L:寫指令
sbit rw =P2^3; // 讀&寫選擇,H:read,L:write
sbit e =P2^2; // 讀寫使能
sbit bf =P0^7; // 忙閑狀態(tài)標(biāo)志位,H:內(nèi)部正執(zhí)行操作,L:空閑
void chk_busy(void); // 檢測(cè)LCD忙閑
void init_lcd(void); // LCD初始化
void wr_comm(unsigned char comm); // 寫指令
void wr_comm_no(unsigned char comm); // 寫指令,不檢測(cè)忙閑
void wr_da
void wr_str(unsigned char *p);// 顯示字符串
unsigned char rd_lcd(void); // 讀LCD數(shù)據(jù)
void delayus(unsigned char us);// 延時(shí)子程序 us
void delayms(unsigned int ms); // 延時(shí)子程序 ms
{
delayms(200);
init_lcd(); // LCD初始化
wr_comm(0x80); // 第一行第一個(gè)字符地址
wr_str("lcd1602");
wr_comm(0xc0);// 第二行第一個(gè)字符地址
wr_str("Tai shan Dizn Zi");
while(1);
}
/*------------------LCD初始化-----------------*/
void init_lcd(void)
{
wr_comm_no(0x38); // 不檢測(cè)忙閑
delayms(5);
wr_comm_no(0x38);
delayms(5);
wr_comm_no(0x38);
delayms(5);
wr_comm_no(0x38);
delayms(5);
wr_comm(0x38); // 設(shè)定LCD為16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口,檢測(cè)忙信號(hào)
delayus(3); // 延時(shí)11us
wr_comm(0x08); // 關(guān)閉顯示,檢測(cè)忙信號(hào)
delayus(3);
wr_comm(0x01); // 顯示清屏,檢測(cè)忙信號(hào)
delayus(3);
wr_comm(0x06); // 顯示光標(biāo)自動(dòng)右移,整屏不移動(dòng),檢測(cè)忙信號(hào)
delayus(3);
wr_comm(0x0c); // 開顯示,不顯示光標(biāo),檢測(cè)忙信號(hào)
delayus(3);
}
/*--------------檢測(cè)LCD忙閑---------------*/
void chk_busy(void)
{
lcd_bus=0xff;
rs=0;
rw=1;
;
e=1;
while(bf==1);
e=0;
}
/*------------寫命令到LCD--------------*/
void wr_comm(unsigned char comm)
{
chk_busy();
rs=0; // H:寫數(shù)據(jù),L:寫指令
rw=0;
e=0;
;
lcd_bus=comm; // 內(nèi)容
delayus(3);
e=1;
;
e=0;
}
/*------------寫命令到LCD不檢測(cè)忙閑--------------*/
void wr_comm_no(unsigned char comm)
{
rs=0; // H:寫數(shù)據(jù),L:寫指令
rw=0;
e=0;
;
lcd_bus=comm; // 內(nèi)容
delayus(3);
e=1;
;
e=0;
}
/*------------寫數(shù)據(jù)到LCD--------------*/
void wr_da
{
chk_busy();
rs=1; // H:寫數(shù)據(jù),L:寫指令
rw=0;
e=0;
;
lcd_bus=dat; // 內(nèi)容
delayus(3);
e=1;
;
e=0;
}
/*--------------讀LCD數(shù)據(jù)---------------*/
unsigned char rd_lcd(void)
{
unsigned char rd_da
chk_busy(); // 檢測(cè)忙閑
rs=1;
rw=1;
e=1;
;
rd_da
e=0;
return rd_da
}
/*-------------寫字符串----------------*/
void wr_str(unsigned char *s)
{
while(*s>0) // 字符串以0結(jié)束
{
wr_da
s++;
}
}
/*---------------延時(shí)子程序us----------------*/
void delayus(unsigned char us)
{
while(--us); // 一個(gè)循環(huán)2us
}
/*---------------ms延時(shí)子程序----------------*/
void delayms(unsigned int ms) //延時(shí) n ms
{
while(ms)
{
int i;
i=110;
while(i--);
ms=ms-1;
}
}