- #include<msp430x14x.h>
- #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
- }