マイクロコントローラーがあり、LM335 温度センサーの値をサンプリングしています。私が持っている LCD ライブラリを使用すると、10 ビット ADC によってサンプリングされた 16 進値を表示できます。10 ビット ADC は、0x0000 から 0x03FF までの値を提供します。
私が問題を抱えているのは、16 進値を通常の人間が理解できる形式に変換しようとすることです。
私はこの問題で完全に迷っているので、どんなリードも大歓迎です。
次のように 10 進数を構成する「文字列」を作成できます (定数は、実際の値のサイズによって異なります。0 ~ 255 と推測し、null で終了するかどうかなど)。
char result[4];
char i = 3;
do {
result[i] = '0' + value % 10;
value /= 10;
i--;
}
while (value > 0);
Roman Hocke のスニペット コードには少し誤りがあることを指摘しておきます。このバージョンは、0 ~ 255 の範囲の 10 進数で問題なく動作します。任意の範囲に簡単に拡張できます。
void dec2str(uint8_t val, char * res)
{
uint8_t i = 2;
do {
res[i] = '0' + val % 10;
val /= 10;
i--;
} while (val > 0);
res[3] = 0;
}
基本的に、問題は数値を10進数に分割して、LCDライブラリを使用して各セルに1桁を送信できるようにする方法です。
LCD が 7 セグメント セルに基づいている場合、ASCII コードではなく、各桁に対して 0 から 9 までの値を出力する必要があります。'0'
追加しない限り、@Roman Hockeによるソリューションはこれで問題ありませんvalue % 10
数値を数字に分割するもう 1 つの方法は、BCD に変換することです。そのために、除算やモジュール操作を使用せずに数値を BCD に変換できる「ダブル ダブル」というアルゴリズムがあります。
「Double dable」アルゴリズムは、除算演算を備えていないマイクロコントローラーに最適に聞こえます。ただし、ウィキペディアでそのようなアルゴリズムを簡単に見落とすと、動的メモリを使用していることがわかります。これは、除算のルーチンよりも悪いようです。もちろん、malloc() とその仲間への呼び出しを使用していない実装がそこにあるはずです。