#include #include "lcd.h" #include "portyLcd.h" #define PRZYCISK BIT4&P4IN unsigned int i=0; unsigned int dziesiatkidni=2; unsigned int dni=8; unsigned int dziesiatkigodz=2; unsigned int godz=3; unsigned int dziesiatkiminut=5; unsigned int minuty=9; unsigned int dziesiatkisekund=5; unsigned int sekundy=6; unsigned int licznik=0; unsigned int miesiac=3; unsigned int dziesiatkimiesiecy=0; unsigned int tysiaceroku=2; unsigned int setkiroku=0; unsigned int dziesiatkiroku=0; unsigned int rok=0; unsigned char znak; unsigned char literar; char sty[7]={"stycze "}; char lut[5]={"luty "}; char mar[7]={"marzec "}; char kwi[8]={"kwiecie "}; char maj[3]={"maj"}; char cze[8]={"czerwiec"}; char lip[6]={"lipiec"}; char sie[8]={"sierpie "}; char wrz[8]={"wrzesie "}; char paz[12]={"pazdziernik"}; char lis[10]={"listopad "}; char gru[8]={"grudzie "}; void Clock(void); void main( void ) { znak=':'; literar='r'; P2DIR |= BIT1; // STATUS LED WDTCTL=WDTPW + WDTHOLD; // Wyłączenie WDT InitPortsLcd(); // inicjalizacja portów LCD InitLCD(); // inicjalizacja LCD clearDisplay(); // czyszczenie wyświetlacza // Basic Clock Module ustawiamy na ACLK(zegar 8 MHz ) i dzielimy częstotliwość 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 ciągle ustawiona BCSCTL1 |= DIVA_1; // ACLK=8 MHz/2=4 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_3; // Wybieram ACLK, ACLK/8=500kHz,tryb Up CCTL0 = CCIE; // włączenie przerwań od CCR0 CCR0=50000; // podzielnik 50000: przerwanie co 100 ms _EINT(); // włączenie przerwań for (;;) { _BIS_SR(LPM3_bits); // przejscie do trybu LPM3 Clock(); } } void Clock(void) { SEND_CMD(CG_RAM_ADDR); int spec[2][8] = {{0,2, 4, 14, 10, 10, 10, 0}, // ń {0, 1, 2, 15, 2, 4, 15, 0}};// ź for(int registry = 0; registry < 2; ++registry) { for(int mw = 0; mw < 8; ++mw) SEND_CHAR(spec[registry][mw]); } if (licznik %10 ==0) // gdy mineła sekunda (10 * 100 milisekund) { licznik=0; P2OUT ^=BIT1; //zapal diodę ++sekundy; // licz sekundy sekundy = sekundy%10; dziesiatkisekund = dziesiatkisekund%6; SEND_CMD(DD_RAM_ADDR); // gorna linia wyswietlacza SEND_CHAR(dziesiatkidni+48); // wyswietla dziesiatki dni SEND_CHAR(dni+48); // wyswietla jednosci dni //SEND_CHAR(' '); // wyswietla pustny znak (odstęp) SEND_CHAR(' '); // wyswietla pustny znak (odstęp) if (dziesiatkimiesiecy==0 && miesiac==1) for (i=0;i<=8;i++) { if(i==7) { SEND_CHAR(8); } else { SEND_CHAR(sty[i]); // wyswietla styczen, jesli spelnione } } if (dziesiatkimiesiecy==0 && miesiac==2) for (i=0;i<=4;i++) SEND_CHAR(lut[i]); // wyswietla luty, jesli spelnione if (miesiac==3) for (i=0;i<=6;i++) SEND_CHAR(mar[i]);// wyswietla marzec, jesli spelnione if (miesiac==4) for (i=0;i<=8;i++) { if(i==8) { SEND_CHAR(8); } else { SEND_CHAR(kwi[i]); // wyswietla kwiecien, jesli spelnione } } if (miesiac==5) for (i=0;i<=3;i++) SEND_CHAR(maj[i]);// wyswietla maj, jesli spelnione if (miesiac==6) for (i=0;i<=8;i++) SEND_CHAR(cze[i]); // wyswietla czerwiec, jeśli spelnione if (miesiac==7) for (i=0;i<=6;i++) SEND_CHAR(lip[i]); // wyswietla lipiec, jesli spelnione if (miesiac==8) for (i=0;i<=8;i++) { if(i==8) { SEND_CHAR(8); } else { SEND_CHAR(sie[i]); } } if (miesiac==9) for (i=0;i<=8;i++) { if(i==8) { SEND_CHAR(8); } else { SEND_CHAR(wrz[i]); } } // wyswietla wrzesien, jesli spelnione if (dziesiatkimiesiecy==1 && miesiac==0) for (i=0;i<=11;i++) { if(i==3) { SEND_CHAR(9); } else { SEND_CHAR(paz[i]); } }// wyswietla pazdziernik, jeśli spelnione if (dziesiatkimiesiecy==1 && miesiac==1) for (i=0;i<=11;i++) SEND_CHAR(lis[i]); // wyswietla listopad, jesli spelnione if (dziesiatkimiesiecy==1 && miesiac==2) for (i=0;i<=11;i++) { if(i==8) { SEND_CHAR(8); } else { SEND_CHAR(gru[i]); } } SEND_CHAR(tysiaceroku+48); // wyswietla tysiace lat SEND_CHAR(setkiroku+48); // wyswietla setki lat SEND_CHAR(dziesiatkiroku+48); // wyswietla dziesiatki lat SEND_CHAR(rok+48); // wyswietla jednosci lat SEND_CHAR(literar); // wyswietla literke "r" // wyswietla grudzien, jeśli spelnione SEND_CMD(DD_RAM_ADDR2); // dolna linia wyswietlacza SEND_CHAR(dziesiatkigodz+48); // wyswietla dziesiatki godzin SEND_CHAR(godz+48); // wyswietla jednosci godzin SEND_CHAR(znak); // wyswietla dwukropek SEND_CHAR(dziesiatkiminut+48); // wyswietla dziesiatki minut SEND_CHAR(minuty+48); // wyswietla jednosci minut SEND_CHAR(znak); SEND_CHAR(dziesiatkisekund+48); SEND_CHAR(sekundy+48); // wyswietla pustny znak (odstęp) SEND_CHAR(' '); // wyswietla pustny znak (odstęp) SEND_CMD(CUR_SHIFT_LEFT ); // wróć kursorem na początek if(sekundy==9) // przeskok z X9 sekund na (X+1)0 sekund dziesiatkisekund++; if(dziesiatkisekund==6) // przeskok z 59 sekund na X minut 00 sekund { dziesiatkisekund=0; minuty++; } if(minuty==10) // przeskok z X9 minut na (X+1)0 minut { minuty=0; dziesiatkiminut++; } if(dziesiatkiminut==6) // przeskok z 59 minut na X godzin 00 minut { dziesiatkiminut=0; godz++; } if(godz==10) // przeskok z X9 godzin na (X+1)0 godzin { godz=0; dziesiatkigodz++; } if(dziesiatkigodz==2 && godz==4 ) // przeskok z 23:59:59 na 00:00:00 { dziesiatkigodz=0; godz=0; dni++; } if(dni==9) // przeskok z X9 dni na (X+1)0 dni { dni=1; dziesiatkidni++; } // przeskok z 31 dnia na dzień 1 kolejnego miesiąca (dla miesięcy: 1,3,5,7,8,10,12) if(dziesiatkidni==3 && dni==2 && (miesiac==1 || miesiac==3 || miesiac==5 ||miesiac==7 ||miesiac==8 ||(miesiac==0 && dziesiatkimiesiecy==1) ||(miesiac==2 && dziesiatkimiesiecy==1))) { dziesiatkidni=0; dni=1; miesiac++; } // przeskok z 30 dnia na dzień 1 kolejnego miesiąca (dla miesięcy: 4,6,9,11) if(dziesiatkidni==3 && dni==1 && (miesiac==4 || miesiac==6 ||miesiac==7 ||miesiac==9 ||(miesiac==1 && dziesiatkimiesiecy==1))) { dziesiatkidni=0; dni=1; miesiac++; } int rokvalue=1000*tysiaceroku+100*setkiroku+10*dziesiatkiroku+rok; // przeskok z 28 dnia na dzień 1 kolejnego miesiąca (dla miesięca: 2) if(dziesiatkidni==2 && dni==9 && miesiac==2 && dziesiatkimiesiecy==0) { if(((rokvalue%400)==0) &&(rokvalue%4==0)&&(rokvalue%100!=0)) { dziesiatkidni=2; dni=9; miesiac=2; } else { dziesiatkidni=0; dni=1; ++miesiac; } } if(dziesiatkimiesiecy==0 && miesiac==10)// przeskok z 9 miesiaca na 10 { miesiac=0; dziesiatkimiesiecy=1; } if(dziesiatkimiesiecy==1 && miesiac==3) // przeskok z 12 miesiaca na 1 { dziesiatkimiesiecy=0; miesiac=1; rok++; } if(rok==10) // przeskok z XXX9 lat na XX(X+1)0 lat { rok=0; dziesiatkiroku++; } if(dziesiatkiroku==10) // przeskok z XX99 lat na X(X+1)00 lat { dziesiatkiroku=0; setkiroku++; } if(setkiroku==10) // przeskok z X999 lat na (X+1)000 lat { setkiroku=0; tysiaceroku++; } } } // procedura obsługi przerwania od TimerA #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { ++licznik; _BIC_SR_IRQ(LPM3_bits); // wyjście z trybu LPM3 }