#include #include "lcd.h" #include "portyLcd.h" //---------------- zmienne globalne ------------- unsigned int i=0; unsigned int pom=0; unsigned int sekundy=0; unsigned int licznik=0; unsigned int minuty=0; unsigned int godzina=0; unsigned int sekund_D,sekund_J; unsigned int minuty_D,minuty_J; unsigned int godzina_D,godzina_J; unsigned char *znak1="Ustaw godzine ";//14 unsigned char *znak2="Ustaw minute ";//13 unsigned char *znak3="Ustaw sekunde ";//14 void Clock(void); void myDelay(){ int i,j; for(i=0;i<255;i++){for(j=0;j<1000;j++){}} } void ZmianaG() { if((P4IN&BIT4)==0) {godzina++;} else{godzina--;} if(godzina==-1){godzina=23;} if(godzina>=24){ godzina=0; } godzina_D=godzina/10; godzina_J=godzina%10; SEND_CMD(DD_RAM_ADDR2); SEND_CHAR(godzina_D+48); SEND_CHAR(godzina_J+48); } void ZmianaM() { if((P4IN&BIT4)==0) {minuty++;} else{minuty--;} if(minuty==-1){minuty=59;} if(minuty>=60){ minuty=0; } minuty_D=minuty/10; minuty_J=minuty%10; SEND_CMD(DD_RAM_ADDR2); SEND_CHAR(minuty_D+48); SEND_CHAR(minuty_J+48); } void ZmianaS() { if((P4IN&BIT4)==0) {sekundy++;} else{sekundy--;} if(sekundy==-1){sekundy=59;} if(sekundy>=60){ sekundy=0; } sekund_D=sekundy/10; sekund_J=sekundy%10; SEND_CMD(DD_RAM_ADDR2); SEND_CHAR(sekund_D+48); SEND_CHAR(sekund_J+48); } //----------------- main program ------------------- void main( void ) { P2DIR |= BIT1 ; // STATUS LED P4DIR &=~BIT4+BIT5+BIT6+BIT7; WDTCTL=WDTPW + WDTHOLD; // Wy31czenie WDT InitPortsLcd(); // inicjalizacja portów LCD InitLCD(); // inicjalizacja LCD clearDisplay(); // czyszczenie wyowietlacza // Basic Clock Module ustawiamy na ACLK(zegar 8 MHz ) i dzielimy czestotliwooa przez 2 (4 MHz) BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL 8MHz do { IFG1 &= ~OFIFG; // Czyszczenie flgi OSCFault for (i = 0xFF; i > 0; i--); // odczekanie } while ((IFG1 & OFIFG) == OFIFG); // dopóki OSCFault jest ci1gle ustawiona BCSCTL1 |= DIVA_3; // ACLK=8 MHz/8=1 MHz BCSCTL2 |= SELM0 | SELM1; // MCLK= LFTX1 =ACLK // Timer_A ustawiamy na 500 kHz // a przerwanie generujemy co 100 ms TACTL = TASSEL_1 + MC_1 +ID_2; // Wybieram ACLK, ACLK/8=500kHz,tryb Up CCTL0 = CCIE; // w31czenie przerwan od CCR0 CCR0=25000; // podzielnik 50000: przerwanie co 100 ms _EINT(); // w31czenie przerwan while((P4IN&BIT7)!=0) { if(pom==0){ SEND_CMD(DD_RAM_ADDR); for(i=0;i<14;i++) { SEND_CHAR(znak1[i]); } myDelay(); } if((P4IN&BIT6)==0 && (pom==0)){ clearDisplay(); SEND_CMD(DD_RAM_ADDR); for(i=0;i<13;i++) { SEND_CHAR(znak2[i]); } myDelay(); } if((P4IN&BIT6)==0 &&( pom==1)){ clearDisplay(); SEND_CMD(DD_RAM_ADDR); for(i=0;i<14;i++) { SEND_CHAR(znak3[i]); } myDelay(); } if(((P4IN&BIT4)==0 || (P4IN&BIT5)==0) &&( pom==0)) { ZmianaG(); myDelay(); } if(((P4IN&BIT4)==0 || (P4IN&BIT5)==0) &&( pom==1)) { ZmianaM(); myDelay(); } if(((P4IN&BIT4)==0 || (P4IN&BIT5)==0 )&& (pom==2)) { ZmianaS(); myDelay(); } if((P4IN&BIT6)==0){pom++; for(i=0;i<10000;i++){}} } clearDisplay(); for (;;) { _BIS_SR(LPM3_bits); // przejscie do trybu LPM3 Clock(); } } void Clock(void) { if (licznik %10 ==0) // gdy mine3a sekunda (10 * 100 milisekund) { if(godzina==23 && minuty==59 && sekundy==59) { godzina=0; } if(minuty==59 && sekundy==59){ minuty=0; godzina++; } if(sekundy==59){ sekundy=0; minuty++; } licznik=0; P2OUT ^=BIT1; //zapal diode ++sekundy; // licz sekundy sekund_D= sekundy/10; sekund_J= sekundy%10; minuty_D= minuty/10; minuty_J=minuty%10; godzina_D=godzina/10; godzina_J=godzina%10; SEND_CMD(DD_RAM_ADDR); SEND_CHAR(godzina_D+48); SEND_CHAR(godzina_J+48); SEND_CHAR(':'); SEND_CHAR(minuty_D+48); SEND_CHAR(minuty_J+48); SEND_CHAR(':'); SEND_CHAR(sekund_D+48); SEND_CHAR(sekund_J+48); SEND_CMD(CUR_SHIFT_LEFT ); // wróa kursorem na pocz1tek } } // procedura obs3ugi przerwania od TimerA #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { ++licznik; _BIC_SR_IRQ(LPM3_bits); // wyjocie z trybu LPM3 }