|
#include<reg51.h>
#include<intrins.h>
//定義控制信號端口
sbit RS=P0^7;
sbit RW=P0^6;
sbit E=P0^5;
//聲明調用函數
void lcd_w_cmd(unsigned char com); //寫命令字函數
void lcd_w_dat(unsigned char dat); //寫數據函數
unsigned char lcd_r_start(); //讀狀態函數
void lcd_init(); //LCD初始化函數
void delay100us(unsigned char t); //可控延時函數
void delay5us(unsigned char n); //軟件實現延時函數,n*5個機器周期
void main() //主函數
{
unsigned char Disp[]="He Zhe"; //定義字符數組Disp
unsigned char i;
P2=0xff; //送全1到P1口
lcd_init(); //初始化LCD
delay100us(255);
lcd_w_cmd(0xc2); //定位光標設置顯示位置
delay100us(255);
for(i=0;i<6;i++) //顯示字符串
{
lcd_w_dat(Disp[i]);
delay100us(200);
}
while(1); //顯示完成
}
void delay100us(unsigned char t)
{
unsigned char j,i;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
void delay5us(unsigned char n)
{
do
{
_nop_();
_nop_();
_nop_();
n--;
}
while(n);
}
void lcd_init()
{
lcd_w_cmd(0x3c); //設置工作方式
lcd_w_cmd(0x0e); //設置光標
lcd_w_cmd(0x01); //清屏
lcd_w_cmd(0x06); //設置輸入方式
lcd_w_cmd(0x80); //設置初始顯示位置
}
unsigned char lcd_r_start()
{
unsigned char s;
RW=1; //RW=1,RS=0,讀LCD狀態
delay5us(1);
RS=0;
delay5us(1);
E=1; //E端時序
delay5us(1);
s=P2; //從LCD的數據口讀狀態
delay5us(1);
E=0;
delay5us(1);
RW=0;
delay5us(1);
return(s); //返回讀取的LCD狀態字
}
void lcd_w_cmd(unsigned char com)
{
unsigned char i;
do
{ //查LCD忙操作
i=lcd_r_start(); //調用讀狀態字函數
i=i&0x80; //與操作屏蔽掉低7位
delay100us(2);
}
while(i!=0); //LCD忙,繼續查詢,否則退出循環
RW=1;
delay5us(1);
RS=0; //RW=1,RS=0,寫入LCD命令字
delay5us(1);
E=1; //E端時序
delay5us(1);
P2=com; //將com中的命令字寫入LCD數據口
delay5us(1);
E=0;
delay5us(1);
RW=1;
delay100us(255);
}
void lcd_w_dat(unsigned char dat)
{
unsigned char i;
do
{ //查忙操作
i=lcd_r_start(); //調用讀狀態字函數
i=i&0x80; //與操作屏蔽掉低7位
delay100us(2);
}
while(i!=0); //LCD忙,繼續查詢,否則退出循環
RW=0;
delay5us(1);
RS=1; //RW=1,RS=0,寫入LCD命令字
delay5us(1);
E=1; //E端時序
delay5us(1);
P2=dat; //將dat中的顯示數據寫入LCD數據口
delay5us(1);
E=0;
delay5us(1);
RW=1;
delay100us(255);
}
|
|