目次
この記事は下記Youtube動画の補足になります.動画の方もぜひご覧ください.
難易度2 7セグメントLEDドライバ
回路図

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

1秒毎にカウントアップされます.
タイマーIC555のOUTPUT端子を74HC193のCount Downに入れると,カウントダウンする回路になります.
難易度3 PICマイコンにパラレル接続
回路図

数字を光らせるときは真理値表に従って光らせます.
真理値表(正論理)
表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を使います.

真理値表(負論理)
表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 シフトレジスタ
回路図

真理値表
表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);
}
プログラムダウンロード出来ません。
ファイルもファイルにアクセスできませんでしたとなります。
出来るようにお願いします。
74HC595のみ両方可能です。
ご連絡が遅れて大変申し訳ありません!
バグのご報告,ありがとうございます.
ファイルをダウンロードできるように修正しましたので,お手数ですが再度お試しいただけますでしょうか.
よろしくお願いします.