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

<<