找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4612|回复: 4
打印 上一主题 下一主题
收起左侧

LCD1602无法正常显示

[复制链接]
跳转到指定楼层
楼主
做的是汽车智能雨刷器,上电后液晶屏第一行显示黑色方块,第二行不显示,用下面的程序仿真可以实现,实物图就不行了,其他功能都正常。求各位大神帮忙看一下哪里出问题了。
#include <REGX52.H>
#include <ADC0832.H>
#include <LCD1602.H>          
#include <eeprom52.H>

uchar i=0;
uint dat;
uint dat1=0;
uint dat2=0;
uint dat_value=0;
uint DJ_dat=0,ms=0,ms_1=0;
uchar loop=0;

sbit key_1=P3^1;
sbit key_2=P3^2;
sbit key_3=P3^3;
sbit key_4=P3^4;


sbit led0=P2^0;
sbit led1=P2^1;





bit key_1_flag=0;
bit key_2_flag=0;
bit key_3_flag=0;
bit key_4_flag=0;

bit A_M=1;
uchar speed_flag=0;

uint Value=1000;
uint water_h=0;
uint water_l=0;
uchar state=0;
bit  star_off=1,zheng_fan=1,s0=0,ir_on=0;



  uchar zz[]=                                   //正转数据
        {
                0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
        };


  uchar fz[]=                                   //反转数据
        {
                0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01
        };





void display()
  {
        void LCD1602_Write_Cmd(uchar cmd)
{
        Read_Busy();         //判断忙,忙则等待
        LCD1602_RS = 0;
        LCD1602_RW = 0;        //拉低RS、RW操作时序情况1602课件下中文使用说明基本操作时序章节
        LCD1602_DB = cmd;//写入命令
        LCD1602_EN = 1;         //拉高使能端 数据被传输到LCD1602内
        LCD1602_EN = 0;         //拉低使能以便于下一次产生上升沿
}
/*=================================================
*函数名称:LCD1602_Write_Dat
*函数功能:写LCD1602数据
*调用:Read_Busy();
*输入:dat:需要写入的数据
=================================================*/
void LCD1602_Write_Dat(uchar dat)
{
        Read_Busy();
        LCD1602_RS = 1;
        LCD1602_RW = 0;
        LCD1602_DB = dat;
        LCD1602_EN = 1;
        LCD1602_EN = 0;
}
/*=================================================
*函数名称:LCD1602_Dis_OneChar
*函数功能:在指定位置显示一个字符
*调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();       
*输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)
                dat:需要显示的数据以ASCLL形式显示
=================================================*/
void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
{
        if(y)        x |= 0x40;
        x |= 0x80;
        LCD1602_Write_Cmd(x);
        LCD1602_Write_Dat(dat);               
}

                   LCD1602_write(0,0x80);
               LCD1602_writebyte("Water:");
                   if(dat>99) LCD1602_write(1,0x30+dat/100%10);
                        else             LCD1602_write(1,' ');
                   if(dat>9)  LCD1602_write(1,0x30+dat/10%10);  
                        else             LCD1602_write(1,' ');
                   LCD1602_write(1,0x30+dat%10);
               LCD1602_writebyte("% ");
                   if(A_M==0) LCD1602_writebyte("A ");
                   else       LCD1602_writebyte("M ");

                   if(star_off==0) LCD1602_writebyte("K ");
                   else       LCD1602_writebyte("G ");
                   LCD1602_write(1,0x30+speed_flag%10);
                   LCD1602_writebyte(" ");
                       
                   dat_value=dat;
                   LCD1602_write(0,0xC0);
               LCD1602_writebyte("H:");
                   if(state==1&&s0) LCD1602_writebyte("   ");
                   else                                                               
                    {
                           if(water_h>99) LCD1602_write(1,0x30+water_h/100%10);
                                else             LCD1602_write(1,' ');
                            if(water_h>9)  LCD1602_write(1,0x30+water_h/10%10);  
                                else             LCD1602_write(1,' ');
                           LCD1602_write(1,0x30+water_h%10);                          
                        }
                         LCD1602_writebyte("%    ");                                     
               LCD1602_writebyte("L:");
                   if(state==2&&s0) LCD1602_writebyte("   ");
                   else
                    {
                           if(water_l>99) LCD1602_write(1,0x30+water_l/100%10);
                                else             LCD1602_write(1,' ');
                            if(water_l>9)  LCD1602_write(1,0x30+water_l/10%10);  
                                else             LCD1602_write(1,' ');
                           LCD1602_write(1,0x30+water_l%10);                               
                        }
                         LCD1602_writebyte("%");          
  }
