/* * File: rezonator_zegarkowy_i_PIC16F1827.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 = ON // Power-up Timer Enable (PWRT enabled) #pragma config MCLRE = OFF // 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 PORTBbits.RB0=1 // kropka na wyswietlaczu przeniesiona na port RB1 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 ; void __interrupt() blink(void) { if (PIR1bits.TMR1IF) { TMR1H = 0x80; //TMR1TMR1L = 32 768 aby przerwanie wystepowalo dokladnie co 1 sekunde TMR1L = 0x00; sekunda++; sekunda_jednosci++; if (sekunda_jednosci > 9){ sekunda_jednosci = 0; sekunda_dziesiatki++; } if(sekunda > 59){ sekunda = 0; sekunda_jednosci = 0; sekunda_dziesiatki = 0; } PIR1bits.TMR1IF = 0; // flaga przerwania wyzerowana } } void main(void) { T1CONbits.TMR1CS = 0b10; // Zrodlo taktowania dla Timer1 jest rezonator kwarcowy lub zegar zewnętrzny T1CONbits.T1OSCEN = 1; // Dedykowany do Timer1 specjalny obwod oscylatora wlaczony T1CONbits.TMR1ON = 1; // Timer1 wlaczony PIE1bits.TMR1IE = 1; // przerwanie Timer 1 wlaczone INTCONbits.PEIE = 1; // przerwania peryferiow wlaczone INTCONbits.GIE = 1; // globalne przerwania wlaczone TMR1H = 0x80; //TMR1HTMR1L = 32 768 // 16 bitowy licznik Timer1 TMR1L = 0x00; // __delay_ms(50); // oczekiwanie na ustabilizowanie oscylatora ANSELA = 0b00000000; // wylaczone wejscia Analogfowe na porcie A TRISA = 0b00100000; // kierunek portu A na wyjscie poza portem RA5 bo tam może być tylko wejście PORTA = 0b00000000; // stany pinow portu A jako niski ANSELBbits.ANSB1 = 0; // wylaczenie Analogu ANSELBbits.ANSB2 = 0; // wylaczenie Analogu TRISBbits.TRISB1 = 0; // kierunek na wyjscie TRISBbits.TRISB2 = 0; // kierunek na wyjscie PORTBbits.RB1 = 1; // port na stanie wysokim - wyswietlacz nie swieci nawet gdy pin na porcie A jest wlaczony PORTBbits.RB2 = 1; // --"-- while(1){ PORTA = cyfra[sekunda_jednosci]; // przypisanie wartosci binarnej pobranej z tablicy PORTBbits.RB1 = 1; PORTBbits.RB2 = 0; __delay_ms(3); PORTA = cyfra[sekunda_dziesiatki]; PORTBbits.RB1 = 0; PORTBbits.RB2 = 1; __delay_ms(3); } }