7セグメントLEDを光らせる方法5選!!完全攻略ガイド!

この記事は下記Youtube動画の補足になります.動画の方もぜひご覧ください.

難易度2 7セグメントLEDドライバ

回路図

図1 : 4つのスイッチで光る数字を決定する回路

スイッチは二進数に従って入力します.

図2 : タイマーIC555と組み合わせて1秒毎にカウントアップする回路

1秒毎にカウントアップされます.

タイマーIC555のOUTPUT端子を74HC193のCount Downに入れると,カウントダウンする回路になります.

難易度3 PICマイコンにパラレル接続

回路図

図3 : PIC(16F1827)にパラレル接続した回路

数字を光らせるときは真理値表に従って光らせます.

真理値表(正論理)

表1 : 真理値表(正論理)

プログラム

while(1)の中にある,Display7SEG();の()の中に表示したい数字を入れます.例:Display7SEG(0); →7セグメントLEDに0が表示

__delay_ms();は待ち時間を設定するもので,Display7SEG();の後に書くとその時間だけ指定した数字が7セグメントLEDに表示されます.

例:Display7SEG(0); →7セグメントLEDに0が表示

__delay_ms(1000); →1秒間待つ(1秒間7セグに0を表示)

↓コードを書いておきますが,CファイルとHEXファイルも載せておくのでダウンロードしてお使いください.

リスト1 : 0と5を1秒ずつ表示させるプログラム


// PIC16F1827 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled)
#pragma config STVREN = OFF     // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)

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

#include <xc.h>

#define _XTAL_FREQ 8000000 //クロック動作周波数を8MHzとして__delay_msを使用する

Display7SEG(unsigned short int num);

int main(){
    OSCCON = 0b01110100;
    TRISA = 0b00000000; //ポートAを出力に設定
    TRISB = 0b00000000; //ポートBを出力に設定
    PORTA = 0b00000000; //ポートAから0を出力
    PORTB = 0b00000000; //ポートBから0を出力
    
    //0と5を1秒間ずつ光らせるプログラム
    while(1){
        Display7SEG(0);//←()の中に光らせたい数字を入力する
        __delay_ms(1000);//←光らせる時間(1000で1秒)
        
        Display7SEG(5);
        __delay_ms(1000);
    }
}


//ここから下は真理値表に沿って出力を決定する部分(関数)
Display7SEG(unsigned short int num){
    switch(num){
        case 0:
            PORTB = 0b10110111;//0
            break;
        
        case 1:
            PORTB = 0b00010100;//1
            break;
            
        case 2:
            PORTB = 0b01110011;//2
            break;
            
        case 3:
            PORTB = 0b01110110;//3
            break;
            
        case 4:
            PORTB = 0b11010100;//4
            break;
            
        case 5:
            PORTB = 0b11100110;//5
            break;
            
        case 6:
            PORTB = 0b11100111;//6
            break;
            
        case 7:
            PORTB = 0b00110100;//7
            break;
            
        case 8:
            PORTB = 0b11110111;//8
            break;
            
        case 9:
            PORTB = 0b11110110;//9
            break;
    }
}

難易度4 ダイナミック・ドライブ

回路図

ここでは勉強のため,少し難しいですがアノードコモンの7セグメントLEDで考えてみます.7セグメントLEDの型番はOSL-40391-IGです.アノードコモンの7セグメントLEDを使うので,トランジスタPNPのは2SA1015GRを使います.

図4 : ダイナミックドライブをするための回路図

真理値表(負論理)

表2 : 真理値表(負論理)

プログラム

Display7SEG_4DIG();の()に4桁の数字を入力すると,その4桁を7セグメントLEDに表示します.

例:Display7SEG_4DIG(4321); →7セグメントLEDに4321を表示.

リスト2 : 4321を表示するプログラム


// PIC16F1827 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled)
#pragma config STVREN = OFF     // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)

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

#include <xc.h>

#define _XTAL_FREQ 8000000 //クロック動作周波数を8MHzとして__delay_msを使用する

Display7SEG(unsigned short int num);
Display7SEG_4DIG(unsigned short int number);

int main() {
    OSCCON = 0b01110100;
    TRISA = 0b00000000; //ポートAを出力に設定
    TRISB = 0b00000000; //ポートBを出力に設定
    PORTA = 0b00000000; //ポートAから0を出力
    PORTB = 0b00000000; //ポートBから0を出力

    while (1) {
       Display7SEG_4DIG(4321);
    }
}

