#include "io430.h" #include "intrinsics.h" #include "LCD.h" #include "stdio.h" #define GO 1 #define STOP 0 int mm=0, ss=0, cc=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 = 100; // Hz CCR0 = 32768/freq - 1; TACTL = TASSEL_1 + MC_1; // ACLK, upmode P1IES &= 0x00; // interrupt P1.x au flancs montants P1IE |= 0x01; // enable interrupt P1.x P1IFG = 0; __enable_interrupt(); LCD_init(); // initialise et efface LCD while (1) { if (mode == GO) { sprintf(strDisp, "%02d %02d %02d", mm, ss, cc); LCD_print(strDisp); } } } // Timer_A TACCR0 interrupt vector handler #pragma vector= TIMERA0_VECTOR __interrupt void int_timerA(void) { cc++; // ajouter un centième de seconde if (cc == 100) { cc = 0; ss++; // ajouter une seconde P2OUT ^= 0xCF; // Toggle P2.x toutes les demi-secondes } if (cc == 50) P2OUT ^= 0xCF; // Toggle P2.x if (ss == 60) { ss = 0; mm++; // ajouter une minute } if (mm == 60) mm=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; } P1IFG = 0; } }