找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5219|回復(fù): 4
收起左側(cè)

LCD1602無法正常顯示

[復(fù)制鏈接]
ID:487358 發(fā)表于 2019-3-9 13:52 | 顯示全部樓層 |閱讀模式
做的是汽車智能雨刷器,上電后液晶屏第一行顯示黑色方塊,第二行不顯示,用下面的程序仿真可以實(shí)現(xiàn),實(shí)物圖就不行了,其他功能都正常。求各位大神幫忙看一下哪里出問題了。
#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[]=                                   //正轉(zhuǎn)數(shù)據(jù)
        {
                0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
        };


  uchar fz[]=                                   //反轉(zhuǎn)數(shù)據(jù)
        {
                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操作時(shí)序情況1602課件下中文使用說明基本操作時(shí)序章節(jié)
        LCD1602_DB = cmd;//寫入命令
        LCD1602_EN = 1;         //拉高使能端 數(shù)據(jù)被傳輸?shù)絃CD1602內(nèi)
        LCD1602_EN = 0;         //拉低使能以便于下一次產(chǎn)生上升沿
}
/*=================================================
*函數(shù)名稱:LCD1602_Write_Dat
*函數(shù)功能:寫LCD1602數(shù)據(jù)
*調(diào)用:Read_Busy();
*輸入:dat:需要寫入的數(shù)據(jù)
=================================================*/
void LCD1602_Write_Dat(uchar dat)
{
        Read_Busy();
        LCD1602_RS = 1;
        LCD1602_RW = 0;
        LCD1602_DB = dat;
        LCD1602_EN = 1;
        LCD1602_EN = 0;
}
/*=================================================
*函數(shù)名稱:LCD1602_Dis_OneChar
*函數(shù)功能:在指定位置顯示一個(gè)字符
*調(diào)用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();       
*輸入:x:要顯示的橫坐標(biāo)取值0-40,y:要顯示的行坐標(biāo)取值0-1(0為第一行,1為第二行)
                dat:需要顯示的數(shù)據(jù)以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毫秒定時(shí)
        }

void time_1(void) interrupt 1
{
   TH0=0x3c;
   TL0=0xb0;
   ms_1++;  
        if(i<10)
           {
                i++;
                dat1+=A_D(0);               //滿量程0-255   實(shí)際完全浸入水中是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
(SQ0X{K80X910XX6FO@A6PT.png
回復(fù)

使用道具 舉報(bào)

ID:96682 發(fā)表于 2019-3-9 23:02 | 顯示全部樓層
圖上 R1 可以去掉,RV1 RP1 阻值要恰當(dāng)并調(diào)好對(duì)比度,再檢查電路是否還有其它問題
回復(fù)

使用道具 舉報(bào)

ID:234075 發(fā)表于 2019-3-10 00:29 | 顯示全部樓層
LCD1602仿真程序在實(shí)際運(yùn)行時(shí),需要在LCD1602的子函數(shù)中加入適當(dāng)延時(shí),以等待器件處理。例如      
        LCD1602_RS = 0;
        LCD1602_RW = 0;        //拉低RS、RW操作時(shí)序情況1602課件下中文使用說明基本操作時(shí)序章節(jié)
        延時(shí);
        LCD1602_DB = cmd;//寫入命令
        LCD1602_EN = 1;         //拉高使能端 數(shù)據(jù)被傳輸?shù)絃CD1602內(nèi)
       延時(shí);
        LCD1602_EN = 0;         //拉低使能以便于下一次產(chǎn)生上升沿
回復(fù)

使用道具 舉報(bào)

ID:234075 發(fā)表于 2019-3-10 00:30 | 顯示全部樓層
最好在網(wǎng)上找個(gè)例程(很多。瑓⒖家幌
回復(fù)

使用道具 舉報(bào)

ID:393699 發(fā)表于 2019-3-10 12:47 | 顯示全部樓層
仿真可以的話就,檢查下屏幕對(duì)比度的設(shè)置?1602屏幕種類很多,每個(gè)屏幕的對(duì)比度調(diào)節(jié)都不一樣的,對(duì)比度過大就會(huì)出現(xiàn)一大堆方塊了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表