STC52单片机串口通信与1602LCD的问题

2019-07-15 10:16发布

这是我写的将串口接收的信息 发到1602LCD上不过显示有问题
tinghei SC, Microsoft YaHei, arial, 宋体, sans-serif, tahoma">#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char


sbit lcden = P3^4;
sbit lcdrs = P3^5;
sbit lcdrw = P3^6;
sbit dula = P2^6;         //关闭数码管  避免因为USB供电不足  导致显示问题
sbit wela = P2^7;


uint flag;
uchar receive,temp;
void wr_com(uchar com);
void wr_data(uchar dat);
void init();
void delay(uint z);


void main()
{
        init();
        while(1)
        {
                if(flag==1)
                {
                        flag=0;
                         wr_data(receive);
                        ES = 0;
                        while(!RI);
                        TI = 0;
                        ES = 1;
                }
        }


}


void init()
{
                //关闭数码管
        dula = 0;                 
        wela = 0;
        
                //LCD 使能初始化
        lcden = 0;        
        wr_com(0x38);  //显示模式设置
        wr_com(0x0f);        //显示光标设置(闪烁/不闪)
        wr_com(0x06);        //光标 整屏设置
        wr_com(0x01);        //清零
        wr_com(0x80);         //数据指针初始化




        //串口初始化
        REN = 1;
        SM1 = 1;
        TR1 = 1; //定时器打开
        TMOD = 0X20; //定时器1 工作方式2
        TH1 = 0xfd; //9600 波特率
        TL1 = 0xfd;
        EA = 1; //总中断打开
        ES = 1; //串行口中断打开


}


void wr_com(uchar com)
{
          lcdrs = 0;
          lcdrw = 0;
         
          P0 = com;
          delay(5);
          lcden = 1;
          delay(5);
          lcden = 0;




}
void wr_data(uchar dat)
{
          lcdrs = 1;
         
          P0 = dat;
          delay(5);
          lcden = 1;
          delay(5);
          lcden = 0;
}


void delay(uint z)
{
        uint x;
        uchar y;
        for(x=z;x>0;x--)
                for(y=120;y>0;y--);        
}
void  ser() interrupt 4
{
        if(RI){
        RI = 0;
        receive = SBUF;
        flag = 1;


        }
}


搜狗截图17年07月12日1013_1.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
人中狼
1楼-- · 2019-07-15 23:25
 精彩回答 2  元偷偷看……
wulinwl
2楼-- · 2019-07-15 23:41
z674195564 发表于 2017-7-12 11:02
那从串口接收的 字符 要怎么转换

如果显示1个字符0~f
        write_com(0x80+0);
        write_date(table1[receive]);
如果显示3个字符0~255
        write_com(0x80+0);
        write_date(table1[receive/100]);//百
        write_com(0x80+1);
        write_date(table1[receive%100/10]);//十
        write_com(0x80+2);
        write_date(table1[receive%10]);//个
z674195564
3楼-- · 2019-07-16 02:11
本帖最后由 z674195564 于 2017-7-12 11:38 编辑
wulinwl 发表于 2017-7-12 11:29
如果显示1个字符0~f
        write_com(0x80+0);
        write_date(table1[receive]);

这样的话 如果是发送多个字符的话会非常麻烦的啊  
人中狼
4楼-- · 2019-07-16 06:39
z674195564 发表于 2017-7-12 11:35
这样的话 如果是发送多个字符的话会非常麻烦的啊

按16进制数来显示,一个字节显示两位数,如0x3a,则显示3a。
按10进制数来显示,一个字节显示三位数,如0x3a,则显示058。
按ASCII码来显示,一个字节显示一位数,如0x41,则显示A。
显示内容和显示方式有你的数据类型和格式定义来决定。
王海洋001
5楼-- · 2019-07-16 11:44
我建议楼主把1602和串口的驱动写成.c和.h的头文件,方便调用函数来写主程序,这样程序看起来比较清爽。
将军问鼎
6楼-- · 2019-07-16 17:24
 精彩回答 2  元偷偷看……

一周热门 更多>