/**************************************************/ /* 割込みによるタイマー例 RIKIYA 2000/03/25 */ /* tmtest22.c */ /* H8-3048/F */ /* ポート5のLEDを割込み処理で1秒おきに点滅 */ /* させ、同時にポート2のディップスイッチの状態 */ /* を、ポート1の8bitのLEDに表示させる */ /* ディップスイッチを切り替えてから、8bitのLED */ /* に状態が表示されるタイミングに注目 */ /**************************************************/ #include <3048f.h> #pragma interrupt(intimia1) extern int cnt; /*グローバル変数 startup.marでもexport宣言*/ extern int mode; /*グローバル変数 startup.marでもexport宣言*/ /* メイン関数************************************************/ void main(void){ P1.DDR = 0xff; /* port1出力に設定 表示LED */ P2.DDR = 0x00; /* port2入力に設定 DIPSW */ P2.PCR.BYTE = 0xff; /* port2プルアップon */ P5.DDR = 0xff; /* port5出力に設定 表示LED */ P5.PCR.BYTE = 0x00; /* port5プルアップoff */ ITU1.TCR.BYTE = 0x23; /* GRAコンペアマッチ clock 1/8 */ ITU1.GRA = 0x4e20; /* GRAを4e20に設定 約10ms*/ ITU1.TIER.BYTE = 0xF9; /* ITU1のGRAによるコンペアマッチ割込みを許可*/ ITU.TSTR.BIT.STR1 = 0; /* カウント停止状態 */ ITU.TSTR.BIT.STR1 = 1; /* ITU1 TCNTカウント開始 */ cnt = 0; /* 割込み発生の回数を0にセット */ mode =1; /* 2bitLEDの表示のさせ方を1にセット */ while(1){ P1.DR.BYTE = P2.DR.BYTE; /* DIPSWを8bitLEDに表示 */ } } /*割り込み処理*********************************************/ void intimia1(void){ cnt++; /* cntの数を1つ増やす */ if(cnt == 100){ /*100(1秒)なら2bitLEDの表示を変化させる*/ cnt = 0;/*カウンタを0に戻す*/ switch(mode){ case 1:mode = 0x02; /*表示が01なら10にする*/ break; case 2:mode = 0x01; /*表示が10なら01にする*/ break; default:mode = 0x01;/*それ以外なら01にする*/ } P5.DR.BYTE = mode; /*2bitLEDを変化させる*/ } ITU1.TSR.BIT.IMFA = 0; /* 割込み検知フラグを戻して再開 */ }