みなさん、こんにちは。
ケロタン少佐デあります(^_^)ヾ
本日は昨日に引き続き、
16ビットの除算にて
得られた計算結果を、7セグメントに表示させる為に
BCD変換させるプログラムを考えていたデあります♪
チャララ・タッ・タッ・タァ~~~♪
スキル『BCD変換』を覚えた・・・!!!!
* 検証内容は、時速60km/h時での車速パルスからの計算 *
* 前回、16ビットの除算により、16進での解が2バイトで0x00,0x60と導き出されました。
* 今回は、これらの数値を4ビット毎に、個別に取り出して見ます。
以下、AVRアセンブラでのプログラム例
;************************************************************************
; 2バイト(16bit)のBCD変換
; 車速パルス数から速度計算
; * 符号なし16÷16ビット(35400÷589)試験 時速60km/h *
; * 2バイト00,60(16進) → 4バイト00,00,06,00(16進)
; * 速度最適化 16ビット2進数⇒4桁非パック化BCD変換試験 *
LDI BIN1,00 ;2進値(=00)取得
RCALL B2D8S_H ;2進数⇒BCD変換(=$00,$00)
LDI BIN2,60 ;2進値(=60)取得
RCALL B2D8S_L ;2進数⇒BCD変換(=$06,$00)
ENDLP:
rjmp ENDLP ;
B2D8S_H: ;
CLR BCD1H ;BCD上位桁バイト値初期化
CPI BIN1,10*8 ;2進値80以上か検査
BRCS B2D8S1_H ;80未満で分岐
SUBI BIN1,10*8 ;2進値-80
ORI BCD1H,0b00001000 ;商(BCD上位桁)ビット3=1設定
B2D8S1_H: ;
CPI BIN1,10*4 ;2進値40以上か検査
BRCS B2D8S2_H ;40未満で分岐
SUBI BIN1,10*4 ;残2進値-40
ORI BCD1H,0b00000100 ;商(BCD上位桁)ビット2=1設定
B2D8S2_H: ;
CPI BIN1,10*2 ;2進値20以上か検査
BRCS B2D8S3_H ;20未満で分岐
SUBI BIN1,10*2 ;残2進値-20
ORI BCD1H,0b00000010 ;商(BCD上位桁)ビット1=1設定
B2D8S3_H: ;
CPI BIN1,10 ;2進値10以上か検査
BRCS B2D8S4_H ;10未満で分岐
SUBI BIN1,10 ;残2進値-10
ORI BCD1H,0b00000001 ;商(BCD上位桁)ビット0=1設定
B2D8S4_H: ;
MOV BCD1L,BIN1 ;
RET ;呼び出し元へ復帰
B2D8S_L: ;
CLR BCD2H ;BCD上位桁バイト値初期化
CPI BIN2,10*8 ;2進値80以上か検査
BRCS B2D8S1_L ;80未満で分岐
SUBI BIN2,10*8 ;2進値-80
ORI BCD2L,0b00001000 ;商(BCD上位桁)ビット3=1設定
B2D8S1_L: ;
CPI BIN2,10*4 ;2進値40以上か検査
BRCS B2D8S2_L ;40未満で分岐
SUBI BIN2,10*4 ;残2進値-40
ORI BCD2L,0b00000100 ;商(BCD上位桁)ビット2=1設定
B2D8S2_L: ;
CPI BIN2,10*2 ;2進値20以上か検査
BRCS B2D8S3_L ;20未満で分岐
SUBI BIN2,10*2 ;残2進値-20
ORI BCD2L,0b00000010 ;商(BCD上位桁)ビット1=1設定
B2D8S3_L: ;
CPI BIN2,10 ;2進値10以上か検査
BRCS B2D8S4_L ;10未満で分岐
SUBI BIN2,10 ;残2進値-10
ORI BCD2L,0b00000001 ;商(BCD上位桁)ビット0=1設定
B2D8S4_L: ;
MOV BCD2L,BIN2 ;
RET ;呼び出し元へ復帰
;*************************************************************************
無事に、0x00,0x00,0x06,0x00 と取り出すことに成功しました♪
これで、速度が、100k/hを超えても、7セグメントにてデジタル表示させることが
可能になったデあります♪
4桁まであれば、エンジン回転でも大丈夫でしょう!!
では、引き続き研究の世界へ・・・(^_^;)ヾ