本文へ移動
サポートシェアリングソリューション
OKWAVE Plus

このQ&Aは役に立ちましたか?

ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PIC16F84 10進-->2進変換プログラム)

PIC16F84での10進→2進変換プログラムとは?

2023/09/06 16:37

このQ&Aのポイント
  • PIC16F84を使用した制御において、10進の値を2進に変換するプログラムの作成について相談です。
  • デジスイッチを使用して、0から99までの範囲で設定された10進の値をPICマイコンのレジスタに読み込ませ、その値を2進数に変換したいです。
  • 現在は引き算を利用してプログラムを書いているが、より効率的な方法があるかどうか相談したいです。
※ 以下は、質問の原文です

PIC16F84 10進-->2進変換プログラム

2008/12/15 05:53

いつもお世話になっております。
google等で検索して居りますが行き詰まってこちらに投稿させて
頂きました、何卒宜しくお願いいたします。
PICマイコン 16F84などを使った制御を行っていますが下記の
アセンブラプログラムが書けなくて苦慮して居ります。

10進-->2進変換

具体的には・・・・
10進(0~9)二桁のデジスイッチをRB0,1,2,3のポートにダイオードOR
にて接続して設定値00~99までのどれか一つの数字をレジスタに読み
込ませます、一度設定したら少なくとも数日はそのままです。
例えばデジスイッチを63に設定すればレジスタにも63と読み込まれ
ますがPICマイコン側から見れば10進の63では無くてそれは16進の63H
だと当然判断されます、これを2進変換して3FHに書き替えたいのです。

デジスイッチ設定値63
0110 0011
↓↓↓↓
3FH
0011 1111

デジスイッチ設定値50ならば
0101 0000
↓↓↓↓
32H
0011 0010

デジスイッチ設定値99ならば
1001 1001
↓↓↓↓
63H
0110 0011

原始的に引き算を繰り返す事で00から99までのプログラムを書きましたが
大変冗長的で他に既知のプログラムが有るのではないか、例えばBit反転
して幾つを足すとか引くとかそのような簡単なプログラムが有れば是非
ご教示頂きたいと存じます。

16進(0~F)のデジスイッチならこの様な変換は無用なのですが人間
が相手なのでどうしても10進デジスイッチを使うことを要求されます。
初歩的な質問ですがどうか宜しくお願いいたします。

質問者が選んだベストアンサー

ベストアンサー
2008/12/15 12:58
回答No.2

学生さんかな?
10進ではなく、BCD(2進化10進数)ですな。
アセンブリ言語の基本演習として、たいてい何処の本にも出ています。

既に、ははは氏から良い回答が付いていますので、私の方は、
アルゴリズムとしての提示を。

BCD → Bin の変換は、上の桁から取り込みます。(基本テクニック)
1)BCDを1桁取得し、これを10倍。
2)10倍の演算は、サブルーチン化しておく。
  2Bit左シフト(=4倍)+ 元の値 = 5倍の値
  これをさらに、1Bitシフト。よって、10倍。
3)次の桁を取り込んで、加算。
4)次の桁がない場合には、10分の1に逆計算。
  桁数が決まっているなら、4)の部分は適宜にアレンジ。
  初めに次の桁有無の判定をしてから、10倍でも可。
 (一般には上記の方が、プログラムし易い。)

まぁ、何かアルゴリズム辞典でも参照してみて下さい。
直ぐに見つかると思う。

お礼

2008/12/15 13:53

有り難う御座いました、大変良く理解出来ました
「ははは」さんのご説明と両方頂けたので本当に楽でした
紙に色々な数字を書いてみてやってみて「・・なーるどぉ」
でした。
>初めに次の桁有無の判定をしてから、10倍でも可。
これがポイントですね。
お忙しい中ご回答下さり心から御礼申し上げます。
>10進ではなく、BCD(2進化10進数)
まったく仰る通りです、正しい言葉を使わないと思わぬ
誤解や無駄が生じます注意したいと思います。

重ねまして、誠に有り難う御座いました。<(__)>

質問者

このQ&Aは役に立ちましたか?

この質問は投稿から一年以上経過しています。
解決しない場合、新しい質問の投稿をおすすめします。

質問する

その他の回答 (2件中 1~2件目)

2008/12/15 09:43
回答No.1

単純にこうゆうこと?
上位4ビット
下位4ビット

入力側が10進方なので
10が入力されると レジスタに10 と入るが これを 0A二変換したいということなのかしら

上位4ビットにマスクをかける
PIC16F84のマシン後は知らないので
z80風に(相当忘れているので、間違っているかもしれませんが)

A=011H これを11にする

'下位4ビット取り出す (10進法の1の位 これは変わらない)
ld c,a
and c,00FH 'レジスタCに下位4ビットが入る Cレジスタは01H

'上位4ビットを取り出す(10進法の10の位 これが変)Aレジスタは010H
and a,0F0H ’レジスタA を 上位4ビットにする

'1/16 と同じ(16進法の 1の位に合わす) Aレジスタは01H
srl a
srl a
srl a
srl a

'10倍する Bレジスタは0AH
ld b,a
add b,a
add b,a
add b,a
add b,a
add b,a
add b,a
add b,a
add b,a
add b,a

ld a,b 'Aに変換された10の位を入力 Aレジスタは0AH

’A+C 足し算する 0AH+01H = 0BH
add a,c

お礼

2008/12/15 13:46

"ゼッパチ"の愛称、現役です。
鶴屋南木さんのご回答も"ははは"さんのご説明で大変良く
理解できました、お忙しい中ご教示頂き心から感謝致します。
PICの命令語はZ80と比較して35個と少なくその分行数が
多く成る傾向に有る様子です、最初は35個なら憶えるのも
楽かなと思ったものですがどうしてどうして・・・。
誠に有り難う御座いました。<(__)>

質問者

お礼をおくりました

さらに、この回答をベストアンサーに選びますか?

ベストアンサーを選ぶと質問が締切られます。
なおベストアンサーを選びなおすことはできません。