1

float 値を 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("%");     

出力の図を次に示します。

私のコードの出力

4

1 に答える 1

1

多くの開発ツールにはprintf、さまざまなレベルの機能をサポートする複数のバージョンおよび関連機能があります。浮動小数点演算コードはかさばり、複雑であるため、使用されていない機能を含めると、多くのコード スペースが無駄になります。

どのオプションを含める必要があるかを自動的に判断しようとするツールもありますが、あまり良くないツールもあれば、printfコマンドライン引数、構成ファイル、またはその他の手段を使用してプログラマーが適切なバージョンを明示的に選択する必要があるだけのものもあります。指定子をサポートするバージョンの printf 関連関数をコンパイラに含める%fか、出力をフォーマットする他の手段を使用する必要がある場合があります。私自身の好ましいアプローチは、値をスケーリングされた整数 (たとえば、目的の値の 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」ファミリーの関数を使用することはほとんどありません。

于 2014-10-21T21:48:57.393 に答える