PIC16F628A用 7セグ2桁カウントアップ ソースコード


#include <xc.h>

//16F628Aのコンフィグレーション
//プログラムでは変更できない各種設定で、PICへの書き込み時に読み込まれる

//内部クロック4MHz使用設定
#pragma config FOSC = INTOSCIO

#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config CP = OFF


//水晶発振などの取り付けた場合の周波数設定
#define _XTAL_FREQ 10000000

void countup();
unsigned int seg1, seg2, intr_on, intr_count;

//7セグ点灯のビットパターン定義
unsigned char p[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

//割り込み発生時に随時呼び出されて実行される関数
static void interrupt intr(void)
{
T0IF = 0; // 次の割り込みの為にTMR0オーバーフローフラグのクリア

intr_count++;

if( intr_count >15 )
{
intr_on = 1;
intr_count = 0;
}

}


//これ以降がプログラム本体

void main(void) {

TRISA = 0x00; //PORTA全てのピン(RA0-RA7)は「0」。つまり出力設定。
TRISB = 0x00; //PORTB全てのピン(RB0-RB7)は「0」。つまり出力設定。
PORTA = 0x00; //PORTA全てのピンを「0」に設定
PORTB = 0x00; //PORTB全てのピンを「0」に設定


//プリスケーラは256倍。カウンターは最大の256。256×256=65536カウント。
//TMR0が65536カウントする毎に割り込みが発生。このマイコンでは
//動作している周波数が4MHzの場合は、1カウントあたり1μ秒。65536μ秒=65.536m秒周期で割り込みが発生。
//1秒=1000m秒なので、1000÷65.536=約15。15回割り込みが発生した時に約1秒経過となる。
//割り込み発生回数は変数intr_countでインクリメントして判定している。
//intr_count=15(割り込み回数が15回)なら、intr_on=1にして1秒経過した判定として
//countup関数を呼び出している。


OPTION_REG = 0b10000111; //TMR0割り込みカウントの倍率設定(プリスケーラ)
TMR0 = 0x00; //TMR0は0からスタート。最大の256カウント
INTCON = 0b10100000; //GIE:1 ,T0IE:1 タイマ0割り込み許可設定

seg1 = 0;
seg2 = 0;
intr_on = 0;
intr_count = 0;


while(1)
{

if( intr_on > 0 )
{
countup();
intr_on = 0;
}


PORTA = 0x01;
PORTB = p[seg1]; //配列p[]のビットパターンで7セグが点灯

__delay_ms(1);

PORTA = 0x02;
PORTB = p[seg2]; //配列p[]のビットパターンで7セグが点灯

__delay_ms(1);

}

}

void countup()
{
seg1++;

if( seg1 > 9)
{
seg2++;
seg1 = 0;
}


if( seg2 > 9)
{
seg2 = 0;
}


}

この記事が気に入ったらサポートをしてみませんか?