/* * File: zegar_na_16F1827_dzialajacy_prototyp_z_ustawianiem.c * Author: elektronikawsrode * */ // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset enabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = OFF // PLL Enable (4x PLL disabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) #include #define _XTAL_FREQ 500000 // definicja segmentów Wys. 7 seg. LED #define _DP_ON PORTBbits.RB5=1 // kropka na wyswietlaczu przeniesiona na port RB5 poniewa? RA5 mo?e by? tylko wej?ciem #define _DP_OFF PORTBbits.RB5=0 // kropka na wyswietlaczu przeniesiona na port RB5 poniewa? RA5 mo?e by? tylko wej?ciem // tablica zakodowanych cyfr, ostatni znak to zgaszenie wyswietlacza unsigned char cyfra[11] = { 0b01011111, 0b00000110, 0b10011011, 0b10001111, 0b11000110, 0b11001101, 0b11011101, 0b00000111, 0b11011111, 0b11001111, 00000000}; // zmienne glonalne dostepne zarowno w funkcji obslugi przerwania jak i w funkcji main unsigned char sekunda = 0, sekunda_jednosci = 0, sekunda_dziesiatki = 0, minuta = 0, minuta_jednosci = 0, minuta_dziesiatki = 0, godzina = 0, godzina_jednosci = 0, godzina_dziesiatki = 0, kropka = 0; void __interrupt() blink(void) { if(INTCONbits.INTF){ PORTA = cyfra[11]; // wygaszenie wyswietlaczy aby nie pojawialy sie pozostalosci sygnalow na pinach __delay_ms(100); // czas potrzebny na ustabilizowanie przycisku, mozna poeksperymentowac minuta++; // zwiekszamy recznie o 1 minute minuta_jednosci++; if(minuta_jednosci > 9){ minuta_dziesiatki++; minuta_jednosci = 0; } if(minuta > 59){ minuta = 0; minuta_jednosci = 0; minuta_dziesiatki = 0; godzina++; godzina_jednosci++; } if (godzina_jednosci > 9){ godzina_jednosci = 0; godzina_dziesiatki++; } if (godzina > 23){ minuta = 0; minuta_jednosci = 0; minuta_dziesiatki = 0; godzina = 0; godzina_jednosci = 0; godzina_dziesiatki = 0; } sekunda = 0; // po każdym ustawieniu zegara, sekundy starują od 0 aby zwiekszyc dokladnosc ustawienia INTCONbits.INTF = 0; // flaga przerwania INT wyzerowana } if (PIR1bits.TMR1IF) { TMR1H = 0x80; //TMR1HTMR1L = 32 768 // 16 bitowy licznik Timer1 // TMR1L = 0x00; // TMR1L = 0xBA; // dodano liczbe 187 jako kalibracja zegara sekunda++; // przerwanie TIMER1 nastepuje dokladnie co 1 sekunde i zwieksza o 1 zmienna sekunda if(sekunda > 59){ sekunda = 0; minuta++; minuta_jednosci++; } if (minuta_jednosci > 9){ minuta_jednosci = 0; minuta_dziesiatki++; } if (minuta > 59){ minuta = 0; minuta_jednosci = 0; minuta_dziesiatki = 0; godzina++; godzina_jednosci++; } if (godzina_jednosci > 9){ godzina_jednosci = 0; godzina_dziesiatki++; } if (godzina > 23){ sekunda = 0; minuta = 0; minuta_jednosci = 0; minuta_dziesiatki = 0; godzina = 0; godzina_jednosci = 0; godzina_dziesiatki = 0; } kropka++; if(kropka > 4){ kropka = 1; } PIR1bits.TMR1IF = 0; // flaga przerwania wyzerowana } } void main(void) { T1CONbits.TMR1CS = 0b10; // Zrodlo taktowania dla Timer1 jest rezonator kwarcowy lub zegar zewnetrzny T1CONbits.T1OSCEN = 1; // Dedykowany do Timer1 specjalny obwod oscylatora wlaczony T1CONbits.TMR1ON = 1; // Timer1 wlaczony // konfiguracja przerwan INTCONbits.INTE = 1; // przerwanie INT na RB0 wlaczone OPTION_REGbits.INTEDG = 0; // ustawienie w jaki sposob przerwanie bedzie rozpoznawane - przez zbocze opadajace PIE1bits.TMR1IE = 1; // przerwanie Timer 1 wlaczone INTCONbits.PEIE = 1; // przerwania peryferiow wlaczone INTCONbits.GIE = 1; // globalne przerwania wlaczone T1CONbits.TMR1CS = 0b10; // Zrodlo taktowania dla Timer1 jest rezonator kwarcowy lub zegar zewnetrzny T1CONbits.T1OSCEN = 1; // Dedykowany do Timer1 specjalny obwod oscylatora wlaczony T1CONbits.TMR1ON = 1; // Timer1 wlaczony __delay_ms(50); // oczekiwanie na ustabilizowanie oscylatora TMR1H = 0x7F; //TMR1HTMR1L = 32 768 // 16 bitowy licznik Timer1 TMR1L = 0x37; // ANSELA = 0b00000000; // wylaczone wejscia Analogfowe na porcie A TRISA = 0b00100000; // kierunek portu A na wyjscie poza portem RA5 bo tam moze byc tylko wejscie PORTA = 0b00000000; // stany pinow portu A jako niski // konfiguracja portow dla katod wyswietlaczy // wylaczenie analogow ANSELBbits.ANSB1 = 0; ANSELBbits.ANSB2 = 0; ANSELBbits.ANSB3 = 0; ANSELBbits.ANSB4 = 0; // ustawienie kierunku jako wyjscia TRISBbits.TRISB1 = 0; TRISBbits.TRISB2 = 0; TRISBbits.TRISB3 = 0; TRISBbits.TRISB4 = 0; // ustawienie portow na stan wysoki bo wlaczane sa stanem niskim PORTBbits.RB1 = 1; PORTBbits.RB2 = 1; PORTBbits.RB3 = 1; PORTBbits.RB4 = 1; // konfiguracja portu dla kropki na wyswietlaczu ANSELBbits.ANSB5 = 0; TRISBbits.TRISB5 = 0; PORTBbits.RB5 = 0; //konfiguracja portow dla przyciskow OPTION_REGbits.nWPUEN = 0; // aby mozna wlaczyc pojedyncze pull-up'y ten bit musi byc wyzerowany TRISBbits.TRISB0 = 1; PORTBbits.RB0 = 1; WPUBbits.WPUB0 = 1; // podciagniecie do stanu wysokiego port RB0 // ustawienie czasu od ktorego zegar startuje godzina = 8; godzina_dziesiatki =godzina / 10; // zwraca dziesiatki z liczby poniewaz uzywamy typu unsigned char - bez czesci ulamkowej godzina_jednosci = godzina % 10; // zwraca reszte z dzielenia, w tym przypadku jednosci z liczby minuta = 0; minuta_dziesiatki = minuta / 10; minuta_jednosci = minuta % 10; while(1){ PORTA = cyfra[godzina_dziesiatki]; // przypisanie wartosci binarnej pobranej z tablicy PORTBbits.RB1 = 0; PORTBbits.RB2 = 1; PORTBbits.RB3 = 1; PORTBbits.RB4 = 1; if (kropka == 4){ _DP_ON; } else { _DP_OFF; } __delay_ms(3); PORTA = cyfra[godzina_jednosci]; PORTBbits.RB1 = 1; PORTBbits.RB2 = 0; PORTBbits.RB3 = 1; PORTBbits.RB4 = 1; if (kropka == 3){ _DP_ON; } else { _DP_OFF; } __delay_ms(3); PORTA = cyfra[minuta_dziesiatki]; PORTBbits.RB1 = 1; PORTBbits.RB2 = 1; PORTBbits.RB3 = 0; PORTBbits.RB4 = 1; if (kropka == 2){ _DP_ON; } else { _DP_OFF; } __delay_ms(3); PORTA = cyfra[minuta_jednosci]; PORTBbits.RB1 = 1; PORTBbits.RB2 = 1; PORTBbits.RB3 = 1; PORTBbits.RB4 = 0; if (kropka == 1){ _DP_ON; } else { _DP_OFF; } __delay_ms(3); } }