欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6415|回復: 19
收起左側

求幫忙看看單片機LCD1602顯示一排白塊的問題

[復制鏈接]
ID:1019715 發表于 2022-5-7 15:37 | 顯示全部樓層 |閱讀模式
燒寫程序給板子上電之后,1602只顯示這一行白塊,應該不是對比度的問題?因為調可調電阻只是亮度變了下,程序在proteus上仿真是能實現運行的,大佬們幫忙看看,本人小白不太懂。。
IMG_20220506_164801.jpg
單片機源程序如下:
  1. #include <reg52.h>

  2. unsigned long int fre;
  3. unsigned char time;
  4. unsigned int count;
  5. unsigned int count1;

  6. sbit   LCD_RS=P1^0;          //片選信號
  7. sbit   LCD_RW=P1^1;          //讀寫信號
  8. sbit   LCD_E=P1^2;           //使能信號

  9. #define LCD_DB  P0        //數據信號

  10. unsigned char character[10]={0};//在屏幕上顯示的字符串
  11. unsigned char character_1[]={"fre= Hz"};
  12. unsigned char FLAG = 0;  //是否分頻選擇標志

  13. void LCD_init(void);//初始化函數   
  14. void LCD_write_command(unsigned char command);//寫指令函數         
  15. void LCD_write_data(unsigned char dat);//寫數據函數           
  16. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某個屏幕位置上顯示一個字符,X(0-15),y(1-2)
  17. void delay_n40us(unsigned int n);//延時函數
  18. void timer_init();            //中斷初始化函數  

  19. //-----------------------------延時函數---------------------------
  20. void delay_n40us(unsigned int n)                  //延時函數
  21. {
  22.         unsigned int i;
  23.         unsigned char j;            
  24.         for(i=n;i>0;i--)
  25.         for(j=0;j<2;j++);         
  26. }
  27. void delay_1s()
  28. {
  29.         unsigned int i,j;
  30.         for(i = 0;i<100;i++)
  31.                 for(j = 0;j<1000;j++);
  32. }
  33. //---------------------lcd1602液晶顯示函數--------------------                                    
  34. void LCD_init(void)         //液晶初始化函數
  35. {
  36.         LCD_write_command(0x38);//設置8位格式,2行,5x7
  37.         LCD_write_command(0x38);//設置8位格式,2行,5x7
  38.         LCD_write_command(0x38);//設置8位格式,2行,5x7
  39.         LCD_write_command(0x38);//設置8位格式,2行,5x7
  40.         LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
  41.         LCD_write_command(0x06);//設定輸入方式,增量不移位
  42.         LCD_write_command(0x01);//清除屏幕顯示         
  43.         LCD_write_command(0x80);//數據指針起點
  44.         delay_n40us(100);//清屏延時
  45. }
  46. void LCD_write_command(unsigned char dat)  //寫命令函數
  47. {
  48.         LCD_DB=dat;
  49.         LCD_RS=0;//指令         
  50.         LCD_RW=0;//寫入         
  51.         LCD_E=1; //使能         
  52.         LCD_E=0;
  53.         delay_n40us(1);//寫命令延時   
  54. }         
  55. void LCD_write_data(unsigned char dat)          //寫數據函數
  56. {
  57.         LCD_DB=dat;
  58.         LCD_RS=1;//數據         
  59.         LCD_RW=0;//寫入         
  60.         LCD_E=1;//使能  
  61.         LCD_E=0;
  62.         delay_n40us(1);         //寫數據延時
  63. }
  64. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//顯示一個字符
  65. {
  66.         unsigned char address;
  67.         if(y==1)
  68.                  address=0x80+x;         //顯示在第一排的時候的x的地址
  69.         else
  70.                  address=0xc0+x;         //顯示在第二排的時候的x的地址
  71.         LCD_write_command(address);         //輸入地址
  72.         LCD_write_data(dat);                 //輸入數據
  73. }
  74. void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//顯示一個數字
  75. {
  76.         unsigned char address;
  77.         if(y==1)
  78.                  address=0x80+x;         //顯示在第一排的時候的x的地址
  79.         else
  80.                  address=0xc0+x;         //顯示在第二排的時候的x的地址
  81.         LCD_write_command(address);         //輸入地址
  82.         LCD_write_data(dat+48);                 //輸入數據
  83. }
  84. void dis_num(void)
  85. {
  86.         unsigned char i=0,j=0,k=0;
  87.         LCD_write_command(0x01);//清除屏幕顯示
  88.         character[0] = fre/10000000;
  89.         character[1] = fre/1000000%10;
  90.         character[2] = fre/100000%10;
  91.         character[3] = fre/10000%10;
  92.         character[4] = fre/1000%10;
  93.         character[5] = fre/100%10;
  94.         character[6] = fre/10%10;
  95.         character[7] = fre%10;
  96.     character[8] = 'H';
  97.         character[9] = 'z';
  98.         for(i = 0;i<4;i++)                 //顯示“fre=”
  99.         {
  100.                  LCD_disp_char(i+0,1,character_1[i]);
  101.         }
  102.         for(i = 0;i<10;i++)         //判斷第一個不為0的數
  103.         {
  104.                 if(character[i]!=0)
  105.                         break;
  106.         }
  107.         k = 8-i;
  108.         for(j = 0;j<k;j++)         //顯示所有的數字
  109.         {
  110.                         LCD_disp_num(4+j,1,character[i++]);        
  111.         }
  112.     for(i = 5;i<7;i++)         //顯示“Hz”
  113.         {
  114.                  LCD_disp_char(j+4,1,character_1[i]);
  115.                 j++;
  116.         }
  117. }
