找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

LCD1602顯示問題,正面看看不見東西,側(cè)面看可以,但不明顯

[復(fù)制鏈接]
ID:335625 發(fā)表于 2018-7-26 14:24 | 顯示全部樓層 |閱讀模式
這個是我改的郭天祥的一個程序,下載到板子上正面看看不見東西,側(cè)面看可以,但不明顯,下載板子自帶的程序液晶顯示沒有問題,是不是我的程序的問題啊。求大佬指點迷津。
B582094F9BEF990BEB93BFD0CC67162D.jpg 39586CBD4AAAC25E8639418E821DE871.jpg 80B6A9DE70B9871D7F8872B520AED345.jpg
#include <reg52.h>
#include <intrins.h>

#define uchar  unsigned char
#define uint   unsigned int
sbit LCD_RS = P1^0;            
sbit LCD_EN = P1^5;
sbit beep = P1^6;
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

uchar data  RXDdata[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
                          0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20 };
uchar temp,buf,m,count;
bit   playflag=0;
uchar code  cdis1[ ] = {" SERILA TRANFER "};
uchar code  cdis2[ ] = {"                "};
/**********************************************************
延時子程序
**********************************************************/
void delay1(uint ms)
{
   uchar k;
   while(ms--)
   {
     for(k = 0; k < 120; k++);
   }
}
/******************************************************************/
/*                                                                */
/*檢查LCD忙狀態(tài)                                                   */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。     */
/*                                                                */
/******************************************************************/
bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
//    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);//將P0^7的狀態(tài)賦給result
    LCD_EN = 0;
    return(result);
}
/*******************************************************************/
/*                                                                 */
/*寫指令數(shù)據(jù)到LCD                                                  */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)//寫指令
{                          
//  while(lcd_busy());
    LCD_RS = 0;
  //  LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}

void lcd_wdat(uchar dat)
{                          
//   while(lcd_busy());
    LCD_RS = 1;
  //  LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}
/*******************************************************************/
/*                                                                 */
/*  LCD初始化設(shè)定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init()
{
    delay1(15);   
    lcd_wcmd(0x01);      //清除LCD的顯示內(nèi)容            
    lcd_wcmd(0x38);      //16*2顯示,5*7點陣,8位數(shù)據(jù)
    delay1(5);
    lcd_wcmd(0x38);         
    delay1(5);
    lcd_wcmd(0x38);         
    delay1(5);
    lcd_wcmd(0x0c);      //開顯示,顯示光標,光標閃爍
    delay1(5);
    lcd_wcmd(0x01);      //清除LCD的顯示內(nèi)容
    delay1(5);
}
/*******************************************************************/
/*                                                                 */
/*  設(shè)定顯示位置                                                   */
/*                                                                 */
/*******************************************************************/
void lcd_pos(uchar pos)
{                          
  lcd_wcmd(pos | 0x80);  //數(shù)據(jù)指針=80+地址變量
}
/*********************************************************
  發(fā)送數(shù)據(jù)函數(shù)
*********************************************************/
void senddata(uchar dat)
{
     SBUF =dat;
     while(!TI);
     TI = 0;
}
/*********************************************************
  串行中斷服務(wù)函數(shù)
*********************************************************/
void  serial() interrupt 4
{
   ES = 0;                //關(guān)閉串行中斷
   RI = 0;                //清除串行接受標志位
   buf = SBUF;            //從串口緩沖區(qū)取得數(shù)據(jù)
     
   switch(buf)
   {
      case 0x31:  senddata('T');break;  //接受到1,發(fā)送字符'T'給計算機         
      case 0x32:  senddata('X');break;  //接受到2,發(fā)送字符'X'給計算機      
      case 0x33:  senddata('-');break;  //接受到3,發(fā)送字符'-'給計算機      
      case 0x34:  senddata('M');break;  //接受到4,發(fā)送字符'M'給計算機      
      case 0x35:  senddata('C');break;  //接受到5,發(fā)送字符'C'給計算機           
      case 0x36:  senddata('U');break;  //接受到6,發(fā)送字符'U'給計算機
   case 0x37:  beep = ~beep;break;               
      default:    senddata(buf);break;  //接受到其它數(shù)據(jù),將其發(fā)送給計算機         
   }
   if(buf!=0x0D)
   {   
     if(buf!=0x0A)
     {
       temp =buf;
       if(count<16)
       {         
         RXDdata[count]=temp;
         count++;
   if(count==16)
    playflag=1;
       }
     }
   }
   ES = 1;    //允許串口中斷
}
/*********************************************************
  數(shù)據(jù)顯示函數(shù)
*********************************************************/
void  play()
{
   if(playflag)
   {
     lcd_pos(0x40);           //設(shè)置位置為第二行
     for(m=0;m<16;m++)
     {
   lcd_wdat(cdis2[m]);      //清LCD1602第二行
  delay1(5);
  }
  lcd_pos(0x40);           //設(shè)置位置為第二行
     for(m=0;m<16;m++)
     {
    //   lcd_pos(0x40+m);       //設(shè)置顯示位置為第二行
       lcd_wdat(RXDdata[m]);  //顯示字符
    delay1(5);
     }
     playflag=0;              
     count=0x00;
     for(m=0;m<16;m++)      
     {
   RXDdata[m]=0x20;         //清顯存單元   
  delay1(5);
  }
   }               
}
/*********************************************************
  主函數(shù)
*********************************************************/
void main(void)
{
    P0 = 0xff;
    P2 = 0xff;         
   
    SCON=0x50;           //設(shè)定串口工作方式
    PCON=0x00;           //波特率不倍增
   
    TMOD=0x20;           //定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率
    EA=1;
    ES = 1;              //允許串口中斷
    TL1=0xfd;
    TH1=0xfd;             //波特率9600
    TR1=1;
    lcd_init();
    lcd_pos(0x00);        //設(shè)置顯示位置為第一行
    for(m=0;m<16;m++)
    {
  lcd_wdat(cdis1[m]);   //顯示字符
  delay1(5);
}
    lcd_pos(0x40);        //設(shè)置顯示位置為第二行
    for(m=0;m<16;m++)
    {
  lcd_wdat(cdis2[m]);   //顯示字符            
   delay1(5);
}
    while(1)        
    {
      play();      
    }
}


回復(fù)

使用道具 舉報

ID:379473 發(fā)表于 2018-7-26 15:43 | 顯示全部樓層
LCD1602我也用過,需要調(diào)整對比度,拿螺絲刀旋轉(zhuǎn)幾圈就好了
回復(fù)

使用道具 舉報

ID:221865 發(fā)表于 2018-7-26 15:55 | 顯示全部樓層
顯示函數(shù)不要直接放在while循環(huán)里面,可以放到定時器中斷,每3ms這樣刷新一次,這個數(shù)值可以調(diào)整知道沒有重影為止。
回復(fù)

使用道具 舉報

ID:377460 發(fā)表于 2018-7-26 16:01 | 顯示全部樓層
對比度,板子上應(yīng)該有個可調(diào)電阻器,你調(diào)一下看看。1602的V0口接的。
回復(fù)

使用道具 舉報

ID:377460 發(fā)表于 2018-7-26 16:16 | 顯示全部樓層
調(diào)節(jié)板子上的可變電阻,接在1602的V0口上的。
回復(fù)

使用道具 舉報

ID:140485 發(fā)表于 2018-7-26 16:58 | 顯示全部樓層
加入適當?shù)难訒r
回復(fù)

使用道具 舉報

ID:378431 發(fā)表于 2018-7-27 10:17 | 顯示全部樓層
加一個電位器,在vd那個引腳,然后再連gnd

評分

參與人數(shù) 1黑幣 +5 收起 理由
恩恩哼 + 5

查看全部評分

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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