#include "io430.h" #include "intrinsics.h" #include "../LCD.h" #include "stdio.h" #define GO 1 #define STOP 0 int hh=0, mm=0, ss=0, mode=GO; int main( void ) { char strDisp[8+1]; float freq; // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; // Stop WDT P2DIR |= 0x01; // P2.0 output P2OUT = 0; CCTL0 = CCIE; // CCR0 interrupt enabled // fréquence = 32768/CCR0 [Hz] freq = 1; // Hz CCR0 = 32768/freq - 1; TACTL = TASSEL_1 + MC_1; // ACLK, upmode P1IES &= 0x00; // interrupt P1.x au flancs montants P1IE |= 0x0F; // enable interrupt P1.x P1IFG = 0x00; __enable_interrupt(); LCD_init(); // initialise et efface LCD while (1) { sprintf(strDisp, "%02d %02d %02d", hh, mm, ss); LCD_print(strDisp); } } // Timer_A TACCR0 interrupt vector handler #pragma vector= TIMERA0_VECTOR __interrupt void int_timerA(void) { P2OUT ^= 0x01; // Toggle P2.x if (mode) ss++; if (ss == 60) { ss = 0; mm++; } if (mm == 60) { mm = 0; hh++; } if (hh == 24) hh=0; } // routine d'interruption de P1 #pragma vector=PORT1_VECTOR __interrupt void Port1_ISR (void) { if (P1IFG == 0x01) { if (mode == GO) { // CCTL0 = 0; // CCR0 interrupt disabled mode = STOP; } else { // CCTL0 = CCIE; // CCR0 interrupt enabled mode = GO; } } else if (mode == STOP) switch (P1IFG) { case 0x02: ss++; if (ss == 60) { ss = 0; mm++; } break; case 0x04: mm++; if (mm == 60) { mm = 0; hh++; } break; case 0x08: hh++; if (hh == 24) hh=0; break; } P1IFG = 0x00; }