ELECTRONICS |
|
10進数を16進数に変換
PICマイコンとアセンブラ
|
■10進数を16進数に変換 16進数を10進数に変換する記事は過去に紹介しましたが、今回はその逆の機能を作りました。 「16進数→10進変換の記事」
例 10進数 ’00001000’ → 16進数 0x0003E8
10進数は各一桁(デジット)を1レジスタにして管理します。
桁数分だけレジスタの数が増えます。
これにより、各桁に0x30を加算すれば数値を文字として、LCDやパソコンに送信することができます。
■アルゴリズム
アルゴリズムとしては次のようになります。
最上桁に10を掛けて、一つ下の桁を加算します。
これを最下位桁まで繰り返すと変換が完了します。
式にすると次のようになります。
HEX = (((((((((((((DIGIT_8 x 10) + DIGIT_7 ) x 10 ) + DIGIT_6 ) x 10 ) + DIGIT_5 ) x 10 )
+ DIGIT_4 ) x 10 ) + DIGIT_3 ) x 10 ) + DIGIT_2 ) x 10 ) + DIGIT_1
■10の掛け算ルーチンが必要
掛け算は左ビットシフトが簡単ですが、2、4、8・・・と2の倍数のみとなります。
ここでは10を掛けますので専用に10の掛け算ルーチンが必要になります。
10の掛け算は2倍した結果と8倍した結果を足し算することで実現できます。
よって、左ビットシフト(1シフト、3シフト)を使用して10の掛け算をしております。
BIN(H/M/L) << 3 + BIN(H/M/L) << 1 = BIN(H/M/L) × 10
■使い方
DIGIT8からDIGIT1に10進数の各桁をセットします。
例は10進数で 1000をセットしております。
DEC2HEX24をコールすると変換が実行されます。
movlw D'0'
movwf DIGIT_8 ; 最上位
movlw D'0'
movwf DIGIT_7
movlw D'0'
movwf DIGIT_6
movlw D'0'
movwf DIGIT_5
movlw D'1'
movwf DIGIT_4
movlw D'0'
movwf DIGIT_3
movlw D'0'
movwf DIGIT_2
movlw D'0'
movwf DIGIT_1 ; 最下位
call DEC2HEX24
結果はBIN_H , BIN_M , BIN_Lの3バイトに格納されます。
結果はBIN_H=0x00 , BIN_M=0x03 , BIN_L=0xE8 となります。
10進数を16進数に変換プログラム → 「こちら」
C言語ではたぶん、ライブラリーがあると思いますが、アセンブラで組まれる場合このライブラリーを使用していただければ簡単になると思い紹介しました。
フリーウェアとして公開します。
報告不要、改変自由、質問不可、ご指摘はお受けします。
|
|
|
|
|
|