8位机如何显示超过255的16位的数字?

背景

今天写代码,需要显示数据发送次数,次数递增,最大有可能有几万次。但是测试时发现数字到了255之后便从零开始显示。显然是数据越界了。
其实这个问题很好解决,主要是数据类型转换就可以。但是如果遇到一个8位机,而且设备提供的接口函数中,数据的类型只有8位整形,该怎么办?就像我今天遇到的。

解决

设备提供一个现实数据的接口函数:
void _putstr(U8 *p);
其输入只能是8位整型,也即大于255的数字无法正确显示出来,这就需要做一些数字的转换。
例,需要显示的数字为65535,可以将其拆分为65535显示。如果1001可以拆分为10 01 进行显示。

下面是代码实现:

void Show16data( U8 line,U8 n,U16 data )
{
    char num_temp[1];
    U8 dataH,dataM,dataL;
    _gotoxy(n,line);

    if (data >= 10000)
    {
        dataH =(U8)(data / 1000);
        dataM = (U8)((data%1000)/10);
        dataL = (U8)(data%10);

        sprintf(num_temp,"%02d",dataH); 
        // 注意一定格式化字符串的时候两位数要用%02d来控制  如20011 才能正确显示20011,否则有可能显示2011
        _putstr(num_temp);  
        sprintf(num_temp,"%02d",dataM);
        _putstr(num_temp);          
        sprintf(num_temp,"%1d",dataL); //个位数需要用 %1d来控制
        _putstr(num_temp);  
    }
    else if (data >= 1000)
    {
        dataH =(U8)(data / 100);
        dataL = (U8)(data%100);
        sprintf(num_temp,"%02d",dataH);
        _putstr(num_temp);          
        sprintf(num_temp,"%02d",dataL);
        _putstr(num_temp);  
    }
    else if (data >= 100)
    {
        dataH =(U8)(data / 10);
        dataL = (U8)(data%10);
        sprintf(num_temp,"%02d",dataH);
        _putstr(num_temp);          
        sprintf(num_temp,"%1d",dataL);
        _putstr(num_temp);  
    }
    else
    {
        sprintf(num_temp,"%02d",data);
        _putstr(num_temp);  
    }
}

另外需要注意的是,数字拆分后最好加上强制数据转换 。
dataH =(U8)(data / 100);

你可能感兴趣的:(从零学习嵌入式,嵌入式小技巧,C)