标题: LCD1602首地址数字显示异常 附单片机代码 [打印本页]

作者: iccoyy    时间: 2023-3-29 23:54
标题: LCD1602首地址数字显示异常 附单片机代码

#1:同样的代码,仿真显示正常
#2:只要首地址写入数字,就显示不对;比如首地址写入1,那么硬件上显示的为q;若首地址写入0,那么硬件上显示的为p;
#3:请大哥们帮忙分析一下,抱拳谢过!

  1. --发送数据
  2. void LCD_dis_char(uchar x, uchar y, uchar dat)
  3. {
  4.     uchar address;

  5.     if (y == 1)
  6.         {
  7.             address = 0x80 + x;
  8.         }
  9.     else
  10.         {
  11.             address = 0xc0 + x;
  12.         }

  13.     LCD_Write_command(address);
  14.                                 Lcd1602_Delay1ms(1);
  15.     LCD_Write_data(dat);
  16. }

  17. ------------------初始化---------------------------
  18. void LCD_Init()
  19. {     //LCD_Write_command(0x33);
  20.    
  21.    //LCD_Write_command(0x32);//复位后LCD默认是8线的;需将最后四位改成0010;也就是说低字节只要是0010就能改为4线
  22.         
  23.     LCD_Write_command(0x02);//同上;只要最后4位是0010即可;这一行和上一行任选其一即可;
  24.         LCD_Write_command(0x28);//在四位线下的初始化
  25.     LCD_Write_command(0x0C);//开显示,不显示光标
  26.     LCD_Write_command(0x06);    //写一个指针加1
  27.     LCD_Write_command(0x01);    //清屏
  28.     Lcd1602_Delay1ms(5);
  29.     LCD_Write_command(0x80);    //设置数据指针起点
  30.    
  31.   
  32. }
  33. -----------main--------------
  34. void main()
  35. {
  36.    
  37.     uchar i = 0;
  38.     //n = n + 0x30; //转为ASCII
  39.     Lcd1602_Delay1ms(15);
  40.     LCD_Init();
  41.     for (i = 0; i < sizeof(dis_a)-1; i++)
  42.         {
  43.             LCD_dis_char(i, 1, dis_a[i]);Lcd1602_Delay1ms(1);
  44.         }
  45.     for (i = 0; i < sizeof(dis_b)-1; i++)
  46.         {
  47.             LCD_dis_char(i, 2, dis_b[i]);Lcd1602_Delay1ms(1);
  48.         }


  49.     while (1);
  50. }

复制代码




Snipaste_2023-03-29_23-39-52.jpg (70.22 KB, 下载次数: 30)

Snipaste_2023-03-29_23-39-52.jpg

1.jpg (88.98 KB, 下载次数: 27)

1.jpg

作者: rayin    时间: 2023-3-30 07:47
清屏指令0x01 之后的延时5ms加大到20ms试试.
作者: iccoyy    时间: 2023-3-30 07:53
反复琢磨,发现有这么一个规律;写入的值与实际显示值相差40H
PS:如果写入的第一个值的十六进制>=40H,则显示正常;比如写入@(40H)A(41H)
        写入值                           实际显示值
hex     ascii                     hex          ascii
2f         /                         6f             o
30        0                         70             p
31        1                         71             q
32        2                         72             r
作者: iccoyy    时间: 2023-3-30 07:58
如果写入的值>=40H;显示正常
如果写入的值<=40H;显示关系如下:
30H  0---------->70H    p(相差40H)
31H  1---------->71H    q
.
.
.
40H  @---------->40H   @(正常)
作者: iccoyy    时间: 2023-3-30 09:19
rayin 发表于 2023-3-30 07:47
清屏指令0x01 之后的延时5ms加大到20ms试试.

好的;晚上我试试,tks
作者: lkc8210    时间: 2023-3-30 16:43
LCD_Write_command(); 和 LCD_Write_data(); 的代码呢?
作者: zhuls    时间: 2023-3-30 17:16
楼主你确定:仿真是8位并口的,实物是串行SPI的。。两个不同的东东,代码能一样?
PS :可能我看错了,你这是4位并口的?

作者: iccoyy    时间: 2023-3-30 18:10
zhuls 发表于 2023-3-30 17:16
楼主你确定:仿真是8位并口的,实物是串行SPI的。。两个不同的东东,代码能一样?
PS :可能我看错了,你这 ...

我这是4口的;仿真也是用的P0口高四位
作者: iccoyy    时间: 2023-3-30 19:26
lkc8210 发表于 2023-3-30 16:43
LCD_Write_command(); 和 LCD_Write_data(); 的代码呢?

疏忽了,这就补齐;麻烦帮我分析一下
  1. void LCD_Write_data(uchar dat)
  2. {
  3.     LCD_E = 0;
  4.     LCD_RS = 1;
  5.     LCD_RW = 0;
  6.     LCD_DATA = dat;//4线接P0口高四位
  7.     //delay_n40us(5);
  8.     Lcd1602_Delay1ms(1);
  9.     LCD_E = 1;
  10. //delay_n40us(10);
  11.     Lcd1602_Delay1ms(5);
  12.     LCD_E = 0;
  13.                 LCD_DATA=dat<<4;//写入低四位
  14.             Lcd1602_Delay1ms(1);

  15.             LCD_E = 1;
  16. //delay_n40us(10);
  17.     Lcd1602_Delay1ms(5);
  18.     LCD_E = 0;
  19.        
  20. }
  21. void LCD_Write_command(uchar cmd)
  22. {
  23.     LCD_E = 0;
  24.     LCD_RS = 0; //0指令 1数据
  25.     LCD_RW = 0; //0写入 1读出
  26.     LCD_DATA = cmd;
  27.    
  28.     Lcd1602_Delay1ms(1);
  29.        
  30.     LCD_E = 1; //允许

  31.     Lcd1602_Delay1ms(5);
  32.     LCD_E = 0; //1->0写命令
  33.         LCD_DATA=cmd<<4;
  34.         Lcd1602_Delay1ms(1);
  35.             LCD_E = 1; //允许

  36.     Lcd1602_Delay1ms(5);
  37.     LCD_E = 0; //1->0写命令
  38.        
  39. }
复制代码

作者: 人中狼    时间: 2023-3-30 19:54
应该是查忙而不是延时
作者: iccoyy    时间: 2023-3-30 20:48


而且初始化,清屏之后,首地址显示的是CGROM中0X60的值丶;
But

只要我首地址写入的的值是大于0x40,一切正常!如图:
其解在哪呢。。。。







作者: iccoyy    时间: 2023-3-30 21:07
感觉要被这个1602玩坏了

作者: zhuls    时间: 2023-3-31 00:49
按你这个说法是字库坏了,不过一般 来说,很少坏成这样。如果只是坏了一个字符,倒可以补救:用自定义字符的方式补上就是麻烦了点
作者: iccoyy    时间: 2023-3-31 01:00
zhuls 发表于 2023-3-31 00:49
按你这个说法是字库坏了,不过一般 来说,很少坏成这样。如果只是坏了一个字符,倒可以补救:用自定义字符 ...

只有80H的地址坏了;其他都是好的。我从80H开始写,就没一点问题;不折腾了,感谢评论!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1