電子工作

【電子工作】PICマイコン「2進-16進 7セグ 表示ボード」製作

【電子工作】PICマイコン「2進-16進 7セグ 表示ボード」製作

デジタル回路の基本で、最初に意識する2進数。

本サイトでもその必要性を「情報工学の基礎」として、関連する記事を紹介しています。

【情報工学基礎】指で数える2進数の覚え方、初心者向け、わかりやすく説明

 

16進デコーダー(7セグLED)

本記事は、実際のスイッチを用いて、その値を16進として表示する回路を紹介いたします。

 

入力スイッチ

スイッチレバーを動かすことでON/OFFを行い、それを一般的なトグルスイッチを使用して2進数をイメージ(指で数える代わりに)し、パチパチと上げ下げの操作で入力します。

 

7セグ表示器

数字情報専用のデジタルLED表示モジュール(通称:7セグLED)を利用し、16進表記で出力します。

アノードコモンとカソードコモンの2種類の回路がありますが、本回路は共通ピン(コモン)が「-」のカソードコモンタイプを使用しています。

マトリクス

入力値を判定し、その情報に対する値を7セグLEDにて出力して16進表示、

つまり、7セグLEDの各セグメントに接続されるPICの対応ピンを制御します。

この接続に関連する対応表をマトリクスとして作成し、プログラム化して実行します。

 

標準タイプ

トグルスイッチ入力(単独)タイプ

部品表

回路図

スイッチに連動された2進表記LED、入力信号をプルダウン回路で構成しています。

プログラム

  1. プルダウンで入力されたスイッチ信号を判定
    ON:「+」信号
  2. 信号情報を判定をし、作成したマトリクスを元に対応する7セグ情報を出力
/*===========================================================================
/
/    2進・16進 Display Board
/
/	PIC 16F1827
/
/   MPLAB X IDE v5.45 , XC8
/                                               https://www.pochiweb.com
/
/============================================================================
/  16F1827
/
/ 01-RA2 ← bin  #2 S/W-3(P/D)       18-RA1 ← bin  #1 S/W-2(P/D)
/ 02-RA3 ← bin  #3 S/W-4(P/D)       17-RA0 ← bin  #0 S/W-1(P/D)
/ 03-RA4                             16-RA7
/ 04-RA5                             15-RA6
/ 05-VSS                             14-VDD
/ 06-RB0 → 7SEG g(10)               13-RB7 → 7SEG a(07)
/ 07-RB1 → 7SEG f(09)               12-RB6 → 7SEG b(06)
/ 08-RB2 → 7SEG e(01)               11-RB5 → 7SEG c(04)
/ 09-RB3 → 7SEG d(02)               10-RB4 → (7SEG .(05))
/
/============================================================================
*/
	#include <xc.h>

// CONFIG1
	#pragma config FOSC = INTOSC		// 内部発振使用
	#pragma config WDTE = OFF			// Watchdog タイマ OFF
	#pragma config PWRTE = ON			// パワーアップタイマ(立上り待機) ON
	#pragma config MCLRE = OFF			// リセット(外部入力での) OFF , DIGITAL Input
	#pragma config CP = OFF				// コードプロテクト(プログラム) OFF
	#pragma config CPD = OFF			// データ コード プロテクト OFF
	#pragma config BOREN = OFF			// ブラウンアウトリセット(低電圧検知) OFF
	#pragma config CLKOUTEN = OFF       // RA6 I/O
	#pragma config IESO = OFF			// 内部、外部クロック切り替え OFF
	#pragma config FCMEN = OFF			// クロックモニタ OFF

// CONFIG2
	#pragma config WRT = OFF			// 4kフラッシュメモリ 保護 OFF
	#pragma config PLLEN = OFF			// 4xPLL 動作 OFF
	#pragma config STVREN = OFF			// スタック?オーバーフロー リセット OFF
	#pragma config BORV = LO			// 電源電圧降下常時監視 電圧設定 LO(1.9V)
	#pragma config LVP = OFF			// 定電圧プログラミング機能 OFF

	#define _XTAL_FREQ 8000000			// 8MHz発振

	int main(void)
	{
		OSCCON = 0b01110100;			// 8MHz セット

		ANSELA = 0b00000000;            // RA デジタル設定
		ANSELB = 0b00000000;            // RB デジタル設定
		
		TRISA = 0b00001111;				// ポートA,0-3 入力設定
		TRISB = 0b00000000;				// ポートB 出力設定

		PORTB = 0b00000000;				// ポートB 初期化

		unsigned char bin_sw;			// 2進値域、初期化
		bin_sw = 0X00;
        
		bin_sw = PORTA;				// 2進スイッチ情報セット
		bin_sw = bin_sw & 0x0f;		// 2進値マスク

		PORTB = 0b00000000;				// ポートB 初期化

		switch(bin_sw){

			case 0x00:
				PORTB = 0b11101110;	// 「0」
				break;

			case 0x01:
				PORTB = 0b01100000;	// 「1」
				break;

			case 0x02:
				PORTB = 0b11001101;	// 「2」
				break;

			case 0x03:
				PORTB = 0b11101001;	// 「3」
				break;

			case 0x04:
				PORTB = 0b01100011;	// 「4」
				break;

			case 0x05:
				PORTB = 0b10101011;	// 「5」
				break;

			case 0x06:
				PORTB = 0b10101111;	// 「6」
				break;

			case 0x07:
				PORTB = 0b11100000;	// 「7」
				break;

			case 0x08:
				PORTB = 0b11101111;	// 「8」
				break;

			case 0x09:
				PORTB = 0b11101011;	// 「9」
				break;

			case 0x0a:
				PORTB = 0b11100111;	// 「A」
				break;

			case 0x0b:
				PORTB = 0b00101111;	// 「b」
				break;

			case 0x0c:
				PORTB = 0b10001110;	// 「C」
				break;

			case 0x0d:
				PORTB = 0b01101101;	// 「d」
				break;

			case 0x0e:
				PORTB = 0b10001111;	// 「E」
				break;

			case 0x0f:
				PORTB = 0b10000111;	// 「F」
				break;

			default:
			break;
		}
    return 0;
   }

 

 

