アフィリエイト広告
アフィリエイト広告

74HC161A版 デジタル時計 / 7セグLED表示回路(仮)

4bit 同期カウンタIC 74HC161A をつかって、デジタル時計をつくっています。

74HC161A版 デジタル時計 / 時刻合わせ回路
4bit 同期カウンタIC 74HC161A をつかって、デジタル時計をつくります。これまでに、74HC161A をつかって秒、分、時をカウントする回路などをつくりました。 今回は、これらをつないで時刻合わせをおこなう制御回路をつくりましょ...

デジタル時計はできましたが、BCD信号を出力するだけなのでわかりにくいです。とりあえず、仮に 7セグメントLED をつけて、時分を表示できるようにしました。今回は、そのメモ、ってことで。

回路図

図1. Arduino 接続図

7セグメントLED ドライバは TM1630 をつかいますので、制御は Arduino NANO で行ないます。

図1 が Arduino まわりの接続図です。

入力は、デジタル時計からの時、分の BCD データ。分は 1の位が 4桁、10の位が 3桁。時は 1の位が 4桁、10の位が 1桁です。午前/午後表示は行なっていません。

TM1630 にわたす出力は DIO、CK、STB の 3線です。

図2 は、TM1630 を使った 7セグメントLED 表示回路です。これは毎回使っている回路。ドライバ IC 1個でできるので、とっても便利です。TM1630 の取り扱いについては、過去記事を参照ください。

図2. 7セグメントLED 表示回路

ということで、回路としては単純につなげただけです。
えーと、回路図はバス配線 (青色のライン) で書いてます。たとえば、図1 では、MIN00 の信号はラベル「2」でバスに入って、Arduino の D2 ピンにつながる。図2 ならば、TM1630 の SEG2/KS2 ピンからラベル「SEG2」でバスに入って、抵抗 R9 をとおって Seg-A から 7セグメントLED につながる。
そんな感じ。

スケッチ

デジタル時計からの時、分の BCD データを、7セグメントLED 4桁に表示させるだけのスケッチです。

  1. // Digital Clock Display v.0.1 2023.04.16 meyon
  2. class TM1630 {
  3. private:
  4.   const byte DISPLAY_MODE = 0x00;
  5.   const byte WRITE_REG_AUTO_ADDR = 0x40;
  6.   const byte WRITE_REG_FIXED_ADDR = 0x44;
  7.   const byte READ_KEY_SCAN = 0x42;
  8.   const byte SET_DISPLAY_ADDR = 0xC0;
  9.   const byte DISPLAY_OFF = 0x80;
  10.   const byte DISPLAY_ON = 0x88 | 0x84;
  11.   const byte STB_ENABLE = LOW;
  12.   const byte STB_DISABLE = HIGH;
  13.   const int DOT_POSITION = -1;
  14.   const byte digit[12] = {
  15.     0b01111110, // 0
  16.     0b00001100, // 1
  17.     0b10110110, // 2
  18.     0b10011110, // 3
  19.     0b11001100, // 4
  20.     0b11011010, // 5
  21.     0b11111010, // 6
  22.     0b01001110, // 7
  23.     0b11111110, // 8
  24.     0b11011110, // 9
  25.     0b00000000, // 10:blank
  26.     0b00100000 // 11:dot
  27.   };
  28.   const byte dioPin = 10;
  29.   const byte clkPin = 11;
  30.   const byte stbPin = 12;
  31.   const byte numberOfDigits = DISPLAY_MODE & 1 ? 5 : 4;
  32.   const byte blank = 10;
  33.   const byte dot = 11;
  34.   byte gridData[];
  35. public:
  36.   TM1630() {
  37.     pinMode(dioPin, OUTPUT);
  38.     pinMode(clkPin, OUTPUT);
  39.     pinMode(stbPin, OUTPUT);
  40.     gridData[numberOfDigits] = {0};
  41.     digitalWrite(stbPin, STB_ENABLE);
  42.     shiftOut(dioPin, clkPin, LSBFIRST, DISPLAY_MODE);
  43.     digitalWrite(stbPin, STB_DISABLE);
  44.     digitalWrite(stbPin, STB_ENABLE);
  45.     shiftOut(dioPin, clkPin, LSBFIRST, WRITE_REG_AUTO_ADDR);
  46.     digitalWrite(stbPin, STB_DISABLE);
  47.   }
  48.   void displayNumbers(int num) {
  49.     int n = constrain(num, 0000, 9999);
  50.     for (byte i = 0; i < numberOfDigits; i++) {
  51.       int exponentialInDecimal = pow(10, i) + 0.5;
  52.       bool zeroSuppression = (0 != i) && (DOT_POSITION < i) && (exponentialInDecimal > n);
  53.       gridData[i] = zeroSuppression ? blank : n / exponentialInDecimal % 10;
  54.     }
  55.     digitalWrite(stbPin,STB_ENABLE);
  56.     shiftOut(dioPin, clkPin, LSBFIRST, SET_DISPLAY_ADDR | 0x00);
  57.     for (byte i = 0; i < numberOfDigits; i++) {
  58.       shiftOut(dioPin, clkPin, LSBFIRST, digit[gridData[i]]);
  59.       shiftOut(dioPin, clkPin, LSBFIRST, DOT_POSITION == i ? digit[dot] : 0);
  60.     }
  61.     digitalWrite(stbPin, STB_DISABLE);
  62.     digitalWrite(stbPin, STB_ENABLE);
  63.     shiftOut(dioPin, clkPin, LSBFIRST, DISPLAY_ON);
  64.     digitalWrite(stbPin, STB_DISABLE);
  65.   }
  66. };
  67. const byte min00 = 2;
  68. const byte min01 = 3;
  69. const byte min02 = 4;
  70. const byte min03 = 5;
  71. const byte min10 = 6;
  72. const byte min11 = 7;
  73. const byte min12 = 8;
  74. const byte hour00 = 9;
  75. const byte hour01 = 14;
  76. const byte hour02 = 15;
  77. const byte hour03 = 16;
  78. const byte hour10 = 17;
  79. TM1630 ssd;
  80. void setup() {
  81. }
  82. void loop() {
  83.   static byte bcd_min0 = 0;
  84.   static byte bcd_min1 = 0;
  85.   static byte bcd_hour0 = 0;
  86.   static byte bcd_hour1 = 0;
  87.   static int bcd = 0;
  88.   bcd_min0 = digitalRead(min00);
  89.   bcd_min0 += digitalRead(min01) << 1;
  90.   bcd_min0 += digitalRead(min02) << 2;
  91.   bcd_min0 += digitalRead(min03) << 3;
  92.   bcd_min1 = digitalRead(min10);
  93.   bcd_min1 += digitalRead(min11) << 1;
  94.   bcd_min1 += digitalRead(min12) << 2;
  95.   bcd_hour0 = digitalRead(hour00);
  96.   bcd_hour0 += digitalRead(hour01) << 1;
  97.   bcd_hour0 += digitalRead(hour02) << 2;
  98.   bcd_hour0 += digitalRead(hour03) << 3;
  99.   bcd_hour1 = digitalRead(hour10);
  100.   bcd = bcd_hour1*1000;
  101.   bcd += bcd_hour0*100;
  102.   bcd += bcd_min1*10;
  103.   bcd += bcd_min0;
  104.   ssd.displayNumbers(bcd);
  105.   delay(0);
  106. }

3~78行目は、TM1630 の制御部分。displayNumbers(n) に、表示したい 4桁の数値 n を渡すだけです。

80~92行目が入力ピン番号の定義。94行目は TM1630 クラスのインスタンス化。

setup() は何もすることがありません。各ピンの入力モードを明示的に宣言しておいても良いかも。出力ピンに関してはコンストラクタがやりますので、何もしなくていいです。出力ピンの定義は 31~33行目にあります。

loop() では、各入力データをべた〜っとつなげて 4桁の数値にしているだけ。129行目の delay(0) は、TM1630 の処理待ち時間です。

後記

TM1630 は、7セグメントLED の表示とともにキー入力もできるので、いろいろガジェットに利用できそうです。ライブラリもあるようなので、お好みで。

今回は、時分表示用の 7セグメントLED を、仮に、つけてみました。7セグメントLED については、以前にも試してみたのですが、ダイナミック点灯の回路 (過去記事) をつくりたいと思っています。まぁ、近いうちに。

タイトルとURLをコピーしました