标题: 一个单片机显示字符串的问题 读取MCU的ID 并显示在LCD上 [打印本页]

作者: 名字不是重点    时间: 2022-3-31 02:12
标题: 一个单片机显示字符串的问题 读取MCU的ID 并显示在LCD上
//目的是读取MCU的ID,并显示在LCD上;

//这是原始代码,直接调用就会出错,此代码是厂家提供的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++;
    }  
}
//这是我后来改的,加了长度控制参数
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文件的开头,定义了一个字符串,比如:
u8 mcu_ID[7];
u8 mcu_id_asc[14];
之后,显示就会出现乱码。
调用原始代码:
    read_mcu_id(); //此函数中,已将7字节的ID换算成14个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转换后ASC字符串数组,共计14字节

结果是ID号后边出现无意义的乱码

而新代码的调用:
    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,因为没有仿真器,只能一次又一次的下载测试,折腾许久,最终定位到问题出现在C文件的开头定义了数组以及LCD_ShowString这个函数。。读ID以及转换到ASCII确定都没有问题,

有谁遇到过这样的问题?







作者: lkc8210    时间: 2022-3-31 09:45
因为mcu_id_asc[14]是字符阵列而不是字符串
字符阵列和字符串的分别就是字符串在定义的时候会在最后自动加上'/0'
对应了原代码的while(*p!='\0')
当你用原代码来显示mcu_id_asc时
原代码检测不到'\0',就一直p++
结果就把其他地址的数值也打印出来




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