タイマー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, seg3, seg4, intr_on;

//7セグ点灯のビットパターン定義

unsigned char a[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x5F,0x7C,0x58,0x5E,0x7B,0x71};

//割り込み発生時に随時呼び出されて実行される関数

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 = 0xef; //PORTA全てのピンを「0」に設定

PORTB = 0x00; //PORTB全てのピンを「0」に設定

T1CON = 0b00111111; //プリスケーラは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 = 0xff; //割り込み発生条件値。上位8ビットをセット

seg1 = 9;

seg2 = 5;

seg3 = 3;

seg4 = 2;

intr_on = 0;

T1CONbits.TMR1ON = 1; //タイマ1動作開始

while(1)

{

if( intr_on > 0 )

{

countup();

intr_on = 0;

}

PORTA = 0b11101110; //RA0

PORTB = a[seg1];

__delay_ms(1);

PORTB = 0x00;

PORTA = 0b11101101; //RA1

PORTB = a[seg2];

__delay_ms(1);

PORTB = 0x00;

PORTA = 0b11101011; //RA2

PORTB = a[seg3];

__delay_ms(1);

PORTB = 0x00;

PORTA = 0b11100111; //RA3

PORTB = a[seg4];

__delay_ms(1);

PORTB = 0x00;

}

}

void countup()

{

seg1++;

if( seg1 > 9)

{

seg2++;

seg1 = 0;

}

if( seg2 > 5)

{

seg3++;

seg2 = 0;

}

if( seg3 > 9)

{

seg4++;

seg3 = 0;

}

if( seg4 > 1 && seg3 > 3)

{

seg3 = 0;

seg4 = 0;

}

}

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