找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 916|回复: 7
收起左侧

lcd1602只有一行白块,求助

[复制链接]
ID:1049868 发表于 2022-10-31 11:00 | 显示全部楼层 |阅读模式
做的可调计时器,仿真的时候正确的,但是烧录进去只有一行白块。
查了资料可能是lcd初始化的问题。也加了延时,但是没用,对比度也调过了。
  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)           //写入数据
  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()        //时间进位函数
  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;                //设置定时器模式
  108.         TL0 = 0x66;                //设置定时初值
  109.         TH0 = 0xFC;                //设置定时初值
  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;                //设置定时初值
  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. }
复制代码



回复

使用道具 举报

ID:96682 发表于 2022-10-31 12:06 | 显示全部楼层
硬件检查一下看哪里有错
回复

使用道具 举报

ID:121859 发表于 2022-10-31 12:19 | 显示全部楼层
首先需要排除硬件上的问题,如果硬件没有毛病,那么初始化那里做些处理,0x38指令多写几遍试试。
回复

使用道具 举报

ID:161164 发表于 2022-10-31 13:06 | 显示全部楼层
代码看上去没问题
仿真也没问题
2022-10-31_130413.png


应该是硬件问题
请检查接线
特别是RS/EN这两根线
回复

使用道具 举报

ID:1049868 发表于 2022-10-31 13:28 | 显示全部楼层
lkc8210 发表于 2022-10-31 13:06
代码看上去没问题
仿真也没问题

lcd1602是直接插在单片机的卡槽里的
回复

使用道具 举报

ID:384109 发表于 2022-10-31 13:58 | 显示全部楼层
P0没接上拉电阻吧,最好是查忙,而不是用延时
回复

使用道具 举报

ID:16255 发表于 2022-10-31 14:36 | 显示全部楼层
人中狼 发表于 2022-10-31 13:58
P0没接上拉电阻吧,最好是查忙,而不是用延时

我的程序都是直接延时的,目前未出现过问题。
只要延时足够,数据是肯定传输完成的。对于1602这种显示屏,数据量又不大,完全没有必要争分夺秒的。
回复

使用道具 举报

ID:783421 发表于 2022-10-31 19:35 | 显示全部楼层
lkc8210 发表于 2022-10-31 13:06
代码看上去没问题
仿真也没问题

可能是P0没有接上拉电阻,驱动能力太弱吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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