MPLABX XC8の勉強は、少しずつ進んでいます。
今回は、PIC16F84Aで7セグメントLEDの表示テストをします。
プログラムは、こちらのサイトを参考にさせていただきました。
回路図です。
各セグメントとPICの接続は
RB0 -- a
RB1 -- b
RB2 -- c
RB3 -- d
RB4 -- e
RB5 -- f
RB6 -- g
として、680Ωの電流制限抵抗を介して接続します。
ブレッドボードです。7セグメントLEDは、手持ちの秋月電子で販売している超高輝度カソードコモン7セグメントLED C-533SRの#1だけを使ってテストしました。超高輝度ですので、電流制限抵抗は、680Ωとしました。
プログラムです。
0から9の文字に対応するセグメントデータを配列に保存しておき、数字に対応するデータをPORTBにセットすることにより、数字を表示します。
1秒ごとに0から9までの数字を繰り返し表示するプログラムです。
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (Power-up Timer is enabled)
#pragma config CP = OFF // Code Protection bit (Code protection disabled)
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (Power-up Timer is enabled)
#pragma config CP = OFF // Code Protection bit (Code protection disabled)
#define _XTAL_FREQ 10000000
void main()
{
unsigned char seg_data[10] = {
// gfedcba // 7セグメントLED用点灯パターン
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
TRISA = 0x00; // PORTAは全て出力
TRISB = 0x00; // PORTBは全て出力
PORTA = 0x00;
PORTB = 0x00;
while(1){ // 無限ループ
for(unsigned char i=0;i<=9;i++){
PORTB = seg_data[i]; //セグメントデータをPORTBにセット
__delay_ms(1000); // 1 s待つ
}
}
}
{
unsigned char seg_data[10] = {
// gfedcba // 7セグメントLED用点灯パターン
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
TRISA = 0x00; // PORTAは全て出力
TRISB = 0x00; // PORTBは全て出力
PORTA = 0x00;
PORTB = 0x00;
while(1){ // 無限ループ
for(unsigned char i=0;i<=9;i++){
PORTB = seg_data[i]; //セグメントデータをPORTBにセット
__delay_ms(1000); // 1 s待つ
}
}
}
今回のトラブルシューティング
プログラムをPICに書き込んで、PICをブレッドボードにセットして、電源スイッチ ON。
あれ、0 を表示したまま変わらない。
プログラムを見直してみましたが、問題なし。
電源ONの前に一度ブレッドボードの回路をチェックしましたが、もう一度見直し。
分かりました。クロック用のレゾネータへの配線がずれていました。
それを直すと、0,1,2,3と数字が1秒ごとに変わりました。
テストOKでした。