找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

lcd1602只有一行白塊,求助

[復(fù)制鏈接]
ID:1049868 發(fā)表于 2022-10-31 11:00 | 顯示全部樓層 |閱讀模式
做的可調(diào)計時器,仿真的時候正確的,但是燒錄進去只有一行白塊。
查了資料可能是lcd初始化的問題。也加了延時,但是沒用,對比度也調(diào)過了。
  1. #include <REGX52.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar sec;
  5. uchar min;
  6. uchar hour;
  7. sfr AUXR =0x8E;
  8. sbit k1=P3^1;
  9. sbit k2=P3^0;
  10. sbit k3=P3^2;
  11. sbit k4=P3^3;
  12. uchar led1,led2,led3,led4,led5,led6,led7,led8;
  13. code uchar display[]="TIME:" ;

  14. sbit RS=P2^0;
  15. sbit RW=P2^1;
  16. sbit E=P2^2;

  17. #define input P0

  18. void Delay10ms()                //@11.0592MHz
  19. {
  20.         unsigned char i, j;

  21.         i = 18;
  22.         j = 235;
  23.         do
  24.         {
  25.                 while (--j);
  26.         } while (--i);
  27. }


  28. void write_command(uchar com)  //寫入命令
  29. {
  30.    Delay10ms();
  31.    E=0;
  32.    RS=0;
  33.    RW=0;
  34.    input=com;
  35.    Delay10ms();
  36.    E=1;
  37.    Delay10ms();
  38.    E=0;
  39.    Delay10ms();
  40. }
  41. void write_data(uchar da)           //寫入數(shù)據(jù)
  42. {
  43.    
  44.    E=0;
  45.    RS=1;
  46.    RW=0;
  47.    input=da;
  48.    Delay10ms();
  49.    E=1;
  50.    Delay10ms();
  51.    E=0;
  52.    Delay10ms();
  53. }

  54. void lcd_initial() //lcd初始化
  55. {
  56.    Delay10ms();
  57.    write_command(0x01);
  58.    Delay10ms();
  59.    write_command(0x38);
  60.    Delay10ms();
  61.    write_command(0x0c);
  62.    Delay10ms();
  63.    write_command(0x06);
  64.    Delay10ms();
  65.    write_command(0x01);
  66.    Delay10ms();
  67.    write_command(0x80);
  68.    Delay10ms();

  69. }

  70. void lcd_pos(uchar pos)
  71. {
  72.          write_command(pos|0x80) ;

  73. }

  74. void string(uchar *da)//輸入字符
  75. {
  76.          uchar i;
  77.         for(i=0;i<16;i++)
  78.         {
  79.                 if(*(da+i)=='\0')break;
  80.                 write_data(*(da+i)) ;
  81.         }
  82. }

  83. void jinwei()        //時間進位函數(shù)
  84. {
  85.          sec++;
  86.         if(sec==60)
  87.         {
  88.                 sec=0;
  89.                 min++;
  90.         }
  91.         if(min==60)
  92.         {
  93.                 sec=0;
  94.                 min=0;
  95.                 hour++;
  96.         }
  97.                 if(hour==24)
  98.         {
  99.                 sec=0;
  100.                 min=0;
  101.                 hour=0;
  102.         }
  103. }

  104. void Timer0Init(void)                //1毫秒@11.0592MHz
  105. {
  106.         AUXR &= 0x7F;                //定時器時鐘12T模式
  107.         TMOD &= 0xF0;                //設(shè)置定時器模式
  108.         TL0 = 0x66;                //設(shè)置定時初值
  109.         TH0 = 0xFC;                //設(shè)置定時初值
  110.         TF0 = 0;                //清除TF0標志
  111.         TR0 = 1;                //定時器0開始計時
  112.         ET0=1;
  113.         EA=1;
  114. }


  115.   void timer() interrupt 1
  116.   {
  117.           static uint k=0;
  118.         TL0 = 0x66;                //設(shè)置定時初值
  119.         TH0 = 0xFC;
  120.         k++;
  121.         if(k==2000)
  122.         {
  123.                 k=0;
  124.                 jinwei();
  125.         }
  126.   }
  127. void time()        //時間顯示
  128. {
  129.          lcd_pos(0x05);
  130.         write_data(led8+'0');

  131.         lcd_pos(0x06);
  132.         write_data(led7+'0');

  133.         lcd_pos(0x07);
  134.         write_data(':');

  135.         lcd_pos(0x08);
  136.         write_data(led5+'0');

  137.         lcd_pos(0x09);
  138.         write_data(led4+'0');

  139.                 lcd_pos(0x0a);
  140.         write_data(':');

  141.         lcd_pos(0x0b);
  142.         write_data(led2+'0');

  143.         lcd_pos(0x0c);
  144.         write_data(led1+'0');
  145. }


  146. void keys()//按鈕功能
  147. {
  148.          uchar flag;
  149.         if (k1==0)
  150.         {
  151.                 Delay10ms();
  152.                 flag=1;
  153.                 TR0=0;
  154.         }
  155.         if(TR0==0)
  156.         {
  157.                 if(k2==0)
  158.                 {
  159.                 Delay10ms();
  160.                 hour++;
  161.                 }
  162.                 if(k3==0)
  163.                 {
  164.                 Delay10ms();
  165.                 min++;
  166.                 }
  167.                
  168.          }
  169.         if(k4==0)
  170.                 {
  171.            Delay10ms();
  172.            TR0=1;
  173.            flag=0;
  174.                 }
  175. led1=sec%10;
  176. led2=sec/10;

  177. led4=min%10;
  178. led5=min/10;

  179. led7=hour%10;
  180. led8=hour/10;
  181. }               


  182. main()
  183. {
  184.         Delay10ms();
  185.         lcd_initial();
  186.          Delay10ms();
  187.          string(display);//顯示時間
  188.         Timer0Init();
  189.         
  190.         Delay10ms();
  191.         led1=0;
  192.         led2=0;
  193.         led4=0;
  194.         led5=0;
  195.         led7=0;
  196.         led8=0;
  197.         sec=0;
  198.         min=0;
  199.         hour=0;
  200.         string(display);//顯示時間
  201.         while(1)
  202.         {
  203.                 time();
  204.                 keys();
  205.         }
  206. }
