記事内に商品プロモーションを含む場合があります
デジタル回路の基本2進数、対応するビットへの意識の向上は重要です。
本サイトでは、関連するこれらの情報を他のカテゴリ「情報工学の基礎」にも紹介しています。
はじめに
本機能と同様な、7セグLEDを利用した表示ボードは下記を参照下さい。
【電子工作】PICマイコン「2進-16進 7セグ 表示ボード」製作
本記事では、2進スイッチ入力から、2進・10進・16進をLCDに表示する回路を紹介いたします。

入力スイッチ
スイッチレバーを動かすことでON/OFFを行う一般的なトグルスイッチを使用し、2進数をイメージ(指で数える代わりに)して、パチパチと上げ下げの操作で入力します。
LCD表示器
LCD:「Liquid Crystal Display」の略 つまり液晶ディスプレイです。
ここでは、小型で汎用のキャラクタLCDモジュール(8文字×2行バックライト付き)を使用しました。
8文字×2行で16文字の情報量がありますので、上段に10、16進数、下段に2進数で構成し出力させます。

I²C
Inter-Integrated Circuitの略(アイ・スクエアド・シー、アイ・アイ・シー、アイ・ツー・シー)
2本のライン(SDA (Serial Data)、SCL (Serial Clock))上に、複数のデバイス(スレーブ)をアドレス指定で可能な短距離のシリアル通信規格
本回路はこのI²C規格のLCDディスプレイを利用して、2進、10進及び16進を上記のフォーマットで出力します。
PIC
Master Synchronous Serial Port (MSSP) でI2Cが利用できるPIC、
I2C通信SCL,SDA:2ピン、2進値4ビット入力用:4ピン この構成可能な 汎用小型8ピンPIC 12F1822 を使用します。
I²C関するMSSP関連の詳細な手順やレジスタ設定の内容など、下記サイトを利用させていただきました。
参考サイト
部品表

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

