- ベストアンサー
マイコンプログラム - 16進をキャラクタに
10BitのADCのメモリを読んでキャラクタに変換、UARTで送信、と言ったことを考えています。 (unsigned short)adcmem = 0x03FF → (unsigned char)res[4] = {'0','3','F','F'} ただC言語環境下でのマイコンプログラムであるためsprintfなどといった関数は使用できず困っています。 何かよい案があればよろしくお願いします。
- みんなの回答 (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]; でどうですか?
その他の回答 (1)
- arain
- ベストアンサー率27% (292/1049)
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コードに変換すればいいけど。
お礼
とてもわかりやすい回答ありがとうございます。 やはり4Bitずつ取り出すのが最善のようですか。 もっと勉強します。
補足
後で見直すためにも補足させてもらいます。 コンパイラの警告で pointless comparison of unsigned integer with zero が表示される場合はworkがunsignedのため。= 0以下にならない。 そのため (0 <= work) && の書式は符号つきの場合に必要。 For文が4回いかないため i > 0 を i >= 0に。
お礼
初見で正直まったくわかりませんでした。 しかしやってみるとすごくわかりやすいですね。 このようなキャラクタの選択方法があるとはまったく知りませんでした。 勉強不足を痛感します。ありがとうございました。