51串口发送并在1602指定的位置显示

2020-01-26 12:48发布

写的不是很好,也希望和大家交流一下

/********************************************************************
* 文件名  : 串口接收试验.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);
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。