ICL7137 (2)
5 セグメント・パターンから BCD (Binary Coded Decimal) への変換部分を、 PLD (Programmable Logic Device) である Lattice GAL16V8 を使って「ランダム・ロジック」によるハードウェアとして実現した例を示します。
GAL16V8 の OLMC (Output Logic MacroCell) のモードとして、「Registered」モード以外の「Complex」モードあるいは「Simple」モードに設定すれば、入力を 10 本、出力を 8 本使えるので、2 桁分の回路をひとつのチップにおさめることができます。
入出力の割り当てのようすを下に示します。
ロジックは Atmel (Microchip) の「WinCUPL」で記述しました。
Name SEG2BCD ; PartNo 00 ; Date 2019/09/02 ; Revision 01 ; Designer pcm1723 ; Company individual ; Assembly None ; Location ; Device g16v8 ; /* GAL16V8 */ /* 7 segment pattern to BCD encoder */ /* *************** INPUT PINS *********************/ /* active low inputs for annode common LED */ /* digit 1 */ PIN 1 = !seg_1a; PIN 2 = !seg_1b; PIN 3 = !seg_1e; PIN 4 = !seg_1f; PIN 5 = !seg_1g; /* digit 2 */ PIN 6 = !seg_2a; PIN 7 = !seg_2b; PIN 8 = !seg_2e; PIN 9 = !seg_2f; PIN 11 = !seg_2g; /* *************** OUTPUT PINS *********************/ PIN [19..16] = [bcd1out3..0] ; PIN [15..12] = [bcd2out3..0] ; /***** product terms for segment pattern decode *****/ /***** digit 1 *****/ code_1blank = (!seg_1a & !seg_1b & !seg_1e & !seg_1f & !seg_1g); /* ICL7137 pattern */ code_10 = ( seg_1a & seg_1b & seg_1e & seg_1f & !seg_1g); code_11 = (!seg_1a & seg_1b & !seg_1e & !seg_1f & !seg_1g); code_12 = ( seg_1a & seg_1b & seg_1e & !seg_1f & seg_1g); code_13 = ( seg_1a & seg_1b & !seg_1e & !seg_1f & seg_1g); code_14 = (!seg_1a & seg_1b & !seg_1e & seg_1f & seg_1g); code_15 = ( seg_1a & !seg_1b & !seg_1e & seg_1f & seg_1g); code_16 = ( seg_1a & !seg_1b & seg_1e & seg_1f & seg_1g); code_17 = ( seg_1a & seg_1b & !seg_1e & !seg_1f & !seg_1g); code_18 = ( seg_1a & seg_1b & seg_1e & seg_1f & seg_1g); code_19 = ( seg_1a & seg_1b & !seg_1e & seg_1f & seg_1g); /* another pattern */ code_10a = (!seg_1a & !seg_1b & seg_1e & !seg_1f & seg_1g); code_16a = (!seg_1a & !seg_1b & seg_1e & seg_1f & seg_1g); code_17a = ( seg_1a & seg_1b & !seg_1e & seg_1f & !seg_1g); /***** digit 2 *****/ code_2blank = (!seg_2a & !seg_2b & !seg_2e & !seg_2f & !seg_2g); /* ICL7137 pattern */ code_20 = ( seg_2a & seg_2b & seg_2e & seg_2f & !seg_2g); code_21 = (!seg_2a & seg_2b & !seg_2e & !seg_2f & !seg_2g); code_22 = ( seg_2a & seg_2b & seg_2e & !seg_2f & seg_2g); code_23 = ( seg_2a & seg_2b & !seg_2e & !seg_2f & seg_2g); code_24 = (!seg_2a & seg_2b & !seg_2e & seg_2f & seg_2g); code_25 = ( seg_2a & !seg_2b & !seg_2e & seg_2f & seg_2g); code_26 = ( seg_2a & !seg_2b & seg_2e & seg_2f & seg_2g); code_27 = ( seg_2a & seg_2b & !seg_2e & !seg_2f & !seg_2g); code_28 = ( seg_2a & seg_2b & seg_2e & seg_2f & seg_2g); code_29 = ( seg_2a & seg_2b & !seg_2e & seg_2f & seg_2g); /* another pattern */ code_20a = (!seg_2a & !seg_2b & seg_2e & !seg_2f & seg_2g); code_26a = (!seg_2a & !seg_2b & seg_2e & seg_2f & seg_2g); code_27a = ( seg_2a & seg_2b & !seg_2e & seg_2f & !seg_2g); /***** encode to BCD *****/ /***** digit 1 *****/ bcd1out0 = (code_11 # code_13 # code_15 # code_17 # code_19 # code_17a # code_1blank); bcd1out1 = (code_12 # code_13 # code_16 # code_17 # code_16a # code_17a); bcd1out2 = (code_14 # code_15 # code_16 # code_17 # code_16a # code_17a); bcd1out3 = (code_18 # code_19 # code_1blank); /***** digit 2 *****/ bcd2out0 = (code_21 # code_23 # code_25 # code_27 # code_29 # code_27a # code_2blank); bcd2out1 = (code_22 # code_23 # code_26 # code_27 # code_26a # code_27a); bcd2out2 = (code_24 # code_25 # code_26 # code_27 # code_26a # code_27a); bcd2out3 = (code_28 # code_29 # code_2blank);
ICL7137 の「0」~「9」の表示パターン 10 種と、「6」、「7」、「0」の別パターン 3 種との合計 13 種のパターンをデコードしています。
この 13 種以外のパターンについては積極的にデコードしておらず、結果的に 13 種以外のパターン入力については、BCD 値として「0」が出力されます。
ICL7137 では、「オーバーレンジ」を示すのにハードウェアの信号線は用意されておらず、LED ディスプレイの
- 1000 の位が「1」
- 100 の位、10 の位、1 の位の 3 桁がいずれも「ブランク」(全セグメント消灯)
つまり、「1⌴⌴⌴」あるいは「-1⌴⌴⌴」という表示になることで表現しています。
5 セグメントの「ブランク」状態をデコードすればオーバーレンジを検出でき、BCD 出力値として 0x0a ~ 0x0f のいずれかの値を出力すれば、数値データを受け取る側のマイコンでもオーバーレンジを認識できます。
ここでは、簡単に「ブランク」→「9」と変換することにして、オーバーレンジの状態では普通の数値として「1999」あるいは「-1999」と、最大値あるいは最小値に「飽和」した値が出力されるようにしています。
ソフトウェアによる実現としては、各セグメントの値 (正論理) とインデックスの変数の各ビットとを
- セグメント a → b0
- セグメント b → b1
- セグメント e → b2
- セグメント f → b3
- セグメント g → b4
のように対応させて、下の 32 バイトのテーブルを引けば簡単に変換できます。
uint8_t const seg2bcd[32] = { 9, 0, 1, 7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 5, 4, 9, 6, 6, 0, 8, }; // uint8_t const seg2bcd[]