如何在LCD 16x2上显示浮点值

时间:2014-10-21 14:22:11

标签: floating-point digital floating-point-conversion circuit circuit-diagram

我想在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("%");     

以下是输出图片:

output of my code

1 个答案:

答案 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” - 家庭功能,因为上述代码通常要紧凑得多。