Wave-Denshi
トップ
Home
オプションパーツ
ご注文
ダウンロード
お問合せ
mail
 戻る 

8桁7セグLED表示器 動作説明



全回路図
ここではC言語を利用して説明していきます

ダイナミック点灯は人間の目の残像特性を利用し、約1.6mSごとに点灯する桁を切り替えます。 

ABCは点灯する桁を切り替え選択する、3本の信号線です
0−7で8桁の内1つを選択します
点灯するポジション情報をメモリーに1つ確保します( 変数名 led_pog )

D0−D3は4Bitデーターバスです
4ビットラッチIC HC175×2個で8ビットをラッチします

CLK1は Low データー 4Bitのラッチ信号 ( Low から Hiでデーターをラッチします )
CLK2は Hi   データー 4Bitのラッチ信号  ( Low から Hiでデーターをラッチします )

この8ビットで1桁をを表します (Bit7はデシマルポイント DP)
数字の0−9を7セグLEDに表示するにはデーター変換行います
数字の1は16進数で06Hexとなり
数字の0−9は16進数で0=3F,1=06,2=5B,3=4F,4=66,5=6D,6=7D,7=27,8=7F,9=67 (Hex)となります

テーブルは次のように確保します
int tbl[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x67};

8桁のデーターエリア 
int  led_data[8]; を確保します

数字の1をテーブル変換する場合
led_pog = 2;		// 2桁目
led_data[led_pog] = tbl[1]; としてテーブルから変換します

次のようにタイマー割り込みを利用し表示します
タイマー割り込み8巡し8桁全点灯します
8桁全点灯するのに1.6mS×8=12.8mS掛かります。

一例として 01234567 を表示するサンプルの一部です
初期宣言、初期設定の部分は省いてます
led_set()でled_data[8]へ 01234567 をテーブル変換してデーターを入れています。
その後はタイマー割り込みで次々とデーターを表示してます
タイマー割り込みが1.6mSと早くなってますが、ちらつかない場合は3.2mSと遅くして下さい

/*--------------------------------------------------*/
unsigned int	led_pog;
unsigned int	led_data[8];
/*--------------------------------------------------*/
rtcc_isr() {					// タイマー0 1.6mS 割込み処理ルーチン
	char data;
	
	++led_pog;				// 点灯する桁 ポジションをインクルメント
	if(led_pog > 7) led_pog = 0;

	data = led_data[led_pog];

	port_c = led_pog;			// 点灯する桁 ポジションを選択 (ABC 3本の信号線)

	port_d = data;
	output_high(DL);			// CLK1 Low 4Bit Data のラッチ信号
	output_low(DL);
	
	swap(data);				// Hi Low 4Bitデーターの入れ替え
	
	port_d = data;
	output_high(DH);			// CLK2 Hi  4Bit Data のラッチ信号
	output_low(DH);
}
/*------- Main Loop --------------------------------*/
void main()   {
	int_init();				// タイマー0 初期設定
	led_set();				// 表示データーのセット

	while(1){				// 無限ループ
	}
}
/*--------------------------------------------------*/
void led_set(void) {
	int tbl[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x67};
	int i;
	
	for (i = 0;i < 8;i++) {
		led_data[i] = tbl[i];		// 01234567 をテーブル変換してデーターを入れています。
	}

	bit_set(led_data[3],7);			// 1000の位にデシマルポイントをセット
}
/*--------------------------------------------------*/
void int_init(void) {				// INTERRUPTコントローラ イニシャル

	setup_counters(RTCC_INTERNAL,RTCC_DIV_32); //タイマ0のモード設定
						  //RTCC_DIV_32 1.6mSごとに割り込み RTCC_DIV_64 3.2mS
	enable_interrupts(INT_RTCC);		  //タイマ0割込み許可	
	enable_interrupts(GLOBAL);		  // GLOBAL割り込み許可
}
/*--------------------------------------------------*/


 TopPage     戻る