7セグメント LEDの時計
Osamu Tamura @ Recursion Co., Ltd.
1. 概要
7セグメントLEDをつないで時計を作りました。
2. 回路図
LED の桁がまとまったものを選べば配線が煩雑にならずに済みます。ここではカソードコモン3桁のものを2つ使いました。アノードコモンならプログラムでポート出力を反転させ ます。I/Oポートでダイナミック点灯しますが、電流制限用に100〜220Ωの抵抗を入れます。
図1. 時計の回路図
3. プログラム
10mSecの割込みでダイナミック点灯するとちらつくので、割込みタイミングを3.3mSecに変更して表示桁をシフトします。その分、1秒割込みも速くなるので間引いて計時します。数値から7セグメント点灯パターンへは文字列を配列代わりにして変換しました。ゼロブランキング処理や時分秒区切りの小数点を入れました。
/* ----------------------------- 時計 ----------------------------- */ 0xff 0x24 =sfr // ポートB を出力 0xff 0x27 =sfr // ポートC を出力 25 0xb3 =sfr // clk タイミング(3.3mS) "\x3f\x06\x5b\x4f\x66\x6d\x7d\x27\x7f\x6f\x00" :初期設定 ;桁 [6]LED 桁 ++ 6 >= { . 0 } if =桁 1 桁 << ~ 0x28 =sfr 桁 LED 0x25 =sfr :表示 over 10 >= { 10 / } { . 10 } ifelse @s over ++ =LED over 10 % @s over { 0x80 | } if swap =LED :更新 ;待ち 待ち { 待ち -- =待ち return } if 2 =待ち ;時 ;分 ;秒 秒 ++ 60 == { 分 ++ 60 == { 時 ++ 24 == { . 0 } if 4 更新 =時 . 0 } if 2 更新 =分 . 0 } if 0 更新 =秒 :計時 初期設定 10 4 更新 =時 08 2 更新 =分 00 0 更新 =秒 0 =待ち { 表示 計時 } interrupt @c . 77 0xb3 =sfr :時計リスト1.時計のプログラム
数値を表示できると応用が広がります。ストップウォッチ、周波数カウンタ、温度計などいろいろできそうです。
4. おまけ
ストップウォッチを作りました。1/100 秒まで計れます。SW1 でスタート、SW2 でストップ、両方押すとクリアします。
/* ----------------------------- ストップウォッチ ----------------------------- */ 0xff 0x24 =sfr // ポートB を出力 0xff 0x27 =sfr // ポートC を出力 25 0xb3 =sfr // clk タイミング(3.3mS) "\x3f\x06\x5b\x4f\x66\x6d\x7d\x27\x7f\x6f" // 7seg パターン :初期設定 0x29 sfr 2 >> ~ 3 & // スイッチ読み取り :sw ;桁 [6]LED 桁 ++ 6 >= { . 0 } if =桁 1 桁 << ~ 0x28 =sfr 桁 LED 0x25 =sfr ;停止 停止 { return } if ;待ち 待ち { // 間引き 待ち -- =待ち return } if 2 =待ち ;i [6]値 // 値++ して LED 更新 6 0 { dup =i i 値 ++ 10 >= { . 0 } if // 繰上げ? dup i =値 dup @s i =LED break // 繰上がりなしで中断 ++ } for .. 2 LED 0x80 | 2 =LED // 小数点 :計時 6 0 { 0 over =値 0 over =LED ++ } for .. 3 0 { 0 @s over =LED ++ } for .. :消去 初期設定 消去 0 =停止 0 =待ち { 計時 0 } interrupt { sw { 1 { 0 =停止 } case 2 { 1 =停止 } case 3 { 消去 } case } switch . @c? break } do @c . 77 0xb3 =sfr :stopwatchリスト2.ストップウォッチのプログラム
3 May. 2006