OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 51单片机驱动的LCD1602只显示方格,WHY?

共6条 1/1 1 跳转至

51单片机驱动的LCD1602只显示方格,WHY?

工程师
2020-09-29 22:12:12    评分

最近我做一个温度显示计,传感器用的DS18b20,程序写完了在开发板上试了结果液晶屏上是这个样子,不知道是咋回事,有人能帮忙看一下么? 拜托了!


以下是我当前的程序源码:

第一次写,可能有很多漏洞什么的,还请多多指教

单片机源程序如下:
#include <reg52.h>
#include <intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;

#define LCD1602 P0


sbit DS = P3^7;      //定义DS18B20的端口
sbit RS = P2^6;                 //lcd1602寄存器
sbit RW = P2^5;                  //读写
sbit EN = P2^7;                   //片选



void delay_us(u16 i)         //微秒延时函数        ,不精确延时,i=1大约为10us
{
    while(i--);
}

void delay1ms(u16 ms)                 //1毫秒延时函数
{
    u16 i,j;
        for (i=0;i<ms;i++);
        for(j=0;j<120;j++);
}

void delay(u16 x)       //延时函数
{
        u16 i;
        for(i=x;i>0;i--);
}


u8 DS18B20_CS()                 //DS18B20初始化
{
    bit x;
    u8 i = 0;                  
    DS = 0;                                //拉低总线
        i = 70;
        while(i--);      //延时642us
        DS = 1;
        i = 0;
        delay_us(7);
        x = DS;
        delay_us(15);
        DS = 1;
        _nop_();
    return(x);
}

void DS18B20_XSX(u8 i)        //DS18B20写时序
{
    u8  y;
        for(y=0;y<8;y++)
           {
             DS = 1;                                
                 _nop_();
                 DS = 0;
                 DS = i&0x01;
                 delay_us(7);
                 DS = 1;
                 _nop_();
                 _cror_(i,1);           
           }
}

u8 DS18B20_DSX()            //读时序
{
     u8 x,y,z;
         for(x=0;x<8;x++)
           {
               DS = 0;
                   _nop_();
                   DS = 1;
                   _nop_();
                   y = DS;
                   delay_us(7);
                   DS = 1;
                   _nop_();
                   z = (y<<7)|(z>>1);        //从最低位开始读取,循环8位
           }
           return(z);
}

void DS18B20_change()       //转换温度
{
     DS18B20_CS();
         delay1ms(1);
         DS18B20_XSX(0xcc);
     DS18B20_XSX(0x44);
}

void DS18B20_FS()           //发送温度
{
      DS18B20_CS();
          delay1ms(1);
          DS18B20_XSX(0xcc);
          DS18B20_XSX(0xbe);   
}

int DS18B20_DQ()                 //读取温度
{
     int temp = 0;
         u8 H,L;
         DS18B20_change();
         DS18B20_FS();
         L=DS18B20_DSX();  //从低8位开始读
         H=DS18B20_DSX();   //高8位
         temp = H;
         temp<<=8;
         temp |= L;
         return temp;   
}

void LCD1602_com(u8 com)                 //LCD1602写指令函数
{
           RS = 0;
           RW = 0;
           EN = 0;
           P0 = com;
           delay1ms(1);
           EN = 1;
           delay1ms(5);
           EN = 0;
}

void LCD1602_dat(u8 dat)     //写数据函数
{
     P0 = dat;       //送出时序
         RS = 1;
         RW = 0;
         EN = 1;
         delay(200);
         EN = 0;
}

void LCD1602_init()                //初始化
{
     LCD1602_com(0x01);   //初始化
         LCD1602_com(0x38);     //清屏
         LCD1602_com(0x0c);      //开显示。不显示光标
         LCD1602_com(0x06);     //地址加1写入数据时光标右移
     LCD1602_com(0x87);                  //起始位置
}

void LCD1602_disp(int temp)                //显示函数
{
     u8  table[] ={0,0,0,0};
         float i;         
         LCD1602_com(0x80);
         i = temp;
         temp = i*0.0625*10+0.5;
         table[0]=temp/100;
         table[1]=temp/10%10;
         table[2]=temp%10;
         LCD1602_com(0x87);    //显示第一位数的位置
         LCD1602_dat('0'+table[0]);
         LCD1602_com(0x88);       //显示个位
         LCD1602_dat('0'+table[1]);
         LCD1602_com(0x89);      //显示小数点
         LCD1602_dat('.');
         LCD1602_com(0x0A);      //小数后一位
         LCD1602_dat('0'+table[2]);
         delay(50);
}

void main()
{
     LCD1602_init();
         LCD1602_com(0x88);
         while(1)
         {
              LCD1602_disp( DS18B20_DQ());
         }
}






关键词: LCD1602     单片机     LCD     液晶屏    

工程师
2020-09-29 22:20:44    评分
2楼

改成这样看看:        LCD1602_com(0x8A);      //小数后一位


工程师
2020-09-29 22:24:24    评分
3楼

0x8A,是绝对移位的指令;
0x0A,有关闭显示的功效;
1602是个很容易上手的东东,但自定义字符只有8个且分辨率呵呵。用得多的话可以搞个4+2线标准的程序用着方便,这东东上电后调节对比度貌似都可以显示小方块。


工程师
2020-09-29 22:36:21    评分
4楼

你可以试试电位器调下对比度,  程序我看没有什么问题。


工程师
2020-09-29 23:29:39    评分
5楼

大家说的都挺不错


工程师
2020-10-01 23:52:52    评分
6楼

不太明白哎


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]