復制代碼


回復

使用道具 舉報

ID:262 發表于 2022-5-7 16:17 | 顯示全部樓層
來看一下51hei論壇里面解決此問題的痛苦經歷吧:
51hei搜索框輸入"1602 方塊"或者"1602 黑塊"或者"1602 白塊"或者"1602 格":

這個是io口設置問題,最終搞定了:http://m.raoushi.com/bbs/dpj-199732-1.html
http://m.raoushi.com/bbs/dpj-168643-1.html
http://m.raoushi.com/bbs/dpj-208189-1.html
http://m.raoushi.com/bbs/dpj-210690-1.html

既有可能是軟件問題也有硬件問題
http://m.raoushi.com/bbs/dpj-187378-1.html
http://m.raoushi.com/bbs/dpj-160754-1.html
回復

使用道具 舉報

ID:121859 發表于 2022-5-7 17:24 | 顯示全部樓層
寫命令和數據延時時間可能太短了,加長,到1~3毫秒估計就可以了。
回復

使用道具 舉報

ID:213173 發表于 2022-5-7 17:47 | 顯示全部樓層
你的主函數到哪里去了???   40us延時太短,能仿真不代表實物也能行。
  1. #include <reg52.h>

  2. unsigned long int fre;
  3. unsigned char time;
  4. unsigned int count;
  5. unsigned int count1;

  6. sbit   LCD_RS=P1^0;          //片選信號
  7. sbit   LCD_RW=P1^1;          //讀寫信號
  8. sbit   LCD_E =P1^2;           //使能信號

  9. #define LCD_DB  P0        //數據信號

  10. unsigned char character[10]={0};//在屏幕上顯示的字符串
  11. unsigned char character_1[]={"fre= Hz"};
  12. unsigned char FLAG = 0;  //是否分頻選擇標志

  13. void LCD_init(void);//初始化函數   
  14. void LCD_write_command(unsigned char command);//寫指令函數         
  15. void LCD_write_data(unsigned char dat);//寫數據函數           
  16. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某個屏幕位置上顯示一個字符,X(0-15),y(1-2)
  17. void delay_n40us(unsigned int n);//延時函數
  18. void timer_init();            //中斷初始化函數  
  19. void delay_ms(unsigned int t);
  20. //-----------------------------延時函數---------------------------
  21. /*
  22. void delay_n40us(unsigned int n)                  //延時函數
  23. {
  24.         unsigned int i;
  25.         unsigned char j;            
  26.         for(i=n;i>0;i--)
  27.         for(j=0;j<2;j++);         
  28. }*/
  29. void delay_ms(unsigned int t)
  30. {
  31.         unsigned int i,j;
  32.         for(i=t;i>0;i--)
  33.                 for(j=120;j>0;j--);
  34. }
  35. //---------------------lcd1602液晶顯示函數--------------------                                    
  36. void LCD_init(void)         //液晶初始化函數
  37. {
  38.         LCD_RW=0;//寫入     
  39.         LCD_write_command(0x38);//設置8位格式,2行,5x7
  40.         LCD_write_command(0x38);//設置8位格式,2行,5x7
  41.         LCD_write_command(0x38);//設置8位格式,2行,5x7
  42.         LCD_write_command(0x38);//設置8位格式,2行,5x7
  43.         LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
  44.         LCD_write_command(0x06);//設定輸入方式,增量不移位
  45.         LCD_write_command(0x01);//清除屏幕顯示         
  46.         LCD_write_command(0x80);//數據指針起點
  47. }
  48. void LCD_write_command(unsigned char dat)  //寫命令函數
  49. {  
  50.         LCD_RS=0;//指令                 
  51.         LCD_DB=dat;
  52.         delay_ms(1);
  53.         LCD_E=1; //使能         
  54.         delay_ms(1);
  55.         LCD_E=0;
  56. }         
  57. void LCD_write_data(unsigned char dat)          //寫數據函數
  58. {
  59.         LCD_RS=1;//數據         
  60.         LCD_DB=dat;
  61.         delay_ms(1);
  62.         LCD_E=1;//使能  
  63.         delay_ms(1);
  64.         LCD_E=0;
  65. }
  66. void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//顯示一個字符
  67. {
  68.         unsigned char address;
  69.         if(y==1)
  70.                  address=0x80+x;         //顯示在第一排的時候的x的地址
  71.         else
  72.                  address=0xc0+x;         //顯示在第二排的時候的x的地址
  73.         LCD_write_command(address);         //輸入地址
  74.         LCD_write_data(dat);                 //輸入數據
  75. }
  76. void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//顯示一個數字
  77. {
  78.         unsigned char address;
  79.         if(y==1)
  80.                  address=0x80+x;         //顯示在第一排的時候的x的地址
  81.         else
  82.                  address=0xc0+x;         //顯示在第二排的時候的x的地址
  83.         LCD_write_command(address);         //輸入地址
  84.         LCD_write_data(dat+48);                 //輸入數據
  85. }
  86. void dis_num(void)
  87. {
  88.         unsigned char i=0,j=0,k=0;
  89.         LCD_write_command(0x01);//清除屏幕顯示
  90.         character[0] = fre/10000000;
  91.         character[1] = fre/1000000%10;
  92.         character[2] = fre/100000%10;
  93.         character[3] = fre/10000%10;
  94.         character[4] = fre/1000%10;
  95.         character[5] = fre/100%10;
  96.         character[6] = fre/10%10;
  97.         character[7] = fre%10;
  98.         character[8] = 'H';
  99.         character[9] = 'z';
  100.         for(i = 0;i<4;i++)                 //顯示“fre=”
  101.         {
  102.                 LCD_disp_char(i+0,1,character_1[i]);
  103.         }
  104.         for(i = 0;i<10;i++)         //判斷第一個不為0的數
  105.         {
  106.                 if(character[i]!=0)
  107.                 break;
  108.         }
  109.         k = 8-i;
  110.         for(j = 0;j<k;j++)         //顯示所有的數字
  111.         {
  112.                 LCD_disp_num(4+j,1,character[i++]);        
  113.         }
  114.         for(i = 5;i<7;i++)         //顯示“Hz”
  115.         {
  116.                 LCD_disp_char(j+4,1,character_1[i]);
  117.                 j++;
  118.         }
  119. }
  120. void main()
  121. {
  122.         LCD_init();
  123.         dis_num();
  124.         while(1);
  125. }
