我想在LCD上显示浮点值。我使用avr5.1编译器并使用函数snprintf将float值转换为ASCII。但它在Proteus"?"上给出了输出。
这是我正在使用的代码;我还包括printf_flt库:
temp1=ADCH;
// FOR MEASURING VOLTAGE
temp=(temp1*19.53)*2.51;
LCD_goto(1,1);
snprintf(buffer,6, "%2.2f", temp);
lcd_data1(buffer);
lcd_data1("mV");
percent=(temp-11500);
LCD_goto(2,2);
snprintf(buffer1,4, "%2.2f", percent);
lcd_data1(" ");
lcd_data1(buffer1);
lcd_data1("%");
以下是输出图片:
答案 0 :(得分:1)
许多开发工具都有多个版本的printf
和相关功能,它们支持不同级别的功能。浮点数学代码笨重且复杂,因此包含未使用的功能会浪费大量代码空间。
有些工具会自动尝试找出需要包含哪些选项,但有些工具不是很好,有些只是要求程序员使用命令行参数,配置文件显式选择适当的printf
版本,或其他此类手段。可能有必要使编译器包含支持%f
说明符的printf相关函数的版本,或者使用其他一些格式化输出的方法。我自己喜欢的方法是将值转换为缩放的整数(例如,所需值的100倍),然后编写一个输出数字的方法,最不重要的第一个,并在输出一些数字后插入一个句点的数字。类似的东西:
uint32_t acc;
uint8_t divMod10()
{
uint8_t result = acc % 10;
acc /= 10;
}
// output value in acc using 'digits' digits, with a decimal point shown after dp.
// If dp is greater than 128, don't show decimal point or leading zeroes
// If dp is less than 128 but greater than digits, show leading zeroes
void out_number(uint8_t digits, uint8_t dp)
{
acc = num;
while(digits-- > 0)
{
uint8_t ch = divMod10();
if (ch != 0 || (dp & 128) == 0)
out_lcd(ch + '0');
else
out_lcd(ch);
if (--dp == 0)
out_lcd('.');
}
}
由于LCD模块可以配置为从右向左接收数据,因此以该形式输出数字可能是一种有用的简化。请注意,我很少在小型微控制器上使用任何“printf” - 家庭功能,因为上述代码通常要紧凑得多。