AVR入門その2

前回 の続きです。今回は7セグで数字を表示します。


目次


10. 7セグメントLEDとは

まず、今回扱う7セグメントLEDについて説明します。

7セグメントLEDとは上の画像のようなLEDを使った表示器のことをいいます。7個のLEDを使い一桁の数字を表すことから、その名前がつきました。

下の図のように、それぞれの辺ごとにLEDが配置されています。例えば、「7」と表示したければ、AとBとCのLEDを点灯すれば良いわけです。

7セグでは、それぞれの桁で、LEDのカソード側(-側)もしくはアノード(+側)がくっついています。カソード側がくっついたものをカソードコモン、アノード側がくっついたものをアノードコモンといいます。今回はカソードコモンを使います。

7セグの回路図です。今回は、DIG1とGNDの接続をPB0の出力で決めます。PB0をHIGHにすると繋がるような回路にします。以下が7セグを制御するための回路図です。1

11. プログラム

前回 と10.の内容を参考にして、 0~9までを1秒ごとに繰り返しカウントアップするプログラム を書いてみましょう。

11.1. ヒント

  • 今回はPORTDはPD0~PD7まで8ピン、PORTBのPB0を使います。そのため、レジスタの値を以下のように設定します。
ビット76543210
DDRDPD7PD6PD5PD4PD3PD2PD1PD0
11111111
ビット76543210
DDRB-PB6PB5PB4PB3PB2PB1PB0
-0000001
  • 7セグのLEDのON/OFFは全てPORTDのピンで制御できます。そのため、レジスタPORTDの値を決めることによって文字を表示できることになります。 例えば、「7」を表示したければ、PD0,PD1,PD2をHIGHにすればよいのでPORTDの0,1,2桁目のビットを1にします。 つまり、PORTD=0x07とすれば良いことが分かります。
ビット76543210
ピンPD7PD6PD5PD4PD3PD2PD1PD0
LEDDPGFEDCBA
00000111
  • 0~9の数字に対応するPORTDの値を配列にしておけば、少ないコード量で処理を書けます。

11.2. プログラム例

#include<avr/io.h>
#include<util/delay.h>


void display(int);

int main(void){
	DDRD=0xFF;
	PORTD=0b00000000;
	DDRB=0x01;
	PORTB=0x01;
	int d=0;
	while(1){
		display(d);
		_delay_ms(1000);
		d=(d+1)%10;
	}
	return 0;
}

void display(int d){
	/*ピンの接続:
	 * PORTD:
	 * 	0 -> A		
	 * 	1 -> B		    A
	 * 	2 -> C		  +---+
	 * 	3 -> D		F | G |B
	 * 	4 -> E		  +---|
	 * 	5 -> F		E |   |C
	 * 	6 -> G		  +---+ .
	 * 	7 -> DP		    D   DP
	 * */
	const unsigned char digit[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
	if(0<=d && d<=9){
		PORTD=digit[d];
	}
}

11.3. プログラムの解説

  • 8,9行目:PORTDはPD0からPD7まで全て出力モードとして使いたいため、DDRDを0xFFとします。(ヒント参照)
  • 10,11行目:PORTCはPB0だけを出力モードとして使いたいのでDDRDの0桁目のビットだけを1にします。また、PB0をONにしたいのでPORTDの0桁目のビットだけを1にします。
  • 12行目:ここでは変数dを7セグで表示します。
  • 13~17行目:「dの値を7セグで表示して一秒待つ」という処理を何回も繰り返します。
  • 16行目:dは0,1,2,…,9,0,1,…と変化します。やっていることはdに1足して10で割ったあまりをdに入れています。
  • 21~37行目:今回のプログラムの一番重要な部分です。dの値に合わせてLEDのON/OFFを変更する関数です。(ヒント参照)
    • digitには、digit[0]をPORTDに入れると「0」が、digit[1]をPORTDに入れると「1」が、digit[2]を入れると「2」が…と添え字(0~9)を表示するようにしています。

今回はこれで終了です。 次回 は4桁全てを点灯させてみます。


  1. 分かりやすくするために、書き込み回路とRESETピンのpull-up抵抗は省略しました。 ↩︎


シェアする: