找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1332|回复: 13
收起左侧

LCD1602首地址数字显示异常 附单片机代码

[复制链接]
ID:577162 发表于 2023-3-29 23:54 | 显示全部楼层 |阅读模式
Snipaste_2023-03-29_23-37-59.jpg 51hei图片_20230329233552.jpg
#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
1.jpg
回复

使用道具 举报

ID:517951 发表于 2023-3-30 07:47 | 显示全部楼层
清屏指令0x01 之后的延时5ms加大到20ms试试.
回复

使用道具 举报

ID:577162 发表于 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
回复

使用道具 举报

ID:577162 发表于 2023-3-30 07:58 | 显示全部楼层
如果写入的值>=40H;显示正常
如果写入的值<=40H;显示关系如下:
30H  0---------->70H    p(相差40H)
31H  1---------->71H    q
.
.
.
40H  @---------->40H   @(正常)
回复

使用道具 举报

ID:577162 发表于 2023-3-30 09:19 | 显示全部楼层
rayin 发表于 2023-3-30 07:47
清屏指令0x01 之后的延时5ms加大到20ms试试.

好的;晚上我试试,tks
回复

使用道具 举报

ID:161164 发表于 2023-3-30 16:43 | 显示全部楼层
LCD_Write_command(); 和 LCD_Write_data(); 的代码呢?
回复

使用道具 举报

ID:69038 发表于 2023-3-30 17:16 | 显示全部楼层
楼主你确定:仿真是8位并口的,实物是串行SPI的。。两个不同的东东,代码能一样?
PS :可能我看错了,你这是4位并口的?
回复

使用道具 举报

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

我这是4口的;仿真也是用的P0口高四位
回复

使用道具 举报

ID:577162 发表于 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. }
复制代码
回复

使用道具 举报

ID:384109 发表于 2023-3-30 19:54 | 显示全部楼层
应该是查忙而不是延时
回复

使用道具 举报

ID:577162 发表于 2023-3-30 20:48 | 显示全部楼层
Snipaste_2023-03-30_20-05-45.jpg Snipaste_2023-03-30_20-54-21.jpg

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

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

Snipaste_2023-03-30_20-47-23.jpg




回复

使用道具 举报

ID:577162 发表于 2023-3-30 21:07 | 显示全部楼层
1.png 3.jpg 感觉要被这个1602玩坏了
回复

使用道具 举报

ID:69038 发表于 2023-3-31 00:49 | 显示全部楼层
按你这个说法是字库坏了,不过一般 来说,很少坏成这样。如果只是坏了一个字符,倒可以补救:用自定义字符的方式补上就是麻烦了点
回复

使用道具 举报

ID:577162 发表于 2023-3-31 01:00 | 显示全部楼层
zhuls 发表于 2023-3-31 00:49
按你这个说法是字库坏了,不过一般 来说,很少坏成这样。如果只是坏了一个字符,倒可以补救:用自定义字符 ...

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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