/******************************************************************
1.项目:串口接收数据并在LCD上显示
2.功能:
2.1:串口接收数据
2.2:数据在1602上显示
2.3:数据会发给串口
3.设计:robin_chen559
4.日期:2013.12.24
备注:C51,11.0592M晶振
******************************************************************/
#include //包含头文件
#define uint unsigned int //预定义一下
#define uchar unsigned char
sbit rs=P3^5; //1602的数据/指令选择控制线
sbit rw=P3^6; //1602的读写控制线
sbit en=P3^7; //1602的使能控制线
bit Uart_Flag = 0; //串口接收标志
uchar Data_H,Data_L; //定义数据高低
uchar code table[] = {"0123456789abcdef"}; //定义显示字符串
/****************函数声明*********************/
void Init_UART(void); //串口初始化
void lcd_wcom(uchar com); //1602写指令
void lcd_wdat(uchar dat); //1602显示数据
void lcd_init(); //1602初始化
void delay(uint n); //延时子程序
void putchar(unsigned char data1); //串口发送数据
void putstring(unsigned char *dat); //串口发送字符串
void LCD_Display(void); //LCD显示子程序
/***************子程序************************/
//串口初始化子程序
void Init_UART(void)
{
SCON = 0x50; //串口方式1 ,允许接收
TMOD = 0x20; //T1工作于方式2
PCON = 0x00; //波特率不倍增
TL1 = 0xfd; //波特率设置
TH1 = 0xfd; //
EA = 1; //开总中断
ES = 1; //开串口接收中断
//TI = 0;
TR1 = 1; //定时器开启
}
//串口接收子程序
void revdata(void) interrupt 4
{
unsigned char temp,temp1;
if(RI == 0) return; //如果没有接收中断标志,返回
ES = 0; //关闭串口中断
RI = 0; //清串行中断标志位
temp = SBUF; //接收缓冲器中的字符
temp1 = temp;
putchar(temp); //将接收的字符发送出去
Uart_Flag = 1; //串口已接受标志置1
ES = 1; //开启串口中断
Data_H = (temp>>4); // Data_H取串口高四位
Data_L = (temp1&0x0f); // Data_L取串口低四位
}
//字符发送函数
void putchar(unsigned char data1)
{
SBUF = data1; //将待发送的字符送入发送缓冲器
while(TI == 0); //等待发送完成
TI = 0; //发送中断标志请0
}
//字符串发送函数
void putstring(unsigned char *dat)
{
while(*dat != '\0') //判断字符串是否发送完毕
{
putchar(*dat); //发送单个字符
dat++; //字符地址加1,指向先下一个字符
delay(5);
}
}
//毫秒级延时函数
void delay(uint n) //延时函数
{
uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
//1602写命令子程序
void lcd_wcom(uchar com)
{
rs=0; //选择指令寄存器
rw=0; //选择写
P2=com; //把命令字送入P2
delay(5); //延时一小会儿,让1602准备接收数据
en=1; //使能线电平变化,命令送入1602的8位数据口
en=0;
}
//1602初始化子程序
void lcd_init()
{
lcd_wcom(0x38); //8位数据,双列,5*7字形 38
lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁 0C
lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
lcd_wcom(0x01); //清屏
}
//1602写数据子程序
void lcd_wdat(uchar dat)
{
rs=1; //选择数据寄存器
rw=0; //选择写
P2=dat; //把要显示的数据送入P2
delay(1); //延时一小会儿,让1602准备接收数据
en=1; //使能线电平变化,数据送入1602的8位数据口
delay(1);
en=0;
}
//1602显示子程序
void LCD_Display(void)
{
//LCD第一行显示
lcd_wcom(0x80+0x01);
lcd_wdat('R');
lcd_wcom(0x80+0x02);
lcd_wdat('o');
lcd_wcom(0x80+0x03);
lcd_wdat('b');
lcd_wcom(0x80+0x04);
lcd_wdat('i');
lcd_wcom(0x80+0x05);
lcd_wdat('n');
lcd_wcom(0x80+0x06);
lcd_wdat('_');
lcd_wcom(0x80+0x07);
lcd_wdat('C');
lcd_wcom(0x80+0x08);
lcd_wdat('h');
lcd_wcom(0x80+0x09);
lcd_wdat('e');
lcd_wcom(0x80+0x0a);
lcd_wdat('n');
lcd_wcom(0x80+0x0b);
lcd_wdat('5');
lcd_wcom(0x80+0x0c);
lcd_wdat('5');
lcd_wcom(0x80+0x0d);
lcd_wdat('9');
//LCD第二行显示
lcd_wcom(0x80+0x42);
lcd_wdat(table[Data_H]);
lcd_wcom(0x80+0x43);
lcd_wdat(table[Data_L]);
}
//主函数
void main(void)
{
Init_UART(); //串口初始化
lcd_init(); //液晶初始化
while(1)
{
LCD_Display();
}
}
//
源文件:keil uv4 proteus7.10