找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 1499|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

一個(gè)單片機(jī)顯示字符串的問題 讀取MCU的ID 并顯示在LCD上

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:824490 發(fā)表于 2022-3-31 02:12 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
//目的是讀取MCU的ID,并顯示在LCD上;

//這是原始代碼,直接調(diào)用就會(huì)出錯(cuò),此代碼是廠家提供的demo
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode) //
{     
  while(*p!='\0')
    {      
        LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);
        x+=sizey/2;
        p++;
    }  
}
//這是我后來改的,加了長度控制參數(shù)
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode,u8 len)
{     
   u8 i;   
    for(i=0;i<len;i++)
    {      
        LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);
        x+=sizey/2;
        p++;
    }  
}

原始代碼顯示正常,但在main.C文件的開頭,定義了一個(gè)字符串,比如:
u8 mcu_ID[7];
u8 mcu_id_asc[14];
之后,顯示就會(huì)出現(xiàn)亂碼。
調(diào)用原始代碼:
    read_mcu_id(); //此函數(shù)中,已將7字節(jié)的ID換算成14個(gè)ASCII碼了。
    LCD_ShowString(0,120,"MCU ID is:",RED,WHITE,24,0);
    LCD_ShowString(0,144,mcu_id_asc,BLUE,WHITE,24,0);//mcu_id_asc是ID轉(zhuǎn)換后ASC字符串?dāng)?shù)組,共計(jì)14字節(jié)

結(jié)果是ID號(hào)后邊出現(xiàn)無意義的亂碼

而新代碼的調(diào)用:
    read_mcu_id();
    LCD_ShowString(0,120,"MCU ID is:",RED,WHITE,24,0,10);//加入了長度控制
    LCD_ShowString(0,144,mcu_id_asc,BLUE,WHITE,24,0,14);
則顯示正常!

用的MCU是STC15F2K60s2,顯示屏用的是S7789的TFTLCD,因?yàn)闆]有仿真器,只能一次又一次的下載測試,折騰許久,最終定位到問題出現(xiàn)在C文件的開頭定義了數(shù)組以及LCD_ShowString這個(gè)函數(shù)。。讀ID以及轉(zhuǎn)換到ASCII確定都沒有問題,

有誰遇到過這樣的問題?






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

使用道具 舉報(bào)

沙發(fā)
ID:161164 發(fā)表于 2022-3-31 09:45 | 只看該作者
因?yàn)閙cu_id_asc[14]是字符陣列而不是字符串
字符陣列和字符串的分別就是字符串在定義的時(shí)候會(huì)在最后自動(dòng)加上'/0'
對(duì)應(yīng)了原代碼的while(*p!='\0')
當(dāng)你用原代碼來顯示mcu_id_asc時(shí)
原代碼檢測不到'\0',就一直p++
結(jié)果就把其他地址的數(shù)值也打印出來

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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