復制代碼
回復

使用道具 舉報

ID:149451 發表于 2022-5-7 18:54 | 顯示全部樓層
沒看到你的MCU底板PCB定義,但直覺是你的1602插反方向了(通常設計開發板,1602不會蓋在MCU上)
回復

使用道具 舉報

ID:94031 發表于 2022-5-7 19:01 | 顯示全部樓層
調調左上角對比度電位器,看對比度合適不。
回復

使用道具 舉報

ID:1019715 發表于 2022-5-7 19:36 | 顯示全部樓層
發表于 2022-5-7 17:47
你的主函數到哪里去了???   40us延時太短,能仿真不代表實物也能行。
  1. void main()
  2. {
  3.         unsigned char i;
  4.         LCD_init();
  5.         timer_init();        
  6.         for(i = 0;i<4;i++)
  7.         {
  8.                  LCD_disp_char(i+0,1,character_1[i]);
  9.         }
  10.         while(1)
  11.         {
  12.                 dis_num();  
  13.                 delay_1s();
  14.         }
  15. }

  16. void timer_init(void)   
  17. {
  18.         TMOD=0x66;
  19.         TH0=0;  
  20.         TL0=0;
  21.         TR0=1;  
  22.         ET0=1;  
  23.         TH1=0;   
  24.         TL1=0;
  25.         TR1=1;  
  26.         ET1=1;
  27.         RCAP2H=(65536-62500)/256;
  28.         RCAP2L=(65536-62500)%256;
  29.         TH2=RCAP2H;      
  30.         TL2=RCAP2L;
  31.         ET2=1;      
  32.         TR2=1;
  33.         EA=1;
  34. }

  35. void timer2(void) interrupt 5 //¶¨ê±Æ÷2ÖD¶Ï(62.5ms)
  36. {
  37.         time++;
  38.         TF2=0;      
  39.         if (time==16)      
  40.         {
  41.            time=0;     
  42.            EA=0;            
  43.            fre=(long)count1*256+TL1;   
  44.            FLAG = 0;
  45.          
  46.            if(fre<2000)
  47.            {
  48.                            fre = (long)count*256+TL0;
  49.                         FLAG = 1;         
  50.            }
  51.                 if(!FLAG)
  52.                 {
  53.                         fre = fre *100;
  54.                 }
  55.            TL0=0;      
  56.            TH0=0;
  57.            TL1=0;
  58.            TH1=0;
  59.            count=0;   
  60.            count1=0;
  61.            EA=1;      
  62.         }
  63. }
  64. //----------------------------------------------------------------
  65. void timer0(void) interrupt 1     
  66. {
  67.         count++;
  68. }               
  69. //----------------------------------------------------------------
  70. void timer1(void) interrupt 3
  71. {
  72.         count1++;
  73. }
