#define uchar unsigned char
#define uint unsigned int
sbit lcd1602_rs =P3^3; //LCD指令、数据位定义
sbit lcd1602_rw =P3^4; //LCD读、写位定义
sbit lcd1602_e =P3^5; //LCD读写使能位定义
void inilcd(void); //函数声明
void wrlcd_cmd(uchar cmd); //
void wrlcd_dat(uchar dat);
void delay(uint z); //
void main(void) //主函数
{
uchar i=0,j; SBUF接收到的数据
//变量i用于对LCD1602的光标位置进行跟踪,j用于暂时存放
inilcd(); //初始化LCD1602
wrlcd_cmd(0x80); //对LCD1602写指令,使其光标回到起始位00H
wrlcd_cmd(0x0f); //对LCD1602写指令,开显示,开光标,光标闪烁
TMOD=0x20; //T1定时器工作于2(自动加载初值方式),
TH1=0xe6;TL1=0xe6; //根据波特率=1200,串口工作于方式1,晶振fosc=12MHz,
//Baud=1200=(1/32)*{(12*1000000)/(12*(256-X))},X=230=E6H,装载定时器初值
TR1=1; //启动T1定时器,
SCON=0x50; //设置串口工作于方式1
while(1) //循环接收数据
{
while(!RI); //串口中断标志位为0时,表达式为真,继续等待接收结束,结束
时引起中断,硬件自动置RI=1
RI=0; //接收完毕后,清除中断标志位
j=SBUF; //将SBUF缓存器里收到的字符存入j
wrlcd_dat(j); //将收到的字符显示在LCD1602中
i++; //LCD每显示一个字符,光标自动右移,光标位置加1
if(i==16)wrlcd_cmd(0xc0);// 如果光标到了LCD显示屏上行的最右边,换行
if(i==32){wrlcd_cmd(0x80);i=0;}//如果光标到了LCD显示屏下行的最右边,将光标归位到上行最左边
}
}
void inilcd() //初始化LCD1602
{
wrlcd_cmd(0x38); // 按芯片要求置3次功能指令,之间延时5ms
delay(5);
wrlcd_cmd(0x38); //
delay(5);
wrlcd_cmd(0x38); //
delay(5);
wrlcd_cmd(0x38); //
wrlcd_cmd(0x01); //清屏,光标归位
wrlcd_cmd(0x06); //光标自动右移,文字不移动
wrlcd_cmd(0x0f); //开总显示,开光标,光标闪烁
}
void wrlcd_cmd(uchar cmd)//写指令子函数
{
lcd1602_rw=0; //写
lcd1602_rs=0; //指令
P2=cmd; //将指令送到P2口,待写入LCD
lcd1602_e=1; //
delay(5); //
lcd1602_e=0; //使能引脚的下降沿将指令写入
}
void wrlcd_dat(uchar dat) //写显示数据子函数
{
lcd1602_rw=0; //写
lcd1602_rs=1; //数据
P2=dat; //将数据送到P2口,待写入LCD
lcd1602_e=1; //
delay(5); //
lcd1602_e=0; //使能引脚的下降沿将数据写入
}
void delay(uint z) //延时z毫秒
{
uint x,y;
for(x=110;x>0;x--)
{for(y=z;y>0;y--);}
}