SEG-LCD時計


電卓等に使われている様な液晶ディスプレイ(LCD)は通常、PCF8577CP (RSコンポーネントで買えるみたいです) 等のLCD専用のLSIを使ったり、74HC4543(7セグメント用)を使ったりするみたいだが、 74HC164を使った方法( 7セグメント液晶を2線だけで制御する) が紹介されていたので試してみる事にしました。

記事中ではLCDモジュールとして扱うためにI2Cを採用してますが、なるべく電池を 長持ちさせたい事から、マイコンは1つにしたいのでこれは組み込まない事としました。

セグメント方式の液晶ディスプレイ(SEG-LCD)は秋月通商で扱っている 液晶パネル SP-521 を使います…というか、これが一番手に入りやすかったのです。本当は24時間表示を させたかったので [88:88] 表示ができるSEG-LCDが欲しかったのですが…。 (RSコンポーネンツ で手に入るみたいです)
SP-521の説明書は無かったので、ココ から拝借しました…。すいません…


 



LCDはcommon端子とセグメント端子間に直流電圧をかけ続けると壊れてしまう(焼ける?)ので、 common端子にHigh/Lowを定期的に変化させた矩形波を与え、点灯させたいセグメントに 対してはcommon端子と反対の位相の電圧を与え、消灯させたいセグメントにはcommon端子と 同位相の電圧を与えるみたいだ。




LCDの制御方法はそのLCDの構成によって何種類かあるみたいなので一概に上記の定義が 成り立つとは限らないのだが…
今回しようするSEG-LCD(SP-521)はcommon端子が1つ(実際は2つあるが内部で繋がっている) で、1つのセグメントにたいして1つの端子が出ているタイプなので、上記の定義が成り立つ みたいです。

SEG-LCDには複数の独立したcommon端子を持ってるものとかあるみたいで、これは少し 複雑な制御をしているらしい(参考HP)


74HC164はラッチ機能なしのシフトレジスタなので、各端子は状態をシフトする毎に 電圧がデータに応じて変動する。
今回はこのICを4つ繋げて使用しようと思っているので、1回画面を書き換えるのに 最大で8x4=32回のシフトが発生して、その間、各端子は本来設定しようとしている 出力とは異なる電圧を出してしまうのだ。

でも、この辺はLCDの反応の遅さを利用してうまくごまかしているみたいです。
つまり、LCDが点灯→消灯に変わるまでの反応時間より早くシフトを完了させ、目的の表示 パターンになった状態で一定時間待ち、またシフトさせ…の繰り返しを行うようで、 LCDが変化について行けず、見かけ上は表示したいパターンが点灯してる状態が続いている って構成らしい。


って事で、SP-521の反応時間は……分かりませんorz。
参考元 で紹介されている LCD-S401C-52TR の反応速度は数10ms(曖昧)と書いてあるので、 同じSEG-LCDだし、SP-521もその辺りとしておいて良いと思います(保障なし)。


何はともあれ、回路図を描いてみましょう。ついでに結線図も。
一応、後で使いまわしが出来るように、LCD表示部分とマイコン部分は別基板にする事に しました。(本当はLCD + ICで手ごろな大きさのユニバーサル基板が埋め尽くされそうに なったからなんて事は言えません…)



 


ここまで来て、重大な事に気がついてしまいました!!
そうです、私はこの最も重要である74HC164を使った事がないのです!!!

とりあえずデータシート を確認すると、Clockの立ち上がりエッジで QA→QB、 QB→QC、 QC→QD、 QD→QE、 QE→QF、 QF→QG、 QG→QH に移動させ、A(B)の値をQAに入れるようです。



 


取りあえずブレッドボードにAVRと74HC164を設定して確認だ。
LED付けるのはメンドイので、74HC164のQA〜QHの端子電圧を テスターで当たって確認すとしましょう。

確認用のプログラムです。




フムフム。難なく意図通り動作する事を確認できました (^o^)/

って事で、LCD表示部分の基板の作成です。
ベースとなる74HC164とVcc,GND,信号線は鈴メッキ銅線で結線したかったので、 最近多様ぎみなカプトンテープを使って結線しました。
LCDとの結線には流れる電流も少ないし、複雑に結線しないといけないのとで、 UEW(ウレタン被覆銅線)を使いました。


 

 


さて、ケースに入れる時の事を考え、まだAVRを乗せる側の基板を作ってないですが、 テスト環境をブレッドボード上に構築してソースコードの作成に入ります。

今回は時計という事もあり、なるべく省電力で済む構成にしたいので、スリープ機能を 使う事にします。
表示内容を更新 → スリープ → 表示内容更新 → スリープ ……といった構成です。

スリープからは定期的(今回は16ms毎)に復帰しないといけないので 比較一致タイマ/カウンタ クリア(CTC)機能を使い、 タイマ/カウンタ0 比較A一致割り込みにてスリープから復帰させます。 故に、スリープは内部のカウンタが有効なアイドル動作 を使います。

システムクロック = 1MHzで16ms毎にスリープから復帰させる例を下記します。




#define     nop()   __asm__ __volatile__ ("nop")

void main(void)
{

    /* 16msタイマ割込み生成 比較一致タイマ/カウンタ クリア(CTC)動作  */
    TCNT0   = 0x00U;
    OCR0A   = 250 - 1;      /* 250カウント 【注意】一致後、次の周期でクリアされる  */
    TIMSK   = 0x01U;
    TCCR0A  = 0x02U;
    TCCR0B  = 0x03U;    /* 64分周   */


    set_sleep_mode(SLEEP_MODE_IDLE);    /* アイドルモード設定    */


    while (1) {
        sei();      /*********** 割込み許可 ***************/
        sleep_mode();
        nop();      /* 念の為、nopを複数個入れておく    */
        nop();
        nop();
        nop();
        cli();      /*********** 割込み禁止 ***************/
    }
}

/****************************************************************************/
/* タイマ/カウンタ0比較A一致割り込み                                               */
/* Sleepからの復帰用に発生させているのみなので空関数                        */
/****************************************************************************/
ISR(TIMER0_COMPA_vect)
{
    return;
}
			


これらの事を踏まえて、構成したのが次のプログラムです。

SEG-LCD時計ソースコード

ブレッドボードにATtiny2313V(低電圧版)とその他周辺回路を構成して思い通りに動作 しているか確認です。



先ずは、D5端子にデバッグ用としてスリープからの復帰毎にポートのHi/Loを繰り返す様にして 「本当にスリープに入っているのか」 and 「16msで起動できているのか」を検査した 波形です。



そして、LCDのcommon端子(CH1)とdot端子(CH2)とその差(CH1-CH2)を撮った波形(M)です。

dot端子は1秒毎に点灯/消灯を切り替えているので、Mの波形で点灯する時は±に振れて、 消灯する時は0Vとなるのが理想です。が、今回は16ms毎に各端子のHi/Loを設定する為に データのシフト部分が入るので、チョコチョコと余分な波形が検出されています。




波形も良好という事で、AVR側の基板を作る事にします。
というか、ケースの加工までしてしまって完成です (^^;


 

 


単4電池 2本使ってます。
消費電流を測定してみると、160μAでした。
果たして何日間持つのだろうか…ランニングテスト中です。


<-Back
管理者: 宝 寿々郎(TAKARA Jujurou)