void key_dispose()
{
   if(key_1==0)
     {
            LCD1602_delay(20);
      if(key_1_flag)
             {
                           key_1_flag=0;
                         state=(state+1)%3;
                   }
         }
         else key_1_flag=1;

   if(key_2==0)
     {
              LCD1602_delay(20);
           if(key_2_flag)
             {
                          key_2_flag=0;
                        if(state==1)
                          {
                           if(water_h<100)       water_h++;
                            SectorErase(0x2000);
                            byte_write(0x2000,water_h);
                          }
                        if(state==2)
                         {
                           if(water_l<water_h-1) water_l++;
                            SectorErase(0x2200);
                            byte_write(0x2200,water_l);
                         }
                        if(state==0)
                         {
                           A_M=~A_M;   star_off=1;
                         }
                 }
         }
         else           key_2_flag=1;

   if(key_3==0)
     {
           LCD1602_delay(20);
           if(key_3_flag)
             {
                          key_3_flag=0;
                        if(state==1)
                          {
                           if(water_h>water_l+1) water_h--;
                            SectorErase(0x2000);
                            byte_write(0x2000,water_h);
                          }
                        if(state==2)
                         {
                           if(water_l>0)         water_l--;
                            SectorErase(0x2200);
                            byte_write(0x2200,water_l);
                         }
                        if(state==0)
                         {
                           if(A_M==1)
                            {
                                  star_off=~star_off;
                                  if(star_off==0) speed_flag=1;
                                  else                           speed_flag=0;
                                }
                         }        
                 }
         }
         else key_3_flag=1;
   if(key_4==0)
     {
           LCD1602_delay(20);
           if(key_4_flag)
             {
                  key_4_flag=0;
                  if(A_M)
                   {
                     speed_flag=(speed_flag+1)%3;
                    
                   }
                 }
         }
         else key_4_flag=1;


         if(A_M==0)
          {
            led0=0;
                led1=1;
          }
          else
           {
            led1=0;
                led0=1;

           }

          if(speed_flag==2)
          {
             Value=260;
          }
          else  if(speed_flag==1||speed_flag==0)
           {
             Value=500;
           }



}


void police_dispose()               
{        ir_on=0;
    if(dat_value>water_h)
            {
                  star_off=0; speed_flag=2;
                }
        else  if(dat_value>=water_l&&dat_value<=water_h)
                 {
                   star_off=0; speed_flag=1;                                    
                 }
    else if(dat_value<water_l)
             {
                  star_off=1;         speed_flag=0;  
                 }

}