Display7SEG_4DIG(unsigned short int number) {
    unsigned short int DIG[4];
    unsigned short int temp;

    temp = number;
    DIG[3] = temp / 1000;

    temp = number;
    DIG[2] = (temp - 1000 * DIG[3]) / 100;

    temp = number;
    DIG[1] = (temp - 1000 * DIG[3] - 100 * DIG[2]) / 10;

    temp = number;
    DIG[0] = temp - 1000 * DIG[3] - 100 * DIG[2] - 10 * DIG[1];

    PORTA = 0b11111111; //すべてのLEDを消灯
    Display7SEG(DIG[0]);
    PORTA = 0b11111110; //1桁目を表示
    __delay_ms(1);

    PORTA = 0b11111111; //すべてのLEDを消灯
    Display7SEG(DIG[1]);
    PORTA = 0b11111101; //2桁目を表示
    __delay_ms(1);

    PORTA = 0b11111111; //すべてのLEDを消灯
    Display7SEG(DIG[2]);
    PORTA = 0b11111011; //3桁目を表示
    __delay_ms(1);

    PORTA = 0b11111111; //すべてのLEDを消灯
    Display7SEG(DIG[3]);
    PORTA = 0b11110111; //4桁目を表示
    __delay_ms(1);
}

Display7SEG(unsigned short int num) {
    switch (num) {
        case 0:
            //PORTB = 0b10110111;//0 正論理
            PORTB = 0b01001000; //0 負論理
            break;

        case 1:
            //PORTB = 0b00010100;//1
            PORTB = 0b11101011; //1
            break;

        case 2:
            //PORTB = 0b01110011;//2
            PORTB = 0b10001100; //2
            break;

        case 3:
            //PORTB = 0b01110110;//3
            PORTB = 0b10001001; //3
            break;

        case 4:
            //PORTB = 0b11010100;//4
            PORTB = 0b00101011; //4
            break;

        case 5:
            //PORTB = 0b11100110;//5
            PORTB = 0b00011001; //5
            break;

        case 6:
            //PORTB = 0b11100111;//6
            PORTB = 0b00011000; //6
            break;

        case 7:
            //PORTB = 0b00110100;//7
            PORTB = 0b11001011; //7
            break;

        case 8:
            //PORTB = 0b11110111;//8
            PORTB = 0b00001000; //8
            break;

        case 9:
            //PORTB = 0b11110110;//9
            PORTB = 0b00001001; //9
            break;
    }
}

難易度5 シフトレジスタ

回路図

図5:ビットシフトレジスタを使って,数字を流れるように表示する回路

真理値表

表3 : 真理値表(正論理,D.P〜Aの順番)

プログラム

リスト3:シフトレジスタで流れるように表示するプログラム


// PIC16F1827 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled)
#pragma config STVREN = OFF     // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)

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

#include <xc.h>
#include <math.h>

#define _XTAL_FREQ 8000000 //クロック動作周波数を8MHzとして__delay_msを使用する
#define SER RB0 //RB0をSERに置き換える
#define RCLK RB1//RB1をRCLKに置き換える
#define SRCLK RB2//RB2をSRCLKに置き換える

Display7SEG_74HC595(unsigned short int num);

int main() {
    OSCCON = 0b01110100;
    TRISA = 0b00000000; //ポートAを出力に設定
    TRISB = 0b00000000; //ポートBを出力に設定
    PORTA = 0b00000000; //ポートAから0を出力
    PORTB = 0b00000000; //ポートBから0を出力

    while (1) {
        Display7SEG_74HC595(0);
        Display7SEG_74HC595(1);
        Display7SEG_74HC595(2);
        Display7SEG_74HC595(3);
        Display7SEG_74HC595(4);
        Display7SEG_74HC595(5);
        Display7SEG_74HC595(6);
        Display7SEG_74HC595(7);
        Display7SEG_74HC595(8);
        Display7SEG_74HC595(9);
    }
}

Display7SEG_74HC595(unsigned short int num){
    unsigned short int output[10];
    output[0] = 0b00111111;
    output[1] = 0b00000110;
    output[2] = 0b01011011;
    output[3] = 0b01001111;
    output[4] = 0b01100110;
    output[5] = 0b01101101;
    output[6] = 0b01111101;
    output[7] = 0b00000111;
    output[8] = 0b01111111;
    output[9] = 0b01101111;
    
    unsigned short int num_binary;
    num_binary = output[num];
    
    unsigned short int bit[8];
    unsigned  int compared = 0b00000001;
    for(unsigned short int i=0; i<8; i++){
        bit[i] = (num_binary & compared) >> i;
        compared <<= 1;
    }
    
    for(short int t=7; t>=0; t--){
        SER = bit[t];
        SRCLK = 1;
        SRCLK = 0;
        RCLK = 1;
        RCLK = 0;
        __delay_ms(200);
    }
    
    __delay_ms(2000);
}

2 COMMENTS

ぴけ

プログラムダウンロード出来ません。
ファイルもファイルにアクセスできませんでしたとなります。
出来るようにお願いします。
74HC595のみ両方可能です。

返信する
Kuroneko

ご連絡が遅れて大変申し訳ありません!
バグのご報告,ありがとうございます.
ファイルをダウンロードできるように修正しましたので,お手数ですが再度お試しいただけますでしょうか.
よろしくお願いします.

返信する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA