找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1009|回复: 1
收起左侧

一个单片机显示字符串的问题 读取MCU的ID 并显示在LCD上

[复制链接]
ID:824490 发表于 2022-3-31 02:12 | 显示全部楼层 |阅读模式
//目的是读取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确定都没有问题,

有谁遇到过这样的问题?






回复

使用道具 举报

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

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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