#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0; //选择是数据还是指令
sbit RW=P2^1; //选择是读操作还是写操作
sbit E =P2^2; //使能信号
sbit BF=P0^7; //忙碌状态标志位
uchar temp;
//************************************************
void delay(uint z) //大约1ms的延时
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//************************************************
bit Read_busy_flag() //读取忙碌标志位
{
bit result;
RS=0;
RW=1; //进行读操作
E=1; //允许读数据
_nop_();
result=BF;
E=0;
return result;
}
//************************************************
void Write_instruction(uchar order)
{
while(Read_busy_flag()==1);
RS=0;
RW=0; //给液晶写入指令
E=0;
_nop_();
P0=order;//将指令写入液晶
_nop_();
E=1;
_nop_();
E=0; //此时液晶就顺利接收到数据了
}
//************************************************
void Write_data(uchar dat)
{
while(Read_busy_flag()==1);
RS=1;
RW=0; //给液晶写入数据
E=0;
_nop_();
P0=dat; //将数据写入液晶
_nop_();
E=1;
_nop_();
E=0; //此时液晶就顺利接收到数据了
}
//************************************************
void Initialize() //芯片的初始化过程
{
delay(15);
Write_instruction(0x38);
delay(15);
Write_instruction(0x38);
delay(15);
Write_instruction(0x38);
delay(5);
Write_instruction(0x0f); //打开显示屏,有光标出现而且光标闪烁
delay(5);
Write_instruction(0x06); //写入数据后光标右移,显示屏不移动
delay(5);
Write_instruction(0x01); //清显示屏
delay(5);
}
//************************************************
void send_back() //数据返回子程序
{
SBUF=temp;
while(!TI); //等待数据发送完毕
TI=0; //将发送标志位清零
}
//************************************************
void main(void)
{
Initialize();
delay(10);
TMOD=0x20; //定时器1,工作方式2
TH1 =0xfd;
TL1 =0xfd; //给定时器1装初值,设定波特率为9600bps
PCON=0x00; //波特率不进行加倍
SM0 =0;
SM1 =1; //串行工作方式1
REN =1; //允许接收数据
ES =1; //打开串口中断4
TR1 =1; //启动定时器1
EA =1; //打开总中断
while(1);
}
//************************************************
void UART() interrupt 4 //串行口中断服务程序
{
if(RI==1) //液晶接收到数据时该位自动置为1。
{
RI=0;
temp=SBUF;
send_back(); //把接收到的数据返回到上位机
if(temp==01)
{
Write_instruction(0x01); //清显示屏
}
Write_data(temp); //上位机给液晶写数据
}
}下载本文