#include #include #include "h8_sample.h" #include "h8_lcd.h" static unsigned char buffer[16] = ""; static int counter = 0; static unsigned char hour = 0; static unsigned char minute = 0; static unsigned char sec = 0; void Set_Vector( int num, void *vect ) { void **vvt; vvt = (void **)0x00FFFD20; void *jv = 0x5A000000 + vect; vvt[num] = jv; } // // 8ビットタイマー初期化(100ms) // void Init_Timer8(void) { T8TCR0.BIT.CKS = 0; // クロック一時停止 T8TCR0.BIT.CMIEB = 0; // CMFBによる割り込み禁止 T8TCR0.BIT.CMIEA = 0; // CMFAによる割り込み禁止 T8TCR0.BIT.OVIE = 0; // OVFによる割り込み禁止 T8TCR0.BIT.CCLR = 1; // コンペアマッチAでクリア T8TCR1.BIT.CKS = 4; // 8TCNT0コンペアマッチAでカウント T8TCR1.BIT.CMIEB = 0; // CMFBによる割り込み禁止 T8TCR1.BIT.CMIEA = 1; // CMFAによる割り込み許可 T8TCR1.BIT.OVIE = 0; // OVFによる割り込み禁止 T8TCR1.BIT.CCLR = 1; // コンペアマッチAでクリア T8TCSR0.BYTE = 0; // クリア T8TCSR1.BYTE = 0; // クリア T8TCNT = 0; // カウンタクリア T8TCORA0 = 249; // 20,000,000 / 64 / 250 = 1250 T8TCORA1 = 124; // 1250 / 125 = 10Hz (100ms) T8TCR0.BIT.CKS = 2; // 内部クロック20MHz φ/64 } // // 8ビットタイマーチャンネル0 // コンペアマッチA1/B1割り込み // #pragma interrupt void int_cmiab1(void) { T8TCSR1.BIT.CMFA = 0; // コンペアマッチフラグAクリア counter++; if( counter > 9 ) { counter = 0; if( ++sec > 59 ) { sec = 0; if( ++minute > 59 ) { minute = 0; if( ++hour > 23 ) { hour = 0; } } } } } int main() { Set_Vector( 38, int_cmiab1 ); ABWCR.BYTE = 0xFF; // バス8ビットモードに設定 wait20us(); P4DDR.BYTE = 0xFF; // PORT4 = OUTPUT wait20us(); P5DDR.BYTE = 0x00; // PORT5下位4ビット入力 wait20us(); P5PCR.BYTE = 0x0F; // プルアップ LCD_Init(); hour = 0; minute = 0; sec = 0; counter = 0; Init_Timer8(); _sti(); // 割り込み許可 while(1) { int i; for( i = 0 ; i < 5 ; i++ ) { sprintf(buffer, "%02d:%02d:%02d" ,hour, minute, sec); LCD_Locate(0,0); LCD_Putstr(buffer); wait(100); } if( ! P5DR.BIT.B0 ) { if( ++hour > 23 ) hour = 0; } if( ! P5DR.BIT.B1 ) { if( ++minute > 59 ) minute = 0; } if( ! P5DR.BIT.B2 ) sec = 0; if( ! P5DR.BIT.B3 ) break; } return 0; }