//PICの定義ファイルをインクルード
#include <pic16f84a.h>
#include <htc.h>
#include"delay.h"
int knt,knt_timer;
//------------------------------------------ポート設定ルーチンここから-------------------------------------

void init(void)
{

/* INTCON
GIE:グローバル割り込みイネーブルビット
1 = 全てのマスクされていない割り込み発生を許可する。
0 = 全ての割り込み発生を禁止する。
EEIE:EEPROM書き込み完了割り込みイネーブルビット
1 = EEPROMへの書き込み完了割り込みの発生を許可する。
0 = EEPROMへの書き込み完了割り込みの発生を禁止する。
TOIE:TMR0オーバーフロー割り込みイネーブルビット
1 = TMR0割り込みの発生を許可する。
0 = TMR0割り込みの発生を禁止する。
INTE:RB0/INT割り込みイネーブルビット
1 = RB0/INT割り込みの発生を許可する。
0 = RB0/INT割り込みの発生を禁止する。
RBIE:RBポート変化割り込みイネーブルビット
1 = RBポート変化割り込みの発生を許可する。
0 = RBポート変化割り込みの発生を禁止する。
TOIF:TMR0オーバーフロー割り込みフラグビット
1 = TMR0でオーバーフローが発生した。
0 = TMR0でオーバーフローが発生していない。
INTF:RB0/INT割り込みフラグビット
1 = RB0/INT割り込みが発生した。
0 = RB0/INT割り込みが発生していない。
RBIF:RBポート変化割り込みフラグビット
1 = RBポート変化割り込みが発生した。
0 = RBポート変化割り込みが発生していない。
7 6 5 4 3 2 1 0
GIE EEIE TOIE INTE RBIE TOIF INTF RBIF
*/
INTCON = 0b10110000;

/* OPTION_REG
RBPU:PORTBプルアップイネーブルビット
1 = PORTBを内部プルアップしない。(出力設定時に使用)
0 = PORTBを内部プルアップする。(入力設定時に使用)
INTEDG:割り込みエッジ選択ビット
1 = RB0/INT端子の立ち上がりエッジで割り込み発生
0 = RBO/INT端子の立下りエッジで割り込み発生
T0CS:TMR0(タイマー0チャンネル)クロックソース選択ビット
1 = RA4/T0CK1端子の入力をタイマークロックとする。
0 = 内部命令サイクル(φ/4)をタイマークロックとする。
T0SE:TMR0(タイマー0チャンネル)ソースエッジ選択ビット
1 = RA4/T0CK1端子の立下りタイミングでインクリメント(カウントアップ)
0 = RA4/T0CK1端子の立上がりタイミングでインクリメント
PSA:プリスケーラ割り当てビット
1 = PS2~0で指定するプリスケーラをWDT(ウォッチドックタイマー)に割り当てる。
0 = PS2~0で指定するプリスケーラをTMR0(タイマー0チャンネル)に割り当てる。
7 6 5 4 3 2 1 0
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
*/
OPTION_REG = 0b01010111;

TRISA = 0b11011100; //AポートのRA0のみ出力、他を入力に設定
// RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0
// I I 0 I I I 緑 黄

TRISB = 0b11111111; //
// RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
// 0 O I I I I I I
// パルス 8 4 2 1 割り込み
PORTA = 0b00000000; //最初に出力なし設定
knt=knt_timer=0;

}
//------------------------------------------ポート設定ルーチンここまで-------------------------------------

//------------------------------------------ディレイルーチンここから-------------------------------------
void DelayMs(unsigned int cnt)/*unsigned char cnt*/
{
#if XTAL_FREQ <= 2MHZ
do {
DelayUs(996);//996
} while(--cnt);
#endif

#if XTAL_FREQ > 2MHZ
unsigned int i;//unsigned char
do {
i = 4;
do {
DelayUs(94);//250クロックの1/4
} while(--i);
} while(--cnt);
#endif
}
//------------------------------------------ディレイルーチンここまで-------------------------------------


//------------------------------------------割り込み-----------------------------------------------
static void interrupt warikomi(void)
{

GIE = 0; //全体割り込み禁止
INTE = 0; //INT割り込み禁止
T0IE = 0; //タイマー0割り込み禁止

if(INTF==1){ //(タクトスイッチ)INT割り込みがかかっているのか?
knt++; //カウントアップ
INTF = 0; //INT割り込みフラグクリア
}

if(T0IF==1){ //タイマー0割り込みかかっているのか?

if(knt_timer < 100){ //0.01秒ごとに割り込みがかかるので100倍し1秒を出すため100以下の場合に下記処理を行う
knt_timer++; //カウントアップ
}

if(knt_timer >= 100){ //1秒が出たら下記処理を行う

if(knt >= 2){ //タクトスイッチを1秒間に2回以上押していたら下記処理を行う
RA0 = 1; //黄色灯す
DelayMs(100); //1秒待つ
RA0 = 0; //黄色消す この間処理
DelayMs(100); //1秒待つ
}
knt=0; //タクトスイッチカウントをクリア
knt_timer=0; //1秒出しカウントをクリア
}
TMR0 = 255-40; //タイマー0カウント値を設定クロック4MHz、1/256分周 0.01秒 10ms
T0IF = 0; //タイマー0フラグをクリア
}

INTE = 1; //INT割り込み許可
T0IE = 1; //タイマー0割り込み許可
GIE = 1; //全体割り込み許可

}

//---------------------------------------------メインルーチンここから--------------------------------------
void main(void)
{
int a;
init();
TMR0 = 255-40; //タイマー0カウント値を設定クロック4MHz、1/256分周 0.01秒 10ms
INTE = 1; //INT割り込み許可
T0IE = 1; //タイマー0割り込み許可
GIE = 1; //全体割り込み許可
while( 1 ){

RA1 = 1; //緑色灯す
DelayMs(1000); //1秒待つ
RA1 = 0; //緑色消す
DelayMs(1000); //1秒待つ

}
}
//---------------------------------------------メインルーチンここから--------------------------------------