打印
[应用相关]

LCD1602为什么会显示乱码

[复制链接]
2183|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shashaa|  楼主 | 2018-6-7 22:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
LCD1602为什么会显示乱码?单片机程序是这样的!
#include<reg52.h>   
#include <intrins.h>  
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^5;            //1602的数据/指令选择控制线
sbit rw=P2^6;           //1602的读写控制线
sbit en=P2^7;          //1602的使能控制线
sbit trig=P3^0;      //超声波测距模块Trig
sbit echo=P3^1;     //超声波测距模块Echo
bit flag1;         //触发信号标志位//
uchar count;           //中断累加变量
long int distance;    //测量所得距离
unsigned char code table[ ]={"0123456789"}; //定义字符数组显示数字

void delay(uint n)                          
{
    uint x,y;
    for(x=n;x>0;x--)
    for(y=110;y>0;y--);
}


void delayt(uint x)
{
    uchar j;
    while(x-- > 0)
    {
              for(j = 0;j < 125;j++)
        {
          ;
        }
    }
}


void lcd_wcom(uchar com)           
{
    rs=0;                //选择指令寄存器
    rw=0;               //选择写
    P0=com;            //把命令字送入P0
    delay(5);         //延时一小会儿,让1602准备接收数据
    en=1;            //使能线电平变化,命令送入1602的8位数据口,这点非常重要
    en=0;
}


void lcd_wdat(uchar dat)      
{
    rs=1;             //选择数据寄存器
    rw=0;            //选择写
    P0=dat;         //把要显示的数据送入P0
    delay(5);      //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。
    en=1;         //使能线电平变化,数据送入1602的8位数据口
    en=0;
  }


void lcd_init()            
{
    lcd_wcom(0x38);       //8位数据,双列,5*7字形  ,用到功能设定指令   
    lcd_wcom(0x0c);      //开启显示屏,关光标,光标不闪烁,用到显示开关控制指令
    lcd_wcom(0x06);     //显示地址递增,即写一个数据后,显示位置右移一位,用到了写入模式设置指令
    lcd_wcom(0x01);    //清屏,用到了清屏指令
}


void lcd_xianshi()            
{
    lcd_wcom(0x80+0x40);
        lcd_wdat('D');
        lcd_wdat('i');
        lcd_wdat('s');
        lcd_wdat('t');
        lcd_wdat('a');
        lcd_wdat('n');
        lcd_wdat('c');
        lcd_wdat('e');
        lcd_wdat(':');
        lcd_wcom(0x80+0x4c);//
        lcd_wdat('.');
        lcd_wcom(0x80+0x4e);//单位是厘米//
        lcd_wdat('c');
        lcd_wdat('m');
}


void init_t0()
{
        TMOD=0x01;        
         TL0=0x66;
        TH0=0xfc;              //1ms
    ET0=1;            
        EA=1;                     
}


void trigger()
{
    trig=0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
        trig=1;      
}


void init_measuring()
{
        trig=1;
        echo=1;
        count=0;
}


void measuring()
{
        uchar l;
        uint h,y;
        TR0 = 1;
        while(echo==1)
    {
        ;
    }      
        TR0 = 0;
        l = TL0;
        h = TH0;
        y = (h << 8) + l;
        y = y - 0xfc66;//us部分
        distance = y + 1000 * count;//计算总时间,单位是微秒
        TL0 = 0x66;
        TH0 = 0xfc;
        delayt(30);
        distance = 3453* distance / 20000;//原始为:(0.34毫米/us)*时间/2//      
}


void display(uint x)
{
        uchar qian,bai,shi,ge;
        qian=x/1000;
        bai=(x/100);
        shi=(x/10);
        ge=x;
        lcd_wcom(0x80+0x49);//单位是厘米//
        lcd_wdat(table[qian]);
        lcd_wdat(table[bai]);
        lcd_wdat(table[shi]);
        lcd_wcom(0x80+0x4d);
        lcd_wdat(table[ge]);
}

void main()           
{   lcd_init();          //液晶初始化      
    init_t0();          //定时器0初始化  
        init_measuring();  //超声波相应端口初始化

        while(1)
        {
         lcd_xianshi();   //液晶显示特定字符
         trigger();      //触发超声波启动
          while(echo==0)          //等待回声
          {
             ;
          }
            measuring();           //进行距离测量
            display(distance);    //对测量结果进行显示
            init_measuring();    //超声波相应端口初始化
            delayt(600);        //每次测量间隔60ms
        }
}

//……………………………………………中断服务函数…………………………………………………//
void T_0()interrupt 1
{
        TF0 = 0;
        TL0 = 0x66;
        TH0 = 0xfc;
        count++;
        if(count==18)
        {
          TR0 =0;
          TL0 = 0x66;
          TH0 = 0xfc;
          count = 0;
        }
}
沙发
qiangweii| | 2018-6-7 22:23 | 只看该作者
单凭那么多NOP就可把该程序枪毙了!

使用特权

评论回复
板凳
litengg| | 2018-6-7 22:23 | 只看该作者
网上找例程看看。检查一下时序

使用特权

评论回复
地板
androidbus| | 2018-6-7 22:27 | 只看该作者
这个不明白你说的什么啊??

使用特权

评论回复
5
feiqi1| | 2018-6-7 22:27 | 只看该作者
我也出现过这种情况,但是由于硬件问题,1602的2脚和15脚加的电位器

使用特权

评论回复
6
xia00| | 2018-6-7 22:31 | 只看该作者
qian=x/1000;
        bai=(x/100);
        shi=(x/10);
        ge=x;

使用特权

评论回复
7
hfdy01| | 2018-6-7 22:31 | 只看该作者
xia00 发表于 2018-6-7 22:31
qian=x/1000;
        bai=(x/100);
        shi=(x/10);

这是字符显示重叠了啊!!

使用特权

评论回复
8
捉虫天师| | 2018-6-7 22:32 | 只看该作者
是你没有弄好,你用的什么单片机?

使用特权

评论回复
9
CallReceiver| | 2018-6-7 22:36 | 只看该作者
很有可能是计算有问题!哈哈

使用特权

评论回复
10
boy1990| | 2018-6-7 22:36 | 只看该作者
你说的乱码,具体是什么样子,发图片看下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

142

主题

1494

帖子

6

粉丝