这几天跟同学一起做模电大作业,有一次用到久违的单片机,使用C语言编写单片机控制程序,有一块用到数模转换物体重量并显示到lcd1602上,其中出现了一个小问题,代码如下
void ValueToString(unsigned char *str, unsigned char val){
unsigned long int sum;
sum = (val*500) / 255;
str[0] = (sum/100) + '0';
str[1] = (sum/10%10) + '0';
str[2] = '.';
str[3]=(sum%10)+'0';
str[4] = 'k';
str[5]='g';
str[6] = '\0';
}
先解释一下代码,我希望将PCF8591检测到的电压值乘5后保留一位小数输出,按理来说最多应该输出50kg,但每次都会出现在25.6kg以后不能正常输出,开始时很困扰,我明明将sum定义位unsigned long int 类型的了,应该没有理由会溢出呀,难道1602有毒,卧槽,好绝望…
躺在床上突然觉得哪里不对,8591是8位ADC,也就是说val最大是255,那val*500的中间结果是127500,这个结果会放在哪里呢,肯定是放在val的内存空间呀,而val是char 型,只有255个空间,这肯定溢出啊,所以我们应该在最初时就将val扩容,
`unsigned long int sum=val;
这样就可以了。