• ベストアンサー

マイコンプログラム - 16進をキャラクタに

10BitのADCのメモリを読んでキャラクタに変換、UARTで送信、と言ったことを考えています。 (unsigned short)adcmem = 0x03FF →  (unsigned char)res[4] = {'0','3','F','F'} ただC言語環境下でのマイコンプログラムであるためsprintfなどといった関数は使用できず困っています。 何かよい案があればよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

unsigned short adcmem = 0x03FF; unsigned char res[4]; int i; for (i = 0; i < 4; i++)  res[i] = "0123456789ABCDEF"[(adcmem >> (12 - i*4)) & 0xf]; でどうですか?

Reduction
質問者

お礼

初見で正直まったくわかりませんでした。 しかしやってみるとすごくわかりやすいですね。 このようなキャラクタの選択方法があるとはまったく知りませんでした。 勉強不足を痛感します。ありがとうございました。

その他の回答 (1)

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

ASCIIコードへの変換でいいのかな? であれば、 ------ unsigned short adcmem unsigned char res[4]; int i, j; unsigned short work; for(i = 3, j = 0; i > 0; i--, j++) { work = (admem >> (4 * i)) & 0x000F; /* 4bit取り出し */ if( (0 <= work) && (work <= 9)) /* 0-9 */ { res[j] = (unsigned char)(work + 0x30); } else /* A-F */ { res[j] = (unsigned char)(work + 0x37); } } ------ みたいに4bitずつ取り出して、ASCIIコードに変換すればいいけど。

Reduction
質問者

お礼

とてもわかりやすい回答ありがとうございます。 やはり4Bitずつ取り出すのが最善のようですか。 もっと勉強します。

Reduction
質問者

補足

後で見直すためにも補足させてもらいます。 コンパイラの警告で pointless comparison of unsigned integer with zero が表示される場合はworkがunsignedのため。= 0以下にならない。 そのため (0 <= work) && の書式は符号つきの場合に必要。 For文が4回いかないため i > 0 を i >= 0に。

関連するQ&A