マイクロチップ社アプリケーションノートAN526のBCD変換を使ってみます。
動き方を理解しないまま使うなんてできない!
なのでAN526「Binary To BCD Conversion Routine」を元に実数を入れ込んで結果を見てみます!
理論はこちらを参照ください。シフトを繰り返してキャリーを数珠繋ぎに入れ込んでいけばいいみたいですね。 
AN526のダウンロードはこちらから


■Ⅰ:準備用意するレジスターは、






各ニブルR0左ニブルR0右ニブルR1左ニブルR1右ニブルR2左ニブルR2右ニブルH_byteL_byte
結果---万の位千の位百の位十の位一の位破損破損


 ・BCD変換データ:R0、R1、R2
 ・Binaryデータ:H_byte、L_byte
 ・添付(計算時に利用):temp
 ・カウンター:count
 計7byte用意する必要がありますね
■Ⅱ:流れの簡易説明
 ・ビットシフト
  最初にL_byteを左シフトして結果をH_byteに入れ込む・・・つまり
  L_byte→H_byte→R2→R1→R0
  のような感じでこれを16回繰り返します。
 ・10進補正
  R0~R2に入ってきた数字が5(B'0101')を超えたら3を足します。
■Ⅲ:実際にH'63'(=D'99')を入れてやってみる。






各バイトR1R2L_byte
入れる値'00''00''63'


16bitは面倒くさいので8bit8ステップでやってみます。MAX255なのでH_byteは要りませんし3ケタなので、R0そのものとR1の左ニブルには必要ありません。






  
  
  
  
  
  
  
  
  
  
各バイトR1右R2左R2右L_byte左L_byte右memo
ステップ0------------01100011代入後
ステップ1-----------01100011xnone
ステップ2----------01100011xxnone
ステップ3---------01100011xxxnone
ステップ4--------01100011xxxx+3
ステップ4'--------10010011xxxx補正後
ステップ5-------10010011xxxxxnone
ステップ6-----010010011xxxxxxnone
ステップ7----010010011xxxxxxxx+3
ステップ7'----010011001xxxxxxxx補正後
ステップ8---010011001xxxxxxxx補正しない


 ・結果は、R1=0、R2=10011001となりました。99っぽいです!
  あとはキャラ変換すればシリアル通信でも使えそうですね!
  例)百の位=H'30'+R1右、十の位=H'30'+R2左、一の位=H'30'+R2右
  ニブルとは・・・4ビット。