BCD⇔DEC
最近2進化10進数(BCD)を扱う必要になることがあったのでメモ書きとして記事にしたいと思います。
BCDとは10進数の一桁を4ビット区切りで表す表現方法になります。マイコンを含むコンピューターでの内部では0/1の2進数で計算が行われていますが、その結果をヒトが確認した時に理解しやすいように10進数と2進数の中間的な表記をしたのがBCD表記になります。
例えば“123”をBCD表現で表すと”000100100011″となります。使用用途としては7セグメントLEDのデコーダドライバを使用するときにBCD表現を用いる場合があります。
デコーダドライバとは2進→10進に変換するもので、4ビット(4線)で入力したBCD表記を10進数に直すことができるドライバICになります。(FA機器などで表示機を使用するときはPLCでDECからBCDに変換することが多くあるかと思います。)
10進数 | BCD |
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
今回はデコードドライバのレビューではなく、基本的な【10進数からBCD表記】への変換とその逆の【BCD表記から10進数】の変換方法をArduinoを使用して説明していきたいと思います。
ArduinoでDEC⇔BCDのやりざま
早速ですが、DECとBCDの相互変換コードを載せたいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
void setup() { uint16_t D=1234; uint16_t B; Serial.begin(9600); B = DECtoBCD(D); D = BCDtoDEC(B); Serial.println(B,BIN); Serial.println(D); } //10進数から2進化10進数 uint16_t DECtoBCD(uint16_t dec){ uint8_t a, b, c, d; uint16_t bcd; a = dec/1000; b = (1234%1000)/100; c = (1234%100)/10; d = (1234%10)/1; bcd=a<<12|b<<8|c<<4|d;//4桁BCD Serial.println(bcd,BIN); return bcd; } //2進化10進数から10進数 uint16_t BCDtoDEC(uint16_t bcd){ uint8_t a,b,c,d; uint16_t dec; a=bcd&0b1111;//4桁目 b=bcd>>4&0b1111;//3桁目 c=bcd>>8&0b1111;//2桁目 d=bcd>>12&0b1111;//1桁目 dec=a+10*b+100*c+1000*d;//4桁10進数 return dec; } void loop() { } |
このコードでは2つの関数を設けています。
- uint16_t DECtoBCD(uint16_t dec):10進数をBCD表記に変換する関数
- uint16_t BCDtoDEC(uint16_t bcd):BCD表記を10進数に変換する関数
DEC→BCD
10進数からBCD表記への変換方法です。
【手順】
- 除算と剰余で”1234″を一桁づつ分解します
- 分解した桁を4ビットづつシフトしてビット演算(OR)で結合させます。
BCD→DEC
BCD表記から10進数への変換方法です。
【手順】
- 4ビット区切りで0b1111の&を取るビット演算を行い値を抽出する
- 抽出した桁を各桁の乗数を掛けて足し合わせる
おわりに
最近はBCDでデコードすることで7セグ表示機に数字を表すよりもシリアル通信タイプの7セグ表示機の方が電子工作では使いやすいと思います(参考に使うことの多いdata,clockタイプの7セグ表示機を載せておきますね)。
しかし、FA機器ではまだBCDコードで数値を表示する表示機が結構あるので覚えといて損はないかと思います。まあ、FA機器ではPLCでのシーケンス回路で構築すると思うのでBCD命令でサクッと変換できてしまいますけどね。
では、今回はこれで終わりたいと思います。
ではでは~
コメント