fc2ブログ

4桁7セグで遊ぶ(1)

 前回にて、PIC16F873A(28pin)用のPIC Writerを準備できましたので、今回は「4桁7セグ」の準備です。
 1桁7セグは以前使ったことがありましたが、4桁は今回が初めてです。使用した4桁7セグは、OptoSupply製のOSL40391-LBです。16pinのデバイスで配線図は以下の通りです。OSL40391-LX_170211.png 配線図から判断すると、各桁について、共通の7セグ(A~G)、デシマルポイント(DP)と、その桁自身のカソードコモンがある構成です。カソードコモンを切り替えることで4桁を制御するようです。カソードコモンは各桁の切り替え以外に、ドット(D1~D3)を制御するためのものがあります。

 配線は理解できましたが、いかに4桁を制御するかをネットで調べていた所、「ダイナミック点灯」を用いれば良いことが分かりました。内容解説サイトによると、短時間に一つの桁を光らせ、すぐ次の桁を光らせることを高速(数10msec程度)で繰り返すことで、ある瞬間は一つの桁だけが点灯しているが、人間の目には残像現象があるため、あたかも各桁が連続して点灯しているように見えるとのこと。なるほど、なるほどです。
 4桁7セグの基板への配線は、PICの他に、Raspberry PiやArduinoでも使えるように、入力信号部は14pinのピンヘッダを利用しました。基板配線図は以下の通り。7seg-4_circuit_170211.png 完成品はこんな感じです。7seg-4_170211.png 配線基板も完成しましたので、簡単なPICのプログラムを組んで動作確認です。以下のプログラムをMPLAB X IDEで作成し、前回作製した、簡易PIC WriterでPIC16F873Aに書き込みました。 L.92~L.123のSetDigit関数に「ダイナミック点灯」を仕込んでいます。ここでは1msecで切り替えています。
//----------------------------------------------
// 7seg control program for PIC16F873A
//----------------------------------------------

// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#define _XTAL_FREQ 20000000 /*delay関数に必要*/

//segment character
const unsigned char cSeg[11] = {
// .GFEDCBA // pattern
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00100111, // 7
0b01111111, // 8
0b01101111, // 9
0b10000000, // .
};

//dot character
const unsigned char cDot[8]={
0b00000000, //OFF
0b00000001, //D1
0b00000010, //D2
0b00000011, //D1+D2
0b00000100, //D3
0b00000101, //D1+D3
0b00000110, //D2+D3
0b00000111, //D1+D2+D3
};

//initialize PIC
void InitPic(void)
{
//PortA
// bit0:RA0 2 Out(0) DEG1 COM
// bit1:RA1 3 Out(0) DEG2 COM
// bit2:RA2 4 Out(0) DEG3 COM
// bit3:RA3 5 Out(0) DEG4 COM
// bit4:RA4 6 Out(0)
// bit5:RA5 7 Out(0) DEG5 COM
// bit6:RA6 - Out(0)
// bit7:RA7 - Out(0)
TRISA = 0b00000000;

//PortB
// bit0:RB0 21 Out(0) SEG A
// bit1:RB1 22 Out(0) SEG B
// bit2:RB2 23 Out(0) SEG C
// bit3:RB3 24 Out(0) SEG D
// bit4:RB4 25 Out(0) SEG E
// bit5:RB5 26 Out(0) SEG F
// bit6:RB6 27 Out(0) SEG G
// bit7:RB7 28 Out(0) SEG DP
TRISB = 0b00000000;

//PortC
// bit0:RC0 11 Out(0)
// bit1:RC1 12 Out(0)
// bit2:RC2 13 Out(0)
// bit3:RC3 14 Out(0)
// bit4:RC4 15 Out(0)
// bit5:RC5 16 Out(0)
// bit6:RC6 17 Out(0)
// bit7:RC7 18 Out(0)
TRISC = 0b00000000;

//IO Initialize
PORTA = 0b00000000;
PORTB = 0b00000000;
PORTC = 0b00000000;
}

void SetDigit(int dg1,int dg2,int dg3,int dg4,int dot){

RA0=1;
PORTB=cSeg[dg1];
__delay_ms(1);
RA0=0;
PORTB = 0b00000000;

RA1=1;
PORTB=cSeg[dg2];
__delay_ms(1);
RA1=0;
PORTB = 0b00000000;

RA2=1;
PORTB=cSeg[dg3];
__delay_ms(1);
RA2=0;
PORTB = 0b00000000;

RA3=1;
PORTB=cSeg[dg4];
__delay_ms(1);
RA3=0;
PORTB = 0b00000000;

RA5=1;
PORTB=cDot[dot];
__delay_ms(1);
RA5=0;
PORTB = 0b00000000;
}

void main(void){

int count = 0;
int a = 0;
int b = 1;
int c = 2;
int d = 3;
int e = 0;

InitPic();

while(1){
SetDigit(a,b,c,d,e);
count++;
if(count>150){
count = 0;
a++;
b++;
c++;
d++;
e++;
if(a>10){a = 0;}
if(b>10){b = 0;}
if(c>10){c = 0;}
if(d>10){d = 0;}
if(e>7){e = 0;}
}
}
}
 実際の動きはこんな感じです。[広告] VPS

 問題なく動作しましたので、次のステップに進もうと思います。
スポンサーサイト



コメント

非公開コメント

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: