BCD をキーワードに検索して来てくれる方がいらっしゃいます。 BCD ( Binary-coded decimal )は二進化十進数と呼ばれ、10進数を2進数( 4bit )で表現します。 何と言っても慣れ親しんだ10進数を扱う為に必須の手法です。 楽々PICでもLCD表示は勿論、時間や温度の設定などは人に親しみ易い10進数を扱うために頻繁に使っています。
下図は2進数を指折り数える方法で、折り曲げた指が 1 を広げた指が 0 を示し、親指( bit0 )~薬指( bit3 )の順に使います。 4bit で表現できる0~15(16通り)を数え、最後に小指だけ折り曲げた絵が bit4 への桁上がりです。 5本指( 5bit )で表現できるのは32通りですが、指がつりそうな絵が出てきます。 ちなみに私は下図16番ですら左手の助けを要します。(笑)
BCDは 4bit で表現できる16通りの中から四角く囲った10通りだけを使います。 残り6通りの情報が無駄になるのですが、親しみ易さには代えられません。
8bit 16進 000H~0FFH は256通りの表現が出来ますが、この内10通りだけを使って 000H~009H と表現するのが一桁BCD、上下各 4bit (16通り)の内10通りだけを使って 000H~009H~010H~099H と表現するのが二桁BCDです。 一桁BCDは10/256と言う効率の悪さが気になりますが、ASCII変換や計算をする時に扱い易い点が特徴です。
言葉であれこれ説明するより、幾つかの例をアセンブラ・ソースで示します。 <PICデバイス=18F1320>
2桁BCDを入力値に、次の処理をしています。
(1)2桁BCDを1桁BCD(2byte)に分離 (逆変換は省略)
(2)1桁BCDを ASCII Code に変換 (逆変換は省略)
(3)1桁BCDを2進数に変換
(4)100未満の2進数を1桁BCD(2byte)に変換
4bit を切り出すために AND でマスクしたり、上位 4bit と下位を入れ替える SWAPF (チョットめずらしい命令)を使っています。 私は常にBCD→バイナリーと一方向に変換するので、バイナリーからのBCD変換は初めてです。 DAW と言う命令が使えるのかと期待してしまいましたが2桁BCDからの桁溢れを調べる命令のようです。(もう少し調べてみます)
下図は、上図の実行結果です。
18F ニーモニックと小技のインデックスはこちら → 18F: テーブル・ジャンプ
「楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。
下図は2進数を指折り数える方法で、折り曲げた指が 1 を広げた指が 0 を示し、親指( bit0 )~薬指( bit3 )の順に使います。 4bit で表現できる0~15(16通り)を数え、最後に小指だけ折り曲げた絵が bit4 への桁上がりです。 5本指( 5bit )で表現できるのは32通りですが、指がつりそうな絵が出てきます。 ちなみに私は下図16番ですら左手の助けを要します。(笑)
BCDは 4bit で表現できる16通りの中から四角く囲った10通りだけを使います。 残り6通りの情報が無駄になるのですが、親しみ易さには代えられません。
8bit 16進 000H~0FFH は256通りの表現が出来ますが、この内10通りだけを使って 000H~009H と表現するのが一桁BCD、上下各 4bit (16通り)の内10通りだけを使って 000H~009H~010H~099H と表現するのが二桁BCDです。 一桁BCDは10/256と言う効率の悪さが気になりますが、ASCII変換や計算をする時に扱い易い点が特徴です。
言葉であれこれ説明するより、幾つかの例をアセンブラ・ソースで示します。 <PICデバイス=18F1320>
2桁BCDを入力値に、次の処理をしています。
(1)2桁BCDを1桁BCD(2byte)に分離 (逆変換は省略)
(2)1桁BCDを ASCII Code に変換 (逆変換は省略)
(3)1桁BCDを2進数に変換
(4)100未満の2進数を1桁BCD(2byte)に変換
4bit を切り出すために AND でマスクしたり、上位 4bit と下位を入れ替える SWAPF (チョットめずらしい命令)を使っています。 私は常にBCD→バイナリーと一方向に変換するので、バイナリーからのBCD変換は初めてです。 DAW と言う命令が使えるのかと期待してしまいましたが2桁BCDからの桁溢れを調べる命令のようです。(もう少し調べてみます)
下図は、上図の実行結果です。
18F ニーモニックと小技のインデックスはこちら → 18F: テーブル・ジャンプ
「楽々PIC」は楽しい道具を作りながら学ぶブログを目指します。