応用情報技術者試験 過去問 2011年(平成23年) 春期 午後 問7

LEDを使用したディジタル時計の設計

Z社では,6個の7セグメントLEDで年月日及び時分秒を表示するディジタル時計の設計を行っている。

[ディジタル時計の機器構成]

ディジタル時計のブロック図を,図1に示す。このディジタル時計は,LED,MPU,クロックカウンタ,リアルタイムクロック(以下,RTCという),機械的な押しボタン式スイッチ(以下,SWという),及びプログラムで入出力を設定できるプログラマブル入出力装置(以下,PIOという)で構成される。

ディジタル時計のブロック図
図1 ディジタル時計のブロック図

[ディジタル時計の動作]

  1. 電源を入れると,初期化プログラムによってRTC,クロックカウンタ,PIOにそれぞれ初期設定データを書き込み,初期化する。SWを押しているときは年月日を表示し,押していないときは時分秒を表示する。
  2. RTCは年月日,時分秒データ(以下,時刻データという)を保持し,RTC自身が時刻を更新する。RTCは1秒ごとにMPUに割込みを行い,RTC割込みハンドラを起動する。RTC割込みハンドラは,RTCから時刻データを読み込む。読み込んだデータは,配列Dateに,西暦年の下2桁た,月,日が格納され,配列Timeに,時,分,秒が格納される。例えば,読み込んだ時刻データが2011年4月17日,12時34分56秒ならば,Date[0]~Date[5]に1,1,0,4,1,7が,Time[0]~Time[5]に1,2,3,4,5,6が格納される。
  3. クロックカウンタは,クロックをカウントし,1ミリ秒ごとにMPUに割込みを行い,クロックカウンタ割込みハンドラを起動する。

[PIO]

PIOの構成を図2に示す。PIOは,それぞれ16ビットで構成される入出力制御レジスタ(以下,PIO_Rという)とデータレジスタ(以下,PIO_Dという)から成る。

PIOには16個の入力又は出力の設定が可能な端子があり,それぞれPIO_Dの1ビットに割り当てられる。

  1. PIO_Rは,PIO_Dの各ビットを入力にするか出力にするかを決める。PIO_Rのビット Ri を1にするとPIO_Dのビット Di は出力に指定され,0にすると入力に指定される。
  2. PIO_Dにデータを書き込むと,PIO_Rによって出力に指定されたビットのデータだけが端子から出力される。一方,PIO_Dのデータを読み込むと,PIO_Rによって入力に指定された端子のデータだけが読み込まれる。入力に指定されていないビットのデータを読み込むと不定の値となる。
    PIOの構成
    図2 PIOの構成
  3. PIO_Dの D14 に割り当てられた端子には,SWが接続される。SWを押している間はオンとなり,そのとき PIO_D を読み込むとそのビットは1,SWがオフのときそのビットは0となる。PIO_Dを読み込むとそのときの D14 の値がSWの状態となる。

[ダイナミック点灯方式]

このディジタル時計で使用しているLEDの表示方法は,ダイナミック点灯方式である。ダイナミック点灯方式は,短時間に一つのLEDだけを点灯し,点灯するLEDを順に切り替え,あたかも全体が点灯しているかのように見せる方式である。

図3にLEDのセグメント割当てを,図4にLED表示部の構成を示す。

  1. PIO_Dの下位8ビット D0~D7 のうち,D0~D6 にはLEDのセグメント a~g を割り当てて,D7 には小数点 dp を割り当てる。具体的には,D0 をLEDのセグメント a に,D1 を b に,...,D6 を g に割り当てる。
  2. PIO_Dの上位8ビット D8~D15 のうち,D8~D13 には,LED0~LED5を割り当てて,D14 にはSWを割り当てる(D15は使用しない)。具体的には,D13 をLED5に,D12 をLED4に,...,D8 をLED0に割り当てる。
  3. LEDを点灯するためには,点灯するセグメントに対応するビット D0~D7 に1を書き込み,点灯するLEDに対応するビット D8~D13 に1を書き込む。

例えば,表示する時分秒のうち,"分"の10分台の数字はLED3,1分台の数字はLED2である。LED3に4を表示させるためには,PIO_Dに16進数0866を書き込む。

セグメント割当て
図3 セグメント割当て
LED表示部の構成
図4 LED表示部の構成

[クロックカウンタ割込みハンドラ]

クロックカウンタ割込みハンドラは,ダイナミック点灯の制御及びSWの入力の判定を行う。その流れ図を図5に示す。

配列Pattern[0]~[9]はそれぞれ16ビットの符号なし整数で,LEDに0~9を表示するための点灯セグメントの情報を格納する。例えば,Pattern[4]はLEDに4を表示するため,16進数0066を格納している。

i はLEDを示すカウンタ,cnt はSWの切替え時に状態が安定するまで待ち合わせるためのカウンタで,それぞれ16ビットの符号なし整数であり,初期値はいずれも0である。

swState はSWの状態を表す1ビットの変数であり,prev は直前の割込み処理で検出したSWの値を表す1ビットの変数である。初期値はいずれも0である。

work 及び pwork は,16ビット符号なし整数であり,作業用の変数である。

図5中の①の処理は,SWの状態が変化したときに,状態が安定するまで待ち合わせる処理である。

クロックカウンタ割込みハンドラの流れ図
図5 クロックカウンタ割込みハンドラの流れ図
出典:平成23年度 特別応用情報技術者試験 午後 問7