sys3 发表于 2024-8-21 22:30:32

51单片机驱动数码管,显示一直不对。发现在 FloatToNum(float fs)中数值不对

发现在 FloatToNum(float fs)中数值不对,这个是打算显示数值的,但是把小数转换为四个个位数时数值就被改了。什么原因?感谢大侠指教!

ztzp 发表于 2024-8-21 23:02:02

电路图、代码都没有,叫别人怎么指教?

t3486784401 发表于 2024-8-21 23:10:56

放弃自己写 format 的想法,尽早投入 sprintf 的怀抱

sys3 发表于 2024-8-22 07:14:00

全部代码已经上传了,提示需要审核。但是帖子倒是出来了。

sys3 发表于 2024-8-22 07:15:00

用附件方式。

lrain 发表于 2024-8-22 08:23:42

luosifu 发表于 2024-8-22 08:40:44

本帖最后由 luosifu 于 2024-8-22 08:47 编辑

void FloatToNum(float fs)
这个函数中,有些不严谨

luosifu 发表于 2024-8-22 09:20:33

百位 = FS %1000/100
十位 = FS %100/10
个位 = FS %10

这么写功能上可以,如果51不做其他的工作这么做问题不大,让51不停的算除法,

sys3 发表于 2024-8-22 15:29:37

lrain 发表于 2024-8-22 08:23
没仔细看,粗看起来问题比较多,是初学者常犯的错误,看show函数中的weiX是显示一个十进制位,其实是一个字 ...

感谢!DigiValue中uFour是数码管中这一位的显示的数值,DigiValue不就是这个数值的七段数码真值吗?

sys3 发表于 2024-8-22 15:30:36

luosifu 发表于 2024-8-22 09:20
百位 = FS %1000/100
十位 = FS %100/10
个位 = FS %10


这么写是为了显示小数。

lrain 发表于 2024-8-22 15:47:15

sys3 发表于 2024-8-22 18:49:39

lrain 发表于 2024-8-22 15:47
位值的范围也就是0~9,为啥要整个uint类型呢?应该用uchar,uint是多字节的,你这个问题应该就是出在类型 ...

很感谢! 在FloatToNum(float fs)里面数值还是对的,刚进入Show()中数值是对的。到给数码管赋值时就出出错了。

w6955 发表于 2024-8-22 19:01:25

你的数字都定义为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};//共阳不带小数点

试试把数据类型搞定,再看看码表对不对。

lrain 发表于 2024-8-22 19:12:21

mcu51c51 发表于 2024-8-27 11:27:50

我没有看你的代码,
判断范围与补偿

   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);//显示字符
页: [1] 2 3
查看完整版本: 51单片机驱动数码管,显示一直不对。发现在 FloatToNum(float fs)中数值不对