【電子工作】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、入力信号をプルダウン回路で構成しています。
プログラム
- プルダウンで入力されたスイッチ信号を判定
ON:「+」信号 - 信号情報を判定をし、作成したマトリクスを元に対応する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に接続しています。
プログラム
- 自動表記(RA5)の判定
長押し:デモモードとして、0->15までの指示ビットを設定し共通ルーチンの実行
それ以外:標準実行(プルアップ入力(ON:「-」信号)から指示ビット設定 - 共通ルーチンの実行
指示ビットを判定し、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進操作でパネル制御をしていました。
懐かしいですね。
今でも、デジタル信号や組込み型コンピュータ制御に必要となるビットへの意識、学習用に「2進・16進 表示ボード」として、マイコンを利用し自作しました。