マイクロチップ社アプリケーションノートAN526のBCD変換を使ってみます。
動き方を理解しないまま使うなんてできない!
なのでAN526「Binary To BCD Conversion Routine」を元に実数を入れ込んで結果を見てみます!
理論はこちらを参照ください。
シフトを繰り返してキャリーを数珠繋ぎに入れ込んでいけばいいみたいですね。
AN526のダウンロードはこちらから
用意するレジスタ
・BCD変換データ:R0、R1、R2
・Binaryデータ:H_byte、L_byte
・添付(計算時に利用):temp
・カウンター:count
計7byte用意する必要がありますね
各ニブル R0左ニブル R0右ニブル R1左ニブル R1右ニブル R2左ニブル R2右ニブル Hbyte Lbyte 結果 --- 万の位 千の位 百の位 十の位 一の位 破損 破損
フローの簡易説明
・ビットシフト
最初にL_byteを左シフトして結果をH_byteに入れ込む・・・つまり
L_byte→H_byte→R2→R1→R0
のような感じでこれを16回繰り返します。
・10進補正
R0~R2に入ってきた数字が5(B'0101')を超えたら3を足します。
実際に0x63H(99)を入れてやってみる。
各BYTE R1 R2 Lbyte 入れる値 '00' '00' '63'
16bitは面倒くさいので8bitの8ステップでやってみます。
MAX255なのでH_byteは要りませんし3ケタなので、
R0そのものとR1の左ニブルには必要ありません。
各byte R1右 R2左 R2右 Lbyte Lbyte右 memo step0 ---- ---- ---- 0110 0011 代入 step1 ---- ---- ---0 1100 011X none step2 ---- ---- --01 1000 11XX none step3 ---- ---- -011 0001 1XXX none step4 ---- ---- 0110 0011 XXXX +3 step4' ---- ---- 1001 0011 XXXX 補正後 step5 ---- ---1 0010 011X XXXX none step6 ---- -010 0100 11XX XXXX none step7 ---- 0100 1001 1XXX XXXX -3 step7' ---- 0100 1100 1XXX XXXX 補正後 step8 ---0 1001 1001 XXXX XXXX 補正無
結果
R1=0、R2=10011001となりました。99っぽいです!
あとはキャラ変換すればシリアル通信でも使えそうですね!
例)百の位=H'30'+R1右、十の位=H'30'+R2左、一の位=H'30'+R2右
ニブルとは・・・4ビット。