#include<reg51.h>
#include<stdio.h>
#include <intrins.h>
#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读写使能位定义
sbit jidianqi=P1^0;
void inilcd(void); //函数声明
void wrlcd_cmd(uchar cmd); //
void wrlcd_dat(uchar dat);
void delay(uint z); //
void main(void) //主函数
{ uchar i=0,j; //变量i用于对LCD1602的光标位置进行跟踪,j用于暂时存放SBUF接收到的数据
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
//jidianqi=1;
while(1) //循环接收数据
{ while(!RI); //串口中断标志位为0时,表达式为真,继续等待接收结束,结束时引起中断,硬件自动置
RI=1;
RI=0; //接收完毕后,清除中断标志位
j=SBUF; //将SBUF缓存器里收到的字符存入j
// if(j==1)
// {jidianqi=~jidianqi;
// break;
// }
wrlcd_dat(j); //将收到的字符显示在LCD1602中
i++; //LCD每显示一个字符,光标自动右移,光标位置加1
//default;
if(i==16)wrlcd_cmd(0xc0);// 如果光标到了LCD显示屏上行的最右边,换行
if(i==32)
{wrlcd_cmd(0x80);i=0;}//如果光标到了LCD显示屏下行的最右边,将光标归位到上行最左边
}
}
void inilcd() //初始化LCD1602
{ wrlcd_cmd(0x38); // 按芯片要求置3次功能指令,之间延时5ms
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--);}
}