拡張タイプ

標準のスイッチ入力機能+自動表記(デモ出力)モード追加 タイプ

部品表

回路図

入力信号をプルアップ回路で構成し、出力結果を2進LEDと7セグに対応させています。

自動表記(デモモード)は、タクトスイッチでRA5に接続しています。

プログラム

  1. 自動表記(RA5)の判定
    長押し:デモモードとして、0->15までの指示ビットを設定し共通ルーチンの実行
    それ以外:標準実行(プルアップ入力(ON:「-」信号)から指示ビット設定
  2. 共通ルーチンの実行
    指示ビットを判定し、2進LEDと作成したマトリクスを元に対応する、7セグ情報を出力
/*===========================================================================
/
/    2進・16進 Display Board
/      (auto-display(DEMO) Version)
/
/
/	PIC 16F1827
/
/   MPLAB X IDE v5.45 , XC8
/                                               https://www.pochiweb.com
/
/============================================================================
/  16F1827
/
/ 01-RA2 ← bin  #2 S/W-3(P/U)       18-RA1 ← bin  #1 S/W-2(P/U)
/ 02-RA3 ← bin  #3 S/W-4(P/U)       17-RA0 ← bin  #0 S/W-1(P/U)
/ 03-RA4 → bout #0 LED              16-RA7 → bout #3 LED
/ 04-RA5 ← auto S/W(P/U)            15-RA6 → bout #2 LED
/ 05-VSS                             14-VDD
/ 06-RB0 → 7SEG g(10)               13-RB7 → 7SEG a(07)
/ 07-RB1 → 7SEG f(09)               12-RB6 → 7SEG b(06)
/ 08-RB2 → 7SEG e(01)               11-RB5 → 7SEG c(04)
/ 09-RB3 → 7SEG d(02)               10-RB4 → bin #1 LED 
/
/============================================================================
*/
	#include <xc.h>

// CONFIG1
	#pragma config FOSC = INTOSC		// 内部発振使用
	#pragma config WDTE = OFF			// Watchdog タイマ OFF
	#pragma config PWRTE = ON			// パワーアップタイマ(立上り待機) ON
	#pragma config MCLRE = OFF			// リセット(外部入力での) OFF , DIGITAL Input
	#pragma config CP = OFF				// コードプロテクト(プログラム) OFF
	#pragma config CPD = OFF			// データ コード プロテクト OFF
	#pragma config BOREN = OFF			// ブラウンアウトリセット(低電圧検知) OFF
	#pragma config CLKOUTEN = OFF       // RA6 I/O
	#pragma config IESO = OFF			// 内部、外部クロック切り替え OFF
	#pragma config FCMEN = OFF			// クロックモニタ OFF

// CONFIG2
	#pragma config WRT = OFF			// 4kフラッシュメモリ 保護 OFF
	#pragma config PLLEN = OFF			// 4xPLL 動作 OFF
	#pragma config STVREN = OFF			// スタック?オーバーフロー リセット OFF
	#pragma config BORV = LO			// 電源電圧降下常時監視 電圧設定 LO(1.9V)
	#pragma config LVP = OFF			// 定電圧プログラミング機能 OFF

	#define _XTAL_FREQ 8000000			// 8MHz発振

	unsigned char bin_sw;				// 2進値域

    void out_disp(void);

	int main(void)
	{	
		OSCCON = 0b01110100;			// 8MHz セット

		ANSELA = 0b00000000;            // RA デジタル設定
		ANSELB = 0b00000000;            // RB デジタル設定
		
		TRISA = 0b00001111;				// ポートA,0-3 入力設定
		TRISB = 0b00000000;				// ポートB 出力設定

		PORTB = 0b00000000;				// ポートB 初期化

		bin_sw = 0X00;

 		while(1) {						// 無限LOOP

			if (RA5 == 0)
			{
				__delay_ms(1000);
				if (RA5 == 0)			// S/W on 0-15 auto-exec
				{
					for (bin_sw = 0; bin_sw <= 15; bin_sw++) {

					out_disp();
					__delay_ms(1000);

					}
					PORTB = 0b11101110;                         // 「0」
					RA7 = 0 , RA6 = 0 , RB4 = 0 , RA4 = 0;      // 「0000」
				}
			}

			bin_sw = PORTA;				// 2進スイッチ情報セット
			bin_sw = ~bin_sw;			// 反転
			bin_sw = bin_sw & 0x0f;		// マスク

			PORTB = 0b00000000;			// ポートB 初期化

			out_disp();
		}

	}


void out_disp(void){            

        	switch(bin_sw){

				case 0x00:
					PORTB = 0b11101110;                         // 「0」
                    RA7 = 0 , RA6 = 0 , RB4 = 0 , RA4 = 0;      // 「0000」
					break;

				case 0x01:
					PORTB = 0b01100000;                         // 「1」
                    RA7 = 0 , RA6 = 0 , RB4 = 0 , RA4 = 1;      // 「0001」
					break;

				case 0x02:
					PORTB = 0b11001101;                         // 「2」
                    RA7 = 0 , RA6 = 0 , RB4 = 1 , RA4 = 0;      // 「0010」
					break;

				case 0x03:
					PORTB = 0b11101001;                         // 「3」
                    RA7 = 0 , RA6 = 0 , RB4 = 1 , RA4 = 1;      // 「0011」
					break;

				case 0x04:
					PORTB = 0b01100011;                         // 「4」
                    RA7 = 0 , RA6 = 1 , RB4 = 0 , RA4 = 0;      // 「0100」
					break;

				case 0x05:
					PORTB = 0b10101011;                         // 「5」
                    RA7 = 0 , RA6 = 1 , RB4 = 0 , RA4 = 1;      // 「0101」
					break;

				case 0x06:
					PORTB = 0b10101111;                         // 「6」
                    RA7 = 0 , RA6 = 1 , RB4 = 1 , RA4 = 0;      // 「0110」
					break;

				case 0x07:
					PORTB = 0b11100000;                         // 「7」
                    RA7 = 0 , RA6 = 1 , RB4 = 1 , RA4 = 1;      // 「0111」
					break;

				case 0x08:
					PORTB = 0b11101111;                         // 「8」
                    RA7 = 1 , RA6 = 0 , RB4 = 0 , RA4 = 0;      // 「1000」
					break;

				case 0x09:
					PORTB = 0b11101011;                         // 「9」
                    RA7 = 1 , RA6 = 0 , RB4 = 0 , RA4 = 1;      // 「1001」
					break;

				case 0x0a:
					PORTB = 0b11100111;                         // 「A」
                    RA7 = 1 , RA6 = 0 , RB4 = 1 , RA4 = 0;      // 「1010」
					break;

				case 0x0b:
					PORTB = 0b00101111;                         // 「b」
                    RA7 = 1 , RA6 = 0 , RB4 = 1 , RA4 = 1;      // 「1011」
					break;

				case 0x0c:
					PORTB = 0b10001110;                         // 「C」
                    RA7 = 1 , RA6 = 1 , RB4 = 0 , RA4 = 0;      // 「1100」
					break;

				case 0x0d:
					PORTB = 0b01101101;                         // 「d」
                    RA7 = 1 , RA6 = 1 , RB4 = 0 , RA4 = 1;      // 「1101」
					break;

				case 0x0e:
					PORTB = 0b10001111;                         // 「E」
                    RA7 = 1 , RA6 = 1 , RB4 = 1 , RA4 = 0;      // 「1110」
					break;

				case 0x0f:
					PORTB = 0b10000111;                         // 「F」
                    RA7 = 1 , RA6 = 1 , RB4 = 1 , RA4 = 1;      // 「1111」
					break;
                    
				default:
				break;
			}
}  

 

(動画:倍速、繰返しにてサンプル再生しています)

 

おわりに

この”パチパチ”と上げ下げの操作、私が初めての操作するミニコンの制御方法でした。
当時のミニコンはこのようなパネルで2進、16進操作でパネル制御をしていました。

FACOM(PANAFACOM)U-200

懐かしいですね。

今でも、デジタル信号や組込み型コンピュータ制御に必要となるビットへの意識、学習用に「2進・16進 表示ボード」として、マイコンを利用し自作しました。

 

【電子工作】PICマイコン「2進-10進-16進 LCD 表示ボード」製作
【電子工作】PICマイコン「2進-10進-16進 LCD 表示ボード」製作デジタル回路の基本2進数、対応するビットへの意識の向上は重要です。 本サイトでは、関連するこれらの情報を他のカテゴリ「情報工学の基...