void main()
{

   water_h=byte_read(0x2000);
   water_l=byte_read(0x2200);
   if(water_h<water_l||water_h>100||water_l<0)
    {
          water_h=60;
          water_l=10;
        }


   TMOD=0x11;
   TH1=0x3c;
   TL1=0xb0;
   TH0=0x3c;
   TL0=0xb0;
   ET1=1;

    ET0=1;
   EA=1;

   TR0=1;
   TR1=1;
   LCD1602_cls();
   while(1)
    {
           if(A_M==0)
            { police_dispose();      
                  if(star_off==0)
                   {         
                                  
                                      if(DJ_dat==0) loop=0;
                                 while(DJ_dat<180)
                                                {
                                                        P1=P1&0xf0|zz[loop];                                                       
                                                        loop=(loop+1)%8;
       
                                                        if(loop==0) DJ_dat++;
                                                        LCD1602_delay(Value);                                       
                                                }                  
                                         if(DJ_dat==120)loop=0;
                                         while(DJ_dat!=0)
                                                {
                                                        P1=P1&0xf0|fz[loop];
                                                        loop=(loop+1)%8;
                                               
                                                        if(loop==0) DJ_dat--;
                                                        LCD1602_delay(Value);
                                                }
                                            
                                  }                  
                }
                else
                {       

                        if(speed_flag!=0)
                         {
                                  if(star_off==0)
                                   {         
                                                  
                                                      if(DJ_dat==0) loop=0;
                                                 while(DJ_dat<180)
                                                                {
                                                                        P1=P1&0xf0|zz[loop];                                                       
                                                                        loop=(loop+1)%8;
                       
                                                                        if(loop==0) DJ_dat++;
                                                                        LCD1602_delay(Value);                                       
                                                                }                  
                                                         if(DJ_dat==120)loop=0;
                                                         while(DJ_dat!=0)
                                                                {
                                                                        P1=P1&0xf0|fz[loop];
                                                                        loop=(loop+1)%8;
                                                               
                                                                        if(loop==0) DJ_dat--;
                                                                        LCD1602_delay(Value);
                                                                }                    
                                                  }       
                         }
                         else
                          {
                              loop=0;  DJ_dat=0;
                          }



                }                  
           }          
          //1毫秒定时
        }

void time_1(void) interrupt 1
{
   TH0=0x3c;
   TL0=0xb0;
   ms_1++;  
        if(i<10)
           {
                i++;
                dat1+=A_D(0);               //满量程0-255   实际完全浸入水中是255-36= 219     0-219  
       }
        else
           {
          i=0;  
                  dat1=dat1/10;
                  if(dat1<=36)   dat1=36;
                  dat1=dat1-36;
                  dat=100-(dat1/2.19);                           dat1=0;                 
       }
   if(ms_1>=10)         
    {
          ms_1=0;
          s0=~s0;

        }       
}

void time_0(void) interrupt 3
{

   TH1=0x3c;
   TL1=0xb0;
         display();
         key_dispose();

}


(U4S0G6[%5%VG8P79CMBPWW.png (43.5 KB, 下载次数: 7)

(U4S0G6[%5%VG8P79CMBPWW.png

(SQ0X{K80X910XX6FO@A6PT.png (44.73 KB, 下载次数: 12)

(SQ0X{K80X910XX6FO@A6PT.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96682 发表于 2019-3-9 23:02 | 只看该作者
图上 R1 可以去掉,RV1 RP1 阻值要恰当并调好对比度,再检查电路是否还有其它问题
回复

使用道具 举报

板凳
ID:234075 发表于 2019-3-10 00:29 | 只看该作者
LCD1602仿真程序在实际运行时,需要在LCD1602的子函数中加入适当延时,以等待器件处理。例如      
        LCD1602_RS = 0;
        LCD1602_RW = 0;        //拉低RS、RW操作时序情况1602课件下中文使用说明基本操作时序章节
        延时;
        LCD1602_DB = cmd;//写入命令
        LCD1602_EN = 1;         //拉高使能端 数据被传输到LCD1602内
       延时;
        LCD1602_EN = 0;         //拉低使能以便于下一次产生上升沿
回复

使用道具 举报

地板
ID:234075 发表于 2019-3-10 00:30 | 只看该作者
最好在网上找个例程(很多啊),参考一下
回复

使用道具 举报

5#
ID:393699 发表于 2019-3-10 12:47 | 只看该作者
仿真可以的话就,检查下屏幕对比度的设置?1602屏幕种类很多,每个屏幕的对比度调节都不一样的,对比度过大就会出现一大堆方块了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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