私は 47 を持っています。バイナリでは 0010 1111 です。47 を分割する必要があるため、バイナリ 0000 0100 で 4 を取得し、バイナリ 0000 0111 で 7 を取得します。
私はこの答えを見ましたが、Intel 8085にはdiv命令がないため、連続した減算を行うことで除算する必要があります.どうすればモジュラスを取得できますか?
プロセッサに除算命令(または別の方法であるBCD変換命令)がない場合は、減算を繰り返す必要があります。このための擬似コードは次のようになります。
val = 47
units = val
tens = 0
loop:
if units < 10 goto done
units = units - 10
tens = tens + 1
goto loop
done:
;; tens = 4, units = 7.
かなり基本的なコーディングスタイルについてお詫びします。アセンブラ言語での表示に少し近づけようとしました。そうでなければ、私はwhile
ループを使用したでしょう:-)
モジュラスは、units
変数が10を下回ると変数に残るものです。
完全を期すために(これが宿題の場合は追加のマーク、ナッジナッジ、ウィンクウィンク)、1つのオクテットで最大255を処理できるため:
val = 247
units = val
tens = 0
hundreds = 0
loop1:
if units < 100 goto loop2
units = units - 100
hundreds = hundreds + 1
goto loop1
loop2:
if units < 10 goto done
units = units - 10
tens = tens + 1
goto loop2
done:
;; hundreds = 2, tens = 4, units = 7.
この方法が機能する証拠として、次のPythonコードを試すことができます。
val = 47
units = val
tens = 0
while units >= 10:
units = units - 10
tens = tens + 1
print "Tens = %d, Units = %d"%(tens,units)
これは実際に出力します:
Tens = 4, Units = 7
これらの値を使用してLEDデバイスを駆動するという点では、単純なルックアップテーブルがおそらく最も簡単です。2つの8ビットメモリアドレスに書き込む必要のある値の配列を作成し、その数字を使用して、デバイスに書き込むためにそれらの値を検索します。
理解しやすいので、簡略化された7セグメントLED(および小数点)を使用します。
a
---
f | | b
-g-
e | | c
--- . h
d
この例で、メモリマップされた場所に1バイトを書き込み、abcdefgh
このバイトのビットがどのセグメントをオンにするかを制御するとします。
異なる桁の値(小数点なし)は(テストされていないため、微調整が必要な場合があります):
abcdefgh
0 11111100
1 01100000
2 11011010
3 11110010
4 01100110
5 10110110
6 10111110
7 11100000
8 11111110
9 11110110
値4が与えられた場合、そのテーブルのオフセット4でバイトを検索し(テーブルのベースアドレスと値を単純に加算して)、メモリからそのバイトを抽出し、それを使用してLEDセグメントを設定します。その値は、01100110
セグメント、、、およびを設定b
し、次のようc
になります。f
g
| |
---
|
15セグメントのLEDがあり、バイトではなくワードを書き込む必要があるため、特定の状況はもう少し複雑ですが、理論はまったく同じです。
各桁に書き込む必要のある値のテーブルを用意し、上記のアルゴリズムから計算された値を使用して、そのテーブルにオフセットします。
ここでは基本的にBCD表現を扱っています。バイナリからBCDへの変換には多くのリソースがあり、その後は個々の数字を非常に簡単に取得できます。
たとえば、これらの命令を使用してバイナリからbcdに変換し、BCDディジットのサブアドレスをループして、それぞれを単一のスタンドアロンバイトとして読み取ります。コードはシンプルで高速、そして要領を得ています。
私が提案する解決策は、常に2桁の16進数があることを検討することです(この例では4と7を使用しましたが、AとEの場合もあります)。*および7は0111であり、記述されている1111ではありません
これは、1つの16進数が正確に4つの2進数に対応するというヒントです。したがって、たとえば0xA245は1010(A)0010(2)0100(4)0101(5)です。
最後に、私の提案は、高ニブル(4)を取得するために4ビットの右回転を実行することだけです。7を取得するには、上位ニブル(0x0F)でバイトを0に対してマスクするだけです。
Cでは、次のようになります。highNibble = value >> 4; lowNibble =値&0x0F;
私が自分自身を明確にし、それがこの問題の解決に役立つことを願っています。