/********************************************************* MPLAB-C18テストプログラム No7 割込みのテストNo1  優先順位を使わない単純割込みのテスト   タイマ0を割込みで使用する 機能   アイドルループ:0.5秒間隔でLED1を点滅   タイマ0   :0.1秒間隔でLED2を点滅 ********************************************************/  #include // PIC18C452のヘッダ・ファイル #include // タイマ関数のヘッダ・ファイル #include #include //******** コンフィギュレーションの設定 #pragma romdata config=0x300000 unsigned char rom _CONFIG0 = _CP_OFF_0; unsigned char rom _CONFIG1 = _OSCS_OFF_1 & _HS_OSC_1; unsigned char rom _CONFIG2 = _BOR_ON_2 & _BORV_45_2 & _PWRT_ON_2; unsigned char rom _CONFIG3 = _WDT_OFF_3; unsigned char rom _CONFIG5 = _CCP2MX_OFF_5; unsigned char rom _CONFIG6 = _STVR_ON_6; //******************************************************* //***** 変数、定数の定義 unsigned char cnt=4; // cntはLED更新周期用カウンタ //****** メイン関数 void main(void) // メイン関数 { TRISC=0; // ポートCをすべて出力ピンにする OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_256); // タイマ0の設定, 8ビットモード, 割込み使う //内部クロック、1:256プリスケーラ //**** 割込みの許可 INTCONbits.GIE=1; // 割り込みをイネーブルにする //****** メインループ(アイドルループ) while(1) { PORTCbits.RC0=1; //0.5秒間隔でLED1を点滅 Delay10KTCYx(100); PORTCbits.RC0=0; Delay10KTCYx(100); } } //****************************************************** //****** 割込み宣言(優先順位を使わない) #pragma interrupt isr save = PROD //***** 割込みベクタへジャンプ命令セット #pragma code isrcode = 0x0000008 void isr_direct(void) { _asm goto isr _endasm } //***** 割込み処理関数 #pragma code void isr(void) // 割り込み関数 { if(INTCONbits.T0IF){ // タイマ0割り込み? INTCONbits.T0IF=0; // タイマ0割り込みフラグを0にする if(--cnt==0){ // cntを-1して結果が0? cnt=4; // cntにLEDの更新周期を書き込む if(PORTCbits.RC2) PORTCbits.RC2=0; // LED3を0.1秒間隔で点滅 else PORTCbits.RC2=1; } } }