51单片机驱动数码管,显示一直不对。发现在 FloatToNum(float fs)中数值不对
发现在 FloatToNum(float fs)中数值不对,这个是打算显示数值的,但是把小数转换为四个个位数时数值就被改了。什么原因?感谢大侠指教!电路图、代码都没有,叫别人怎么指教? 放弃自己写 format 的想法,尽早投入 sprintf 的怀抱 全部代码已经上传了,提示需要审核。但是帖子倒是出来了。 用附件方式。 本帖最后由 luosifu 于 2024-8-22 08:47 编辑
void FloatToNum(float fs)
这个函数中,有些不严谨
百位 = FS %1000/100
十位 = FS %100/10
个位 = FS %10
这么写功能上可以,如果51不做其他的工作这么做问题不大,让51不停的算除法, lrain 发表于 2024-8-22 08:23
没仔细看,粗看起来问题比较多,是初学者常犯的错误,看show函数中的weiX是显示一个十进制位,其实是一个字 ...
感谢!DigiValue中uFour是数码管中这一位的显示的数值,DigiValue不就是这个数值的七段数码真值吗?
luosifu 发表于 2024-8-22 09:20
百位 = FS %1000/100
十位 = FS %100/10
个位 = FS %10
这么写是为了显示小数。 lrain 发表于 2024-8-22 15:47
位值的范围也就是0~9,为啥要整个uint类型呢?应该用uchar,uint是多字节的,你这个问题应该就是出在类型 ...
很感谢! 在FloatToNum(float fs)里面数值还是对的,刚进入Show()中数值是对的。到给数码管赋值时就出出错了。 你的数字都定义为uint,你的显示数字的字符表是char型的,char DigiValue[]={ 0xC0,0xF9, 0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xC7,0xC8,0xC1,0x8C,0xA3,0xBF,0xFF};//共阳不带小数点
试试把数据类型搞定,再看看码表对不对。 我没有看你的代码,
判断范围与补偿
if (dc<9.999 && dc>8.000)
{ adc_cal();
dc=dc+0.055; //补偿
}
if (dc<12.999 && dc>10.000)
{ adc_cal();
dc=dc+0.045;//补偿
}
提取位,仅供参考
data = display.encodeDigit(ff/10000 % 10); //显示千位
data = display.encodeDigit(ff/100 % 10); //显示百位
data = display.encodeDigit(ff/10 % 10); //显示十位
data = display.encodeDigit(ff % 10); //显示个位
display.setSegments(data);//显示字符