找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6464|回复: 4
收起左侧

为什么lcd1602只显示一行白方块和一行暗方块

[复制链接]
ID:381035 发表于 2018-12-29 18:07 | 显示全部楼层 |阅读模式
//这是一个用ds18b20测温并用1602来显示的一个程序,仿真可以正常显示出来,但是就是实物出不来,调了对比度也还是这样
#include <reg51.h>
#define u8 unsigned char
#define u16 unsigned int
sbit rs=P3^0;
sbit rw=P3^6;
sbit e=P3^7;
sbit dq=P3^4;
u8 code tab1[]={"temperature show"};
u8 code tab2[]={" Temp Now:  . C "};

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

//--------------------------lcd1602----------------------------
void write_com(u8 com)//写指令
{  
        rs=0;
        P1=com;
        delay(5);
         rw=0;
         e=1;
         delay(5);
         e=0;
}

void write_dat(u8 dat)//写数据
{  
         rs=1;
        P1=dat;
        delay(5);
         rw=0;
         e=1;
         delay(5);
         e=0;
}

void lcd_init()//LCD初始化
{  u8 i;
         e=0;
         rw=0;
         write_com(0x38);
         delay(5);
         //write_com(0x08);
         write_com(0x0C);
         write_com(0x06);
         write_com(0x01);
         write_com(0x80);
         for(i=0;i<16;i++)
   {
                        write_dat(tab1[i]);
                 delay(20);
                }
         write_com(0xc0);
                for(i=0;i<16;i++)
        {
                write_dat(tab2[i]);
                delay(50);
        }
}
       
//-------------------------ds18b20-----------------------------
void ds_init()     
{
  u16 i;
  dq=0;
  i=103;
  while(i>0)
          i--; //延时大约480us~960us
  dq=1;
  i=4;
  while(i>0)
                i--; //延时大约60us~240us
}

bit read_dat()  //读一位数据     
{
   u16 i;
   bit dat;
   dq=0;
         i++;    //拉低大约1us左右      
   dq=1;
          i++;
          i++;
   dat=dq;                  //读回数据
   i=8;
        while(i>0)
                i--; //延时45ms左右
   return (dat);
}

u8 read_byte()   //18b20读一个字节函数
{
  u8 i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=read_dat();//读一位数据给j
    dat=(j<<7)|(dat>>1);   
  }
  return (dat);
        }

void write1()  //向18b20写入1
{          u16 i;
      dq=0;
      i++;
            i++;        //延时15us左右
      dq=1;
      i=8;
            while(i>0)
                                i--;
}

void write0()  //向18b20写入0
{            u16 i;
      dq=0;      
      i=8;
            while(i>0)
                           i--; //延时60us左右
      dq=1;
      i++;
                        i++;
}

void write_byte(u8 dat)//18b20写一个字节函数   
{
  u8 j;
  bit ceb;
  for(j=1;j<=8;j++)
  {
    ceb=dat&0x01;
    dat=dat>>1;
    if(ceb)     
    {
     write1();
    }
    else
    {
     write0();
    }

  }
        }

void wenduzh()          //18b20温度转换函数
{                                               
        ds_init();                        //1、初始化
  delay(1);                               
  write_byte(0xcc);          //跳过rom操作指令
  write_byte(0x44);          //温度转换命令
}

u16 cewendu()               
{
  u16 t;
  float t1;
  u8 a,b;
  ds_init();
  delay(1);
  write_byte(0xcc);//跳过ROM
  write_byte(0xbe);//读暂存器第9字节ram
  a=read_byte();//读第一个字节存于a
  b=read_byte();
  t=b;  //将整数部分赋给t
  t<<=8;            
  t=t|a;//整数小数合并
  t1=t*0.0625;
  t=t1*10+0.5;  //加0.5四舍五入
  return t;
}

void display(u16 dat,u8 m)
{
  u8 x,y,z;//定义温度显示数值的百位十位个位百分位
         
        x=dat/100+'0';   //百位
  y=(dat%100)/10;//十位
  z=dat%10;                 //个位               
  write_com(m);       
  write_dat(x);
  write_dat(y+0x30);
          write_com(m+3);
  write_dat(z+0x30);       

}
void main()
{ u16 tt1=0;
        lcd_init();       
        while(1)
        {        wenduzh();
                tt1=cewendu();
          display(tt1,0xca);//0xca使得读出来的温度的数值放在:后面
                delay(100);
        }         
}


IMG_20181229_173043.jpg
回复

使用道具 举报

ID:239611 发表于 2018-12-30 09:08 | 显示全部楼层
void write_com(u8 com)//写指令
void write_dat(u8 dat)//写数据
这两个函数延时加长试试,先都加到30,不行加到50试试。
回复

使用道具 举报

ID:381035 发表于 2019-1-2 09:29 | 显示全部楼层
botgs 发表于 2018-12-30 09:08
void write_com(u8 com)//写指令
void write_dat(u8 dat)//写数据
这两个函数延时加长试试,先都加到30, ...

没有用,我之前在别人调试好的板子上能够显示,但是到了自己的板子上就不行,现在是怎么都调不出来方块了
回复

使用道具 举报

ID:381035 发表于 2019-1-2 09:46 | 显示全部楼层
现在经过调节对比度可以显示左半屏了,但是右半屏不能显示,调节调不出来
回复

使用道具 举报

ID:767762 发表于 2020-6-28 14:13 | 显示全部楼层
Robust 发表于 2019-1-2 09:46
现在经过调节对比度可以显示左半屏了,但是右半屏不能显示,调节调不出来

请问下楼主的解决方法是什么我也遇到了这样的问题,麻烦告诉我下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表