デモモード
0から15までの値を自動的に表記します。
- デモモードスイッチ
入力スイッチの3ビット目がONされた状態で電源スイッチをONその状態を3秒保持
することにより、デモモードとして自動的に1周実行します。(8ピンPICで通常入出力を6ピン使用する都合上、デモモードの意識を上記のように設定しました)
プログラム
- デモモードの判定
スイッチタイミング判定(上記)
デモモード:0->15までの指示ビットを設定し共通ルーチンの実行
それ以外:標準実行(プルダウン入力(ON:「+」信号)から指示ビット設定
- 共通ルーチンの実行
指示ビットを判定し、対応する2、10、16進情報をLCD出力
#define _XTAL_FREQ 4000000
#define CONTRAST 0x28
#include <xc.h>
#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config WRT = OFF
#pragma config PLLEN = OFF
#pragma config STVREN = ON
#pragma config BORV = LO
#pragma config LVP = OFF
unsigned char bin_sw;
unsigned char bif_bin_sw;
unsigned char auto_demo;
void i2cLcdWrite(char, char, char);
void i2cTxData(char);
void LCD_dat(char);
void LCD_cmd(char);
void LCD_clr(void);
void LCD_posyx(char,char);
void LCD_int(void);
void out_lcddisp(void);
void LCD_MSG_1Line(const char *);
void LCD_MSG_2Line(const char *);
void main() {
OSCCON = 0b01101010;
PORTA = 0x00;
TRISA = 0xFF;
ANSELA = 0x00;
WPUA = 0x00;
nWPUEN = 0;
SSP1STAT = 0b10000000;
SSP1ADD = 9;
SSP1CON1 = 0b00101000;
LCD_int();
bin_sw = 0x00;
if (RA5 == 1) {
__delay_ms(1000);
if (RA5 == 1) {
LCD_MSG_1Line("Dec:Hex:");
LCD_MSG_2Line("Bin:DEMO");
__delay_ms(3000);
if (RA5 == 1) {
for (bin_sw = 0; bin_sw <= 15; bin_sw++) {
out_lcddisp();
__delay_ms(1000);
}
}
}
}
while(1) {
bin_sw = PORTA;
bin_sw = bin_sw & 0x39;
bin_sw >>= 2;
if(RA0 == 1)
bin_sw |= 0b00000001;
out_lcddisp();
}
}
void out_lcddisp(void){
LCD_int();
switch(bin_sw){
case 0b00000000:
LCD_MSG_1Line("D:00 H:0");
LCD_MSG_2Line(" B:0000 ");
break;
case 0x00000001:
LCD_MSG_1Line("D:01 H:1");
LCD_MSG_2Line(" B:0001 ");
break;
case 0b00000010:
LCD_MSG_1Line("D:02 H:2");
LCD_MSG_2Line(" B:0010 ");
break;
case 0b00000011:
LCD_MSG_1Line("D:03 H:3");
LCD_MSG_2Line(" B:0011 ");
break;
case 0b00000100:
LCD_MSG_1Line("D:04 H:4");
LCD_MSG_2Line(" B:0100 ");
break;
case 0b00000101:
LCD_MSG_1Line("D:05 H:5");
LCD_MSG_2Line(" B:0101 ");
break;
case 0b00000110:
LCD_MSG_1Line("D:06 H:6");
LCD_MSG_2Line(" B:0110 ");
break;
case 0b00000111:
LCD_MSG_1Line("D:07 H:7");
LCD_MSG_2Line(" B:0111 ");
break;
case 0b00001000:
LCD_MSG_1Line("D:08 H:8");
LCD_MSG_2Line(" B:1000 ");
break;
case 0b00001001:
LCD_MSG_1Line("D:09 H:9");
LCD_MSG_2Line(" B:1001 ");
break;
case 0b00001010:
LCD_MSG_1Line("D:10 H:A");
LCD_MSG_2Line(" B:1010 ");
break;
case 0b00001011:
LCD_MSG_1Line("D:11 H:B");
LCD_MSG_2Line(" B:1011 ");
break;
case 0b00001100:
LCD_MSG_1Line("D:12 H:C");
LCD_MSG_2Line(" B:1100 ");
break;
case 0b00001101:
LCD_MSG_1Line("D:13 H:D");
LCD_MSG_2Line(" B:1101 ");
break;
case 0b00001110:
LCD_MSG_1Line("D:14 H:E");
LCD_MSG_2Line(" B:1110 ");
break;
case 0b00001111:
LCD_MSG_1Line("D:15 H:F");
LCD_MSG_2Line(" B:1111 ");
break;
default:
LCD_MSG_1Line("D:xx H:x");
LCD_MSG_2Line(" B:xxxx ");
break;
}
}
void i2cLcdWrite(char addr, char cont, char data){
SSP1CON2bits.SEN = 1;
while(SSP1CON2bits.SEN);
i2cTxData(addr);
i2cTxData(cont);
i2cTxData(data);
SSP1CON2bits.PEN = 1;
while(SSP1CON2bits.PEN);
}
void i2cTxData(char data){
PIR1bits.SSP1IF = 0;
SSP1BUF = data;
while(!PIR1bits.SSP1IF);
}
void LCD_dat(char chr){
i2cLcdWrite(0x7C, 0x40, chr);
__delay_us(50);
}
void LCD_cmd(char cmd){
i2cLcdWrite(0x7C, 0x00, cmd);
if(cmd & 0xFC)
__delay_us(50);
else
__delay_ms(2);
}
void LCD_clr(void){
LCD_cmd(0x01);
}
void LCD_posyx(char ypos, char xpos){
unsigned char pcode;
switch(ypos & 0x03){
case 0: pcode=0x80;break;
case 1: pcode=0xC0;break;
}
LCD_cmd(pcode += xpos);
}
void LCD_int(void){
__delay_ms(100);
LCD_cmd(0x38);
LCD_cmd(0x39);
LCD_cmd(0x14);
LCD_cmd(0x70 + (CONTRAST & 0x0F));
LCD_cmd(0x5C + (CONTRAST >> 4));
LCD_cmd(0x6B);
__delay_ms(200);
LCD_cmd(0x38);
LCD_cmd(0x0C);
LCD_cmd(0x01);
}
void LCD_MSG_1Line(const char *str){
while(*str)
LCD_dat(*str++);
}
void LCD_MSG_2Line(const char *str){
LCD_posyx(1,0);
while(*str)
LCD_dat(*str++);
}
(動画:倍速、繰返しにてサンプル再生しています)
まとめ
- 16文字の情報が表示可能なLCDを用いることにより、2,10,16進の変換情報が表示可能で動作
- 3.3Vの対応可能なPIC,LCDに伴い、本ボードの電源はリチウム電池(3.0V)を使用しました。
スイッチの「パチパチ♪」操作
遊び感覚で、2進数・ビット意識の向上にどうぞ。
ABOUT ME