找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

LCD1602首地址數(shù)字顯示異常 附單片機代碼

[復(fù)制鏈接]
ID:577162 發(fā)表于 2023-3-29 23:54 | 顯示全部樓層 |閱讀模式
Snipaste_2023-03-29_23-37-59.jpg 51hei圖片_20230329233552.jpg
#1:同樣的代碼,仿真顯示正常
#2:只要首地址寫入數(shù)字,就顯示不對;比如首地址寫入1,那么硬件上顯示的為q;若首地址寫入0,那么硬件上顯示的為p;
#3:請大哥們幫忙分析一下,抱拳謝過!

  1. --發(fā)送數(shù)據(jù)
  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);//復(fù)位后LCD默認是8線的;需將最后四位改成0010;也就是說低字節(jié)只要是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);    //設(shè)置數(shù)據(jù)指針起點
  30.    
  31.   
  32. }
  33. -----------main--------------
  34. void main()
  35. {
  36.    
  37.     uchar i = 0;
  38.     //n = n + 0x30; //轉(zhuǎn)為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. }

復(fù)制代碼




Snipaste_2023-03-29_23-39-52.jpg
1.jpg
回復(fù)

使用道具 舉報

ID:517951 發(fā)表于 2023-3-30 07:47 | 顯示全部樓層
清屏指令0x01 之后的延時5ms加大到20ms試試.
回復(fù)

使用道具 舉報

ID:577162 發(fā)表于 2023-3-30 07:53 | 顯示全部樓層
反復(fù)琢磨,發(fā)現(xiàn)有這么一個規(guī)律;寫入的值與實際顯示值相差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
回復(fù)

使用道具 舉報

ID:577162 發(fā)表于 2023-3-30 07:58 | 顯示全部樓層
如果寫入的值>=40H;顯示正常
如果寫入的值<=40H;顯示關(guān)系如下:
30H  0---------->70H    p(相差40H)
31H  1---------->71H    q
.
.
.
40H  @---------->40H   @(正常)
回復(fù)

使用道具 舉報

ID:577162 發(fā)表于 2023-3-30 09:19 | 顯示全部樓層
rayin 發(fā)表于 2023-3-30 07:47
清屏指令0x01 之后的延時5ms加大到20ms試試.

好的;晚上我試試,tks
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2023-3-30 16:43 | 顯示全部樓層
LCD_Write_command(); 和 LCD_Write_data(); 的代碼呢?
回復(fù)

使用道具 舉報

ID:69038 發(fā)表于 2023-3-30 17:16 | 顯示全部樓層
樓主你確定:仿真是8位并口的,實物是串行SPI的。。兩個不同的東東,代碼能一樣?
PS :可能我看錯了,你這是4位并口的?
回復(fù)

使用道具 舉報

ID:577162 發(fā)表于 2023-3-30 18:10 | 顯示全部樓層
zhuls 發(fā)表于 2023-3-30 17:16
樓主你確定:仿真是8位并口的,實物是串行SPI的。。兩個不同的東東,代碼能一樣?
PS :可能我看錯了,你這 ...

我這是4口的;仿真也是用的P0口高四位
回復(fù)

使用道具 舉報

ID:577162 發(fā)表于 2023-3-30 19:26 | 顯示全部樓層
lkc8210 發(fā)表于 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數(shù)據(jù)
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:384109 發(fā)表于 2023-3-30 19:54 | 顯示全部樓層
應(yīng)該是查忙而不是延時
回復(fù)

使用道具 舉報

ID:577162 發(fā)表于 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




回復(fù)

使用道具 舉報

ID:577162 發(fā)表于 2023-3-30 21:07 | 顯示全部樓層
1.png 3.jpg 感覺要被這個1602玩壞了
回復(fù)

使用道具 舉報

ID:69038 發(fā)表于 2023-3-31 00:49 | 顯示全部樓層
按你這個說法是字庫壞了,不過一般 來說,很少壞成這樣。如果只是壞了一個字符,倒可以補救:用自定義字符的方式補上就是麻煩了點
回復(fù)

使用道具 舉報

ID:577162 發(fā)表于 2023-3-31 01:00 | 顯示全部樓層
zhuls 發(fā)表于 2023-3-31 00:49
按你這個說法是字庫壞了,不過一般 來說,很少壞成這樣。如果只是壞了一個字符,倒可以補救:用自定義字符 ...

只有80H的地址壞了;其他都是好的。我從80H開始寫,就沒一點問題;不折騰了,感謝評論!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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