久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1093|回復: 5
打印 上一主題 下一主題
收起左側

求助LCD1602 CGRAM寫入問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:1130445 發表于 2024-8-13 00:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
CGRAM自定義字符部分,將字模寫入0x40-0x80時,0x48-0x80區段正常寫入讀取,但是0x40寫入后,讀取不到寫入字符,出現亂碼,也就是運行WriteData(0)時出現錯誤;
有大佬知道是怎么回事嗎,部分代碼已經貼到下面了

unsigned char code Table[8][8]={
{0x04,0x0E,0x15,0x04,0x04,0x04,0x04,0x00},//↑
{0x00,0x04,0x04,0x04,0x04,0x15,0x0E,0x04},//↓
{0x00,0x04,0x08,0x1F,0x08,0x04,0x00,0x00},//←
{0x00,0x04,0x02,0x1F,0x02,0x04,0x00,0x00},//→
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
};

void LCD_SetCustomChar(char (*Table)[8])
{
        unsigned char i,j;
        for(i=0;i<8;i++){
                LCD_WriteCommand(0x40+(8*i));
                for(j=0;j<8;j++){
                        LCD_WriteData(*(*(Table+i)+j));
                }
        }
}
void LCD_ShowCustomChar(unsigned char Line,unsigned char Column,unsigned char Num)
{
        LCD_SetCursor(Line,Column);
        LCD_WriteData(Num);
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:69038 發表于 2024-8-13 10:46 | 只看該作者
懷疑void LCD_SetCustomChar(char (*Table)[8])這個函數有問題,或許你根本沒寫入到CGRAM。。
你定義的Table[8][8]是二維數組,
LCD_WriteData(*(*(Table+i)+j));//讀取的是1維數據?
不知有沒有錯。給你個代碼參考測試一下:
  1. uchar code Word1[]={
  2.                      0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,//一
  3.                      0x00,0x0E,0x00,0x00,0x00,0x1F,0x00,0x00,//二
  4.                      0x0E,0x00,0x00,0x0E,0x00,0x00,0x1F,0x00,//三
  5.                      0x1F,0x11,0x15,0x15,0x1F,0x11,0x1F,0x00,//四
  6.                      0x1E,0x08,0x08,0x1E,0x0A,0x0A,0x1F,0x00,//五
  7.                      0x04,0x1F,0x00,0x0A,0x0A,0x0A,0x1B,0x00,//六
  8.                      0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00,//日
  9.                      0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//月
  10.                      0x08,0x1F,0x12,0x0F,0x0A,0x1F,0x02,0x00};//年



  11. void main()
  12. {   
  13.      uchar num;
  14.            uchar j;//
  15.      Lcd_1602_init();
  16.        
  17.                         Lcd_1602_write(0,0x40);        //操作CGRAM
  18.             for (j=0;j<64;j++)
  19.       Lcd_1602_write(1,Word1[j]);    //連續寫入64字節,8個字符, 5*7點陣按8*8計算
  20.        


  21.                
  22.    while(1)
  23.                 {
  24.                        
  25.                        
  26.             Lcd_1602_write(0,0x83);         //指定顯示地址,從第一行第3個字符開始
  27.       for(num=3;num<16;num++)
  28.     {      
  29.        Lcd_1602_write(1,table1[num]);      //連續顯示16個字符
  30.        delay(3);
  31.     }
  32.     Lcd_1602_write(0,0xc0);                //第2行第1個字符開始
  33.     for(num=0;num<16;num++)
  34.     {
  35.        Lcd_1602_write(1,table2[num]);//顯示另一組16個字符
  36.        delay(3);
  37.     }               
  38.                
  39.                   Lcd_1602_write(0,0x80);        //指定顯示位置
  40.                         for (j=0;j<8;j++)
  41.                         {
  42.                   Lcd_1602_write(1,j);        //顯示內存1個字符
  43.                   delay(100);                               
  44.                         }
  45.                         for (j=0;j<8;j++)
  46.                         {
  47.                   Lcd_1602_write(1,j);        //顯示內存1個字符
  48.                   delay(100);
  49.                         }               
  50.                        
  51.             Lcd_1602_write(0,0xc0);        //指定顯示位置
  52.                         for (j=0;j<8;j++)
  53.                         {
  54.                   Lcd_1602_write(1,7-j);        //顯示內存1個字符
  55.                   delay(100);
  56.                         }
  57.                         for (j=0;j<8;j++)
  58.                         {
  59.                   Lcd_1602_write(1,7-j);        //顯示內存1個字符
  60.                   delay(100);
  61.                         }       
  62.                 delay(1000);
  63.                         Lcd_1602_write(0,0x01);
  64.                 delay(500);       
  65.         }
  66. }
復制代碼



回復

使用道具 舉報

板凳
ID:57657 發表于 2024-8-13 11:57 | 只看該作者
樓主的程序不完整,缺少 LCD_WriteCommand, LCD_WriteData 函數。
回復

使用道具 舉報

地板
ID:1130445 發表于 2024-8-13 19:02 | 只看該作者
npn 發表于 2024-8-13 11:57
樓主的程序不完整,缺少 LCD_WriteCommand, LCD_WriteData 函數。

void LCD_WriteCommand(unsigned char Command)
{
        LCD_RS=0;
        LCD_RW=0;
        P0=Command;
        LCD_EN=1;
        Delay1ms();
        LCD_EN=0;       
}

void LCD_WriteData(unsigned char Data)
{
        LCD_RS=1;
        LCD_RW=0;
        P0=Data;
        LCD_EN=1;
        Delay1ms();
        LCD_EN=0;       
}

LCD_WriteCommand和LCD_WriteData在這里,就是看著手冊寫的
回復

使用道具 舉報

5#
ID:1130445 發表于 2024-8-13 21:09 | 只看該作者
zhuls 發表于 2024-8-13 10:46
懷疑void LCD_SetCustomChar(char (*Table)[8])這個函數有問題,或許你根本沒寫入到CGRAM。。
你定義的Tab ...

采用一維數組錄入,然后讀取,也是存在這個問題
上述char(*Table)[8]數據指針指向數組名,CGRAM里64個字節存儲數據,所以LCD_WriteData依次遍歷Table[i ][j]的數據感覺是沒什么問題的

字模數據肯定有寫入到CGRAM的,因為0x48后面的數據都可以正常讀取到,重寫和讀取都可以,只有在指向0x40的時候,就顯示空白或者亂碼,剩余的7個自定義符號都可以,然后有嘗試過將WriteData(Num)NUm范圍0-7;改為WriteData(Num)Num范圍1-8,第8位就不能顯示;所以目前是不太清楚0x40沒有寫進去數據,還是說WriteData(0)這個地方0的參數有問題
回復

使用道具 舉報

6#
ID:57657 發表于 2024-8-15 06:51 | 只看該作者
樓主可以參考下這個這個程序
  1. #include "STC12C5A60S2.h"                //根據單片機系列改頭文件 晶振頻率:12Mhz
  2. #include "intrins.h"
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. #define u32 unsigned long

  6. #define Port P2
  7. sbit RS = P0 ^ 7;
  8. sbit RW = P0 ^ 6;
  9. sbit E = P0 ^ 5;

  10. sbit busy = Port ^ 7;                //忙標志位
  11. sbit LED = P1 ^ 0;                //閃爍:初始化失敗 常亮:初始化正常 (低電平點亮)
  12. u8 *text = "  LCD1602 Test      \x00\x01\x02\x03\x04\x05\x06\x07    ";                //顯示的字符 (固定32字節)

  13. void lcd1602_delay(){
  14.         u8 data i, j;
  15.         _nop_();
  16.         _nop_();
  17.         i = 3;
  18.         j = 231;
  19.         do
  20.         {
  21.                 while (--j);
  22.         } while (--i);
  23. }


  24. bit lcd1602_wait(){                //LCD1602查忙等待 (正常返回1,超時返回0)
  25.         u8 count = 0;

  26.                 RS = 0;
  27.                 RW = 1;
  28.                 lcd1602_delay();
  29.                 E = 0;
  30.                 lcd1602_delay();
  31.                 E = 1;
  32.                 do {
  33.                         if(!++count){
  34.                                 return 0;
  35.                         }

  36.                 } while(busy);
  37.        
  38.         return 1;
  39. }

  40. bit lcd1602_write(bit rs,u8 dat){        //寫1602 (rs 0:指令 1:數據,成功返回1 失敗返回0)
  41.         if(!lcd1602_wait()){
  42.                 return 0;
  43.         }

  44.         RS = rs;
  45.         RW = 0;
  46.         Port = dat;       
  47.         lcd1602_delay();
  48.         E = 0;
  49.         lcd1602_delay();
  50.         E = 1;
  51.         return 1;
  52. }

  53. u8 code lcd1602_code[] = {0x38,0x0C,0x06,0x01};
  54. bit lcd1602_init(){                //LCD1602初始化 成功返回1 失敗返回0
  55.         u8 i;
  56.         for(i=0;i<4;i++){
  57.                 if(!lcd1602_write(0,lcd1602_code[i])){
  58.                         return 0;
  59.                 }
  60.         }
  61.         return 1;
  62. }

  63. /*
  64. LCD1602創建自定義圖像 (成功返回1,失敗返回0)
  65. ascii:字符ASCII碼 范圍:0~7 4表示字符:chr(4) \x04
  66. dat:8字節點陣數據數組
  67. */
  68. bit lcd1602_char(u8 ascii,u8 dat[]){
  69.         u8 i;
  70.         if(ascii > 7){
  71.                 return 0;
  72.         }
  73.                 if(!lcd1602_write(0,0x40|(ascii<<3))){                        //CGRAM 地址
  74.                         return 0;
  75.                 }
  76.         for(i=0;i<8;i++){
  77.                 if(!lcd1602_write(1,dat[i])){                        //CGRAM數據
  78.                         return 0;
  79.                 }
  80.         }
  81.         return 1;
  82. }


  83. void Delay500ms(void)        //@12MHz
  84. {
  85.         unsigned char data i, j, k;

  86.         i = 23;
  87.         j = 205;
  88.         k = 120;
  89.         do
  90.         {
  91.                 do
  92.                 {
  93.                         while (--k);
  94.                 } while (--j);
  95.         } while (--i);
  96. }

  97. u8 code Table[8][8]={
  98. {0x04,0x0E,0x15,0x04,0x04,0x04,0x04,0x00},//↑
  99. {0x00,0x04,0x04,0x04,0x04,0x15,0x0E,0x04},//↓
  100. {0x00,0x04,0x08,0x1F,0x08,0x04,0x00,0x00},//←
  101. {0x00,0x04,0x02,0x1F,0x02,0x04,0x00,0x00},//→
  102. {0,0,0,0,0,0,0,0},
  103. {0,0,0,0,0,0,0,0},
  104. {0,0,0,0,0,0,0,0},
  105. {0,0,0,0,0,0,0,0},
  106. };


  107. void main(){                //主函數
  108.         u8 i;

  109.         // CLK_DIV = 0x03;       
  110.         if(!lcd1602_init()){                //初始化失敗
  111.                 while(1){
  112.                 LED = !LED;
  113.                 Delay500ms();
  114.                 }
  115.                
  116.         }
  117.         LED = 0;
  118.         for(i=0;i<8;i++){
  119.                 lcd1602_char(i,Table[i]);
  120.         }       
  121.         lcd1602_write(0,0x80);
  122.         for(i=0;i<16;i++){
  123.                 lcd1602_write(1,text[i]);
  124.         }
  125.        
  126.         lcd1602_write(0,0xC0);
  127.         for(i=16;i<32;i++){
  128.                 lcd1602_write(1,text[i]);
  129.         }

  130.         while(1);

  131.        
  132. }
復制代碼
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 五月婷婷激情网 | 视频一区中文字幕 | 亚洲国产欧美国产综合一区 | 亚洲欧美中文日韩在线v日本 | 日日夜精品视频 | 国产精品免费小视频 | 香蕉视频黄色 | 国产精品国产三级国产aⅴ原创 | 亚洲人成网站777色婷婷 | 国产免费观看一区 | 福利片一区二区 | 激情 一区 | 亚洲欧美一区二区在线观看 | 网站黄色在线 | 国产精品乱码一区二区三区 | 亚洲欧美日韩精品久久亚洲区 | 91精品国产91久久综合桃花 | 中文字幕蜜臀av | 一本一道久久a久久精品综合蜜臀 | 精品国产成人 | 日韩一二三区视频 | 亚洲国产精品一区二区第一页 | 一区二区三区电影网 | 日韩电影中文字幕在线观看 | 欧美一级免费看 | 久久91av| 91在线看网站 | 精品美女在线观看 | 超碰人人人人 | 午夜一区二区三区在线观看 | 国产精品久久精品 | 欧美一区二区三区电影 | 日本视频免费观看 | 国产午夜视频 | 国产精品69久久久久水密桃 | 国产精品久久久久久久粉嫩 | 91精品国产综合久久婷婷香蕉 | 国产传媒在线播放 | 久久久久久久久久久爱 | 日韩在线一区二区三区 | 国产一区二区三区久久久久久久久 |