//********************************************************************** //■■■関数&共有データ宣言■■■ extern void main(); extern void init_port(); extern void init_segment(); extern void init_timer(); extern void segment_disp(); extern void segment_set_data(short seg1, short seg2, short SEG3, short seg4, short dot); extern void interrupt(); extern long clock_msec; extern short lock; //********************************************************************** //■■■マクロ定義■■■ //7SEG-SELECT #define ACTIVE_LOW //簡易接続、標準接続(B(2SA1015)) #ifdef ACTIVE_LOW #define SEG_ON 0 #define SEG_OFF 1 #else //標準接続(A(2SC1815)) #define SEG_ON 1 #define SEG_OFF 0 #endif sbit SEG1 at PORTA.B1; sbit SEG1_Direction at TRISA.B1; #define SEG1_ON SEG1 = SEG_ON #define SEG1_OFF SEG1 = SEG_OFF sbit SEG2 at PORTA.B0; sbit SEG2_Direction at TRISA.B0; #define SEG2_ON SEG2 = SEG_ON #define SEG2_OFF SEG2 = SEG_OFF sbit SEG3 at PORTA.B7; sbit SEG3_Direction at TRISA.B7; #define SEG3_ON SEG3 = SEG_ON #define SEG3_OFF SEG3 = SEG_OFF sbit SEG4 at PORTA.B6; sbit SEG4_Direction at TRISA.B6; #define SEG4_ON SEG4 = SEG_ON #define SEG4_OFF SEG4 = SEG_OFF //7SEG-DATA #define SEG_DATA PORTB #define SEG_DATA_Direction TRISB //SWITCH sbit SW_HH_UP at PORTA.B3; sbit SW_HH_UP_Direction at TRISA.B3; sbit SW_MM_UP at PORTA.B4; sbit SW_MM_UP_Direction at TRISA.B4; sbit SW_SELECT at PORTA.B5; sbit SW_SELECT_Direction at TRISA.B5; //other #define INPUT_MODE 1 #define OUTPUT_MODE 0 #define LOCK 1 #define UNLOCK 0 //********************************************************************** //■■■メイン関数■■■ void main() { short hh, mm, ss; long temp; // OSCCON = 0b01110000; //クロックを8MHzに設定します。 ANSEL = 0b00000000; //A/D変換モジュールは使用しません。 // init_port(); init_segment(); init_timer(); // 割り込みを許可します。 INTCON.PEIE = 1; INTCON.GIE = 1; // while (1) { temp = clock_msec / 1000; // hh = temp / 3600; mm = (temp % 3600) / 60; ss = temp % 60; // if (SW_SELECT == 1) { segment_set_data(hh / 10, hh % 10, mm / 10, mm % 10, 2); } else { segment_set_data(mm / 10, mm % 10, ss / 10, ss % 10, 2); } // if (SW_HH_UP == 0) { hh++; ss = 0; if (hh == 24) { hh = 0; } lock = LOCK; clock_msec = (((long)hh * 3600) + ((long)mm * 60) + (long)ss) * 1000; lock = UNLOCK; } if (SW_MM_UP == 0) { mm++; ss = 0; if (mm == 60) { mm = 0; } lock = LOCK; clock_msec = (((long)hh * 3600) + ((long)mm * 60) + (long)ss) * 1000; lock = UNLOCK; } // Delay_ms(100); } } //********************************************************************** //■■■セグメント初期化関数■■■ void init_segment() { SEG1_Direction = OUTPUT_MODE; SEG1_OFF; SEG2_Direction = OUTPUT_MODE; SEG2_OFF; SEG3_Direction = OUTPUT_MODE; SEG3_OFF; SEG4_Direction = OUTPUT_MODE; SEG4_OFF; // SEG_DATA_Direction = 0b00000000; SEG_DATA = 0x00; } //********************************************************************** //■■■入出力ポート初期化関数■■■ void init_port() { SW_SELECT_Direction = INPUT_MODE; SW_HH_UP_Direction = INPUT_MODE; SW_MM_UP_Direction = INPUT_MODE; } //********************************************************************** //■■■タイマー初期化関数■■■ void init_timer() { T2CON.T2CKPS1 = 0; T2CON.T2CKPS0 = 0; T2CON.TOUTPS3 = 1; T2CON.TOUTPS2 = 1; T2CON.TOUTPS1 = 1; T2CON.TOUTPS0 = 1; TMR2 = 0; PIE1.TMR2IE = 1; PIR1.TMR2IF = 0; PR2 = 125; //125=1msec/((1sec/8MHz)*4*16PS) T2CON.TMR2ON = 1; } //********************************************************************** //■■■セグメントデータ設定関数■■■ short seg_dat[4] = {0, 0, 0, 0}; short dot_point = 0; // void segment_set_data(short seg1, short seg2, short SEG3, short seg4, short dot) { seg_dat[0] = seg1; seg_dat[1] = seg2; seg_dat[2] = seg3; seg_dat[3] = seg4; dot_point = dot; } //********************************************************************** //■■■割り込み関数■■■ long clock_msec = 0; short lock = UNLOCK; void interrupt() { if (PIR1.TMR2IF == 1) { PIR1.TMR2IF = 0; // segment_disp(); // if (lock == UNLOCK) { clock_msec++; if (clock_msec == 86400000) { clock_msec = 0; } } } } //********************************************************************** //■■■セグメントデータ表示関数■■■ short seg_tbl[10] = { 0b00111111, //0 0b00000110, //1 0b01011011, //2 0b01001111, //3 0b01100110, //4 0b01101101, //5 0b01111101, //6 0b00100111, //7 0b01111111, //8 0b01101111 //9 }; short seg_cnt = 0; // void segment_disp() { switch (seg_cnt) { case 0: SEG4_OFF; SEG_DATA = seg_tbl[seg_dat[0]]; if (dot_point == 1) { SEG_DATA.B7 = 1; } SEG1_ON; seg_cnt = 1; break; case 1: SEG1_OFF; SEG_DATA = seg_tbl[seg_dat[1]]; if (dot_point == 2) { SEG_DATA.B7 = 1; } SEG2_ON; seg_cnt = 2; break; case 2: SEG2_OFF; SEG_DATA = seg_tbl[seg_dat[2]]; if (dot_point == 3) { SEG_DATA.B7 = 1; } SEG3_ON; seg_cnt = 3; break; case 3: SEG3_OFF; SEG_DATA = seg_tbl[seg_dat[3]]; if (dot_point == 4) { SEG_DATA.B7 = 1; } SEG4_ON; seg_cnt = 0; break; } } //**********************************************************************