写的不是很好,也希望和大家交流一下
/********************************************************************
* 文件名 : 串口接收试验.c
* 描述 : 该程序从串口接收数据,通过LCD显示数据。在LCD的第一行显示出来,
当数据过多时(超过16个字符),LCD第一行将会被覆盖。
该试验使用的晶振是11.0592,如果使用12M晶振,会出现串口接收
不正常的情况。原因是用12M晶振,波特率9600时的误差率达 8%。
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar LED_Buffer[16], *q, com_dat; //从串口接收的数据
sbit E=P2^7; //1602使能引脚
sbit RW=P2^6; //1602读写引脚
sbit RS=P2^5; //1602数据/命令选择引脚
//***************
void Delay(uint del) //延时
{
while(i--);
}
/********************************************************************
* 名称 : Convert(uchar In_Date)
* 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
* 输入 : 1602资料上的值
* 输出 : 送到1602的值
***********************************************************************/
uchar Convert(uchar In_Date)
{
uchar i, Out_Date = 0, temp = 0;
for(i=0; i<8; i++)
{
temp = (In_Date >> i) & 0x01;
Out_Date |= (temp << (7 - i));
}
return Out_Date;
}
//********************************************************************
void enable(uchar del) //使能
{
P0 = Convert(del);
RS = 0;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
//********************************************************************
void write(uchar del) //写数据
{
P0 = Convert(del);
RS = 1;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
//********************************************************************
void L1602_init(void) //1602初始化
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
//********************************************************************
void L1602_string(uchar hang,uchar lie,uchar *p)//从指定的位置开始显示
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
if(*p == ' ') break;
write(*p);
p++;
}
}
//********************************************************************
void Com_Int(void) interrupt 4 //串口中断子函数
{
EA = 0;
if(RI == 1)
{
LED_Buffer[com_dat] = SBUF;
RI = 0;
com_dat++;
if(com_dat == 16) com_dat = 0;
}
EA = 1;
}
//********************************************************************
void Com_Init(void) //串口初始化,晶振11.0592,波特率9600
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
ES = 1;
EA = 1;
}
//********************************************************************
void Main()
{
uchar i = 0, com_dat = 0;
L1602_init();
Delay(100);
Com_Init();
P2 = 0x00;
while(1)
{
q = LED_Buffer;
L1602_string(1,1,q);
com_dat = 0;
Delay(100);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>