首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在LCD上显示浮点数

在LCD上显示浮点数
EN

Stack Overflow用户
提问于 2016-11-21 03:28:10
回答 3查看 6.7K关注 0票数 0

我如何获得变量,伏特,以显示浮点数字的液晶显示器?

LCD只显示浮点值,小数位数较多,结尾为E位。我只需要小数点2位,那么如何显示呢?

代码语言:javascript
复制
int main (void){

    adcinit();

    lcd_init();//initializes LCD
    lcd_clear();//clear screen
    lcd_home();


    uint16_t value;
    float volts;
    while(1){
        ADCSRA |= (1<<ADSC);//start ADC conversion
        delay_ms(54);//delay 54 millisecond
        value = ADCW;//assign ADC conversion to value
        volts=(value*5)/1023;
        lcd_goto_xy(0,0);// coordinates of the cursor on LCD Display
        lcd_printf("ADC Value: %d ",value);//display on LCD
        lcd_goto_xy(0,1);// coordinates of the cursor on LCD Display
        lcd_printf("Volts: %f ",volts);//display on LCD
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-21 12:51:15

如果函数lcd_printf()基于与Arduino的函数sprintf()相同的库,格式说明符'%f'即使用作'%.2f'也不能很好地管理。

步骤1:在提出替代解决方案之前,有必要从从模拟到数字转换器读取的数值中得到计算良好的浮点值。

如果模数转换器是10位,范围应该是1024 (而不是1023).

代码语言:javascript
复制
value = ADCW;//assign ADC conversion to value
volts=((float)value*5.0f)/(1024.0f); 

步骤2.1:首先快速显示2小数固定浮点值的解决方案是将其转换成2个整数。

代码语言:javascript
复制
lcd_printf("Volts: %d.%02d ",(int)volts, (int)(volts*100)%100));//display on LCD

而不是

代码语言:javascript
复制
lcd_printf("Volts: %.2f ",volts);//display on LCD

步骤2.2:显示2-小数固定浮点值的更正式的解决方案是使用"Arduino sprintf float not formatting"中提出的dtostrf()函数。

代码语言:javascript
复制
char str_volts[15]; // to store the float-to-string converted value
lcd_printf("Volts: %s ",dtostrf(volts, 4, 2, str_volts));//display on LCD
// 4 = minimum number of char ('X.XX'), 2 = number of decimals

而不是

代码语言:javascript
复制
lcd_printf("Volts: %.2f ",volts);//display on LCD
票数 0
EN

Stack Overflow用户

发布于 2016-11-22 14:44:57

我是在回答原文最后一句的问题,而不是标题。但这是你的项目的正确答案。

你说“我只需要小数点2位”,所以这应该告诉你,没有浮点数数学的必要。物理学家和工程师需要浮子来表示非常、非常小或非常大的数量,但你需要“定点”--这意味着进行整数运算并正确选择单元。定点更快、更准确,并且减少了编译的二进制文件的大小,因为不需要浮点代码。

最简单的解决方案是使用整数和显示毫伏,就像刚才使用的delay()函数使用整数毫秒数的参数,而不是秒的小数数一样。

代码语言:javascript
复制
#define VREF 5000
uint32_t mvolts;
.
.
mvolts=(value*VREF)>>10; // No floats here...
lcd_printf("milliVolts: %d",mvolts); // ...and no casts

如果您必须显示伏特,那么这就实现了这样的功能:

代码语言:javascript
复制
lcd_printf("Volts: %d.%02d ",mvolts/1000, (mvolts%1000)/10);

请注意,顺便说一句,mvolt是一个32位整数,因为您现在正在将10位数乘以5000,这将不适合16位。这是需要的,因为您需要在进行缩放时保持值的准确性。我不认为这将偏离主题,因为我认为您确实希望显示正确的值,或者显示这两个小数位没有意义。

如果不小心,编译器将计算出5000/1024 - 4.8828125的值,然后执行整数运算,这会切断小数部分,并最终将ADC结果乘以4。为了保证正确的行为,先乘以5000,然后再除以-2单独的运算。由于1024是2**10,向右移动10位等于除以1024。

最后,不要假设从模数转换器中读取1023实际上意味着5.000伏特到4个重要数字;通过调整#define VREF以获得正确的结果来校准测试过的电压表。

票数 2
EN

Stack Overflow用户

发布于 2016-11-21 05:09:32

试试这个:

编辑:我刚刚编辑了显示电压,因为值是int。但原则是一样的。

代码语言:javascript
复制
int main (void){

    adcinit();

    lcd_init();//initializes LCD
    lcd_clear();//clear screen
    lcd_home();


    uint16_t value;
    float volts;
    while(1){
        ADCSRA |= (1<<ADSC);//start ADC conversion
        delay_ms(54);//delay 54 millisecond
        value = ADCW;//assign ADC conversion to value
        volts=(float)(value*5)/1023;
        lcd_goto_xy(0,0);// coordinates of the cursor on LCD Display
        lcd_printf("ADC Value: %d ",value);//display on LCD
        lcd_goto_xy(0,1);// coordinates of the cursor on LCD Display
        lcd_printf("Volts: %.2f ",volts);//display on LCD
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40712305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档