復制代碼
回復

使用道具 舉報

ID:1019715 發表于 2022-5-7 19:39 | 顯示全部樓層
w1179benp 發表于 2022-5-7 18:54
沒看到你的MCU底板PCB定義,但直覺是你的1602插反方向了(通常設計開發板,1602不會蓋在MCU上)

沒有反接,只是畫pcb的時候沒有考慮到ic鎖緊座的高度,所以我的1602是有些斜著插到排母上的,而且我這個板子沒有USB接口,我需要先用燒錄器燒錄程序才取出芯片放到板子上
回復

使用道具 舉報

ID:149451 發表于 2022-5-7 19:58 | 顯示全部樓層
我Dell沈陽了 發表于 2022-5-7 19:39
沒有反接,只是畫pcb的時候沒有考慮到ic鎖緊座的高度,所以我的1602是有些斜著插到排母上的,而且 ...

還是把原理圖、PCB圖上上來看看吧。
回復

使用道具 舉報

ID:1019715 發表于 2022-5-7 20:27 | 顯示全部樓層
這個是原理圖與PCB
I4{8KU_RY9D@}G[1XJJ@[9A.png
1HF4@NZ(IGHLA2UPFGE6T.png
回復

使用道具 舉報

ID:1019715 發表于 2022-5-7 20:27 | 顯示全部樓層
w1179benp 發表于 2022-5-7 19:58
還是把原理圖、PCB圖上上來看看吧。

已經發上來了
回復

使用道具 舉報

ID:1019715 發表于 2022-5-7 20:31 | 顯示全部樓層
因為我沒有考慮到這個單片機鎖緊座的高度,所以1602插到排母上之后被卡住了所以是這樣斜著插上去的,這樣會有很大影響嗎?
IMG_20220507_202812.jpg
回復

使用道具 舉報

ID:1019715 發表于 2022-5-7 20:53 | 顯示全部樓層
有幾張圖在只看大圖那里,問問像我最后一張圖上這個1602插法影響大嗎?需要多插一個排母嗎?
回復

使用道具 舉報

ID:1019715 發表于 2022-5-7 21:00 | 顯示全部樓層
主程序直接粘上來注釋沒了,發兩張圖
PO1M56L9C4UXTKLQEPJ`[2M.png
B6[AN7[3R}N~VY5H`JE9WDO.png
回復

使用道具 舉報

ID:161164 發表于 2022-5-7 23:15 來自觸屏版 | 顯示全部樓層
我Dell沈陽了 發表于 2022-5-7 20:53
有幾張圖在只看大圖那里,問問像我最后一張圖上這個1602插法影響大嗎?需要多插一個排母嗎?

一試無妨
回復

使用道具 舉報

ID:1012735 發表于 2022-5-8 13:47 | 顯示全部樓層
E口跳變缺少延時!

*/
//------------------------------------------------
//LCD E口跳變時,LCD顯示一個字符/接收一個指令
//RS=0:命令指令,RS=1:顯示數據指令
//------------------------------------------------
void LcdWriteInfo( u8 RS, u8 RW, u8 dat )
{
        //while(LcdBusy());
       
        LCD1602_RS = RS;
        LCD1602_E  = 0;
        LCD1602_RW = RW;
       
        LCD1602_DATA = dat;
        delay1Cycle(5);
       
        LCD1602_E  = 1;
        delay1Cycle(5);
        LCD1602_E  = 0;
        delay1Cycle(5);
}
回復

使用道具 舉報

ID:61140 發表于 2022-5-8 14:20 | 顯示全部樓層
我Dell沈陽了 發表于 2022-5-7 20:53
有幾張圖在只看大圖那里,問問像我最后一張圖上這個1602插法影響大嗎?需要多插一個排母嗎?

第一:請確認LCD1602是否插反方向,插反方向是會導致白塊的,但不會燒壞屏
第二:請確認你的RS/RW/E/DATA   這些端口是否和程序里面的一致,不一致也會導致屏白塊
第三:以上兩項都正確,再確認你的程序寫指令和寫數據延時部分是否正確,一般仿真是不能評論實物的,仿真是理想化的仿真,但實物的時候一切以實際為主.
        如果你不確定你的寫指令和寫數據部分延時需要多少,盡可能的調大(一般大些不會導致白塊或不顯示,只是寫指令和寫數據等的時間稍長些),等顯示出來再調小,調到剛好可以穩定顯示又不會太大為準(比如你調到40剛好可以顯示了,再小就不顯示了,直接調到45-50即可,調太大影響程序運行速度)
回復

使用道具 舉報

ID:161164 發表于 2022-5-10 14:03 | 顯示全部樓層
這種芯片座有機會接觸不良
建議用以下代碼檢查LCD1602各信號腳有沒有電平變化

  1. #include <reg52.h>

  2. void Delay500ms()                //@12.000MHz
  3. {
  4.         unsigned char i, j, k;

  5.         i = 4;
  6.         j = 205;
  7.         k = 187;
  8.         do
  9.         {
  10.                 do
  11.                 {
  12.                         while (--k);
  13.                 } while (--j);
  14.         } while (--i);
  15. }

  16. void main()
  17. {
  18.     while (1)
  19.     {
  20.                         P0 ^= 0xFF;//取反電平
  21.                         P1 ^= 0xFF;//取反電平
  22.                         Delay500ms();
  23.     }
  24. }
復制代碼



回復

使用道具 舉報

ID:1019715 發表于 2022-5-19 15:04 | 顯示全部樓層
問題已經解決了,是PCB板我把復位按鍵的兩個相鄰引腳接一起導致一直通路,還有三極管原理圖和PCB封裝不對應導致出錯,重新打板之后已經能正常顯示了,感謝各位回復過的大佬,此貼終結。
回復

使用道具 舉報

ID:904023 發表于 2022-5-19 22:58 來自觸屏版 | 顯示全部樓層
可能是對比度沒填好,可以調下電位器
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表