16F628A 7セグ2桁 タイマー1版 ソースコード
#include <xc.h>
//16F628Aのコンフィグレーション
//プログラムでは変更できない各種設定で、PICへの書き込み時に読み込まれる
//水晶発振32768Hzを使用するため、LPモード設定
#pragma config FOSC = LP
#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 32768
void countup();
unsigned int seg1, seg2, intr_on;
//7セグ点灯のビットパターン定義
unsigned char p[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//割り込み発生時に随時呼び出されて実行される関数
static void interrupt intr(void)
{
PIR1bits.CCP1IF = 0; //コンペアマッチフラグのクリア
PIE1bits.CCP1IE = 1; //コンペアマッチ割り込み許可
intr_on = 1;
}
//これ以降がプログラム本体
void main(void) {
TRISA = 0x00; //PORTA全てのピン(RA0?RA7)は「0」。つまり出力設定。
TRISB = 0x00; //PORTB全てのピン(RB0?RB7)は「0」。つまり出力設定。
PORTA = 0x00; //PORTA全てのピンを「0」に設定
PORTB = 0x00; //PORTB全てのピンを「0」に設定
T1CON = 0b00001110; //プリスケーラは1倍(=倍率なし)、タイマ1停止
INTCON = 0b11000000; //GIE:1 ,PEIE:1 タイマ1動作の為の設定
PIE1 = 0b00000100; //コンペアマッチ割り込み許可、オーバーフロー割り込み禁止
//割り込み発生毎のタイマ1カウンタの値再設定は、正確な割り込み周期に影響するため
//コンペア機能を使うことで、タイマ1カウンタを弄る必要がなくなり、正確な割り込み周期を実現できる
CCP1CON = 0b00001011; //ビット0?3→1011・・・コンペアスペシャルイベント 1010→コンペア一致で割り込み
//タイマ1ウンタは16ビットカウンタのため、8ビットずつに分けて値をセット
TMR1L = 0x00; //カウンタの初期値下位8ビットをセット
TMR1H = 0x00; //カウンタの初期値上位8ビットをセット
//タイマ1カウンタが次の条件値と一致すれば、割り込みが発生。
//CCP1CONでコンペアスペシャルイベントに設定しているので、割り込み発生後にタイマ1カウンタがリセット。
CCPR1L = 0xFF; //割り込み発生条件値。下位8ビットをセット
CCPR1H = 0x7F; //割り込み発生条件値。上位8ビットをセット
seg1 = 0;
seg2 = 0;
intr_on = 0;
T1CONbits.TMR1ON = 1; //タイマ1動作開始
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;
}
}