復(fù)制代碼



回復(fù)

使用道具 舉報

ID:96682 發(fā)表于 2022-10-31 12:06 | 顯示全部樓層
硬件檢查一下看哪里有錯
回復(fù)

使用道具 舉報

ID:121859 發(fā)表于 2022-10-31 12:19 | 顯示全部樓層
首先需要排除硬件上的問題,如果硬件沒有毛病,那么初始化那里做些處理,0x38指令多寫幾遍試試。
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-10-31 13:06 | 顯示全部樓層
代碼看上去沒問題
仿真也沒問題
2022-10-31_130413.png


應(yīng)該是硬件問題
請檢查接線
特別是RS/EN這兩根線
回復(fù)

使用道具 舉報

ID:1049868 發(fā)表于 2022-10-31 13:28 | 顯示全部樓層
lkc8210 發(fā)表于 2022-10-31 13:06
代碼看上去沒問題
仿真也沒問題

lcd1602是直接插在單片機的卡槽里的
回復(fù)

使用道具 舉報

ID:384109 發(fā)表于 2022-10-31 13:58 | 顯示全部樓層
P0沒接上拉電阻吧,最好是查忙,而不是用延時
回復(fù)

使用道具 舉報

ID:16255 發(fā)表于 2022-10-31 14:36 | 顯示全部樓層
人中狼 發(fā)表于 2022-10-31 13:58
P0沒接上拉電阻吧,最好是查忙,而不是用延時

我的程序都是直接延時的,目前未出現(xiàn)過問題。
只要延時足夠,數(shù)據(jù)是肯定傳輸完成的。對于1602這種顯示屏,數(shù)據(jù)量又不大,完全沒有必要爭分奪秒的。
回復(fù)

使用道具 舉報

ID:783421 發(fā)表于 2022-10-31 19:35 | 顯示全部樓層
lkc8210 發(fā)表于 2022-10-31 13:06
代碼看上去沒問題
仿真也沒問題

可能是P0沒有接上拉電阻,驅(qū)動能力太弱吧
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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