/********************************************************************* * * * Filename: led_toggle.c * * Date: 03/01/2013 * * Version: 1.0 * * Author: Goran Ljubic * * * ********************************************************************** * * * Architecture: Microchip PIC Enhanced Mid-range Core * * Processor: 16F1827 * * Compiler: MPLAB XC8 v1.12 (Free mode) * * * ********************************************************************** * * * Description: Primer 3 * * * * U primeru je obradeno citanje stanja tastera TA1 i prikazivanje * * ovog stanja ukljucivanjem i iskljucivanjem LED1. * * * *********************************************************************/ #include #define _XTAL_FREQ 4000000 // frekvencija na kojoj radi interni oscilator. Neophodno definisati zbog delay() funkcija /****************************************************************************************************************************** * CONFIGURATION WORDS * Watchdog timer is disabled, Internal RC oscillator I/O function on CLKIN pin, MCLR/VPP pin function is digital input, * Program memory code protection is enabled, Brown-out Reset disabled, Power-up timer enabled, * Data memory code protection is enabled, CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin, * Internal/External Switchover mode is disabled, Fail-Safe Clock Monitor is disabled, * 000h to FFFh flash memory write protected, 4x PLL disabled, Stack Overflow or Underflow will not cause a Reset, * High-voltage on MCLR/VPP must be used for programming * * ******************************************************************************************************************************/ __CONFIG(WDTE_OFF & FOSC_INTOSC & MCLRE_OFF & CP_ON & BOREN_OFF & PWRTE_ON & CPD_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF); __CONFIG(WRT_ALL & PLLEN_OFF & STVREN_OFF & LVP_OFF); #define TA1_ON RA4 == 0 #define TA1_OFF RA4 == 1 #define LED1_ON LATB0 = 1 #define LED1_OFF LATB0 = 0 #define PRESSED 1 #define RELEASED 0 unsigned char dbc; struct { unsigned TA1_STATE:1; // status bit tastera TA1 : 1 - PRESSED, 0 - RELEASED unsigned TA2_STATE:1; unsigned TA3_STATE:1; unsigned TA4_STATE:1; unsigned fill:4; }CTRL; /****************************** * MAIN PROGRAM * ******************************/ void main(void) { /****************************** * INITIALISATION * ******************************/ OSCCON = 0b01101010; // 4x PLL is disabled, 4 MHz HF Internal oscillator block ANSELA = 0; // Svi pinovi porta A onfigurisani kao digitalni I/O TRISA = 0b11111111; // Svi pinovi porta A konfigurisani kao ulazni ANSELB = 0; TRISB = 0b11111110; // Pin RB0 konfigurisan kao izlazni LATB = 0b00000000; // LED1 ugašena. dbc = 0xFF; /****************************** * MAIN LOOP * ******************************/ while(1) { __delay_ms(1); // Uzimanje uzorka obavlja se svake milisekunde dbc <<= 1; // pri cemu se najpre pomocna promenljiva dbc pomera za jedno mesto ulevo. if(TA1_OFF) // Ukoliko taster nije pritisnut na mesto bita najmanje težine upisuje se jedinica dbc |= 1; if(dbc == 0) // Ako je dobijeni rezultat 0x00 znaci da smo za najmanje 8 ciklusa imali { // stanje stabilne logicke nule CTRL.TA1_STATE = PRESSED; // pa cemo kontrolni flag tastera TA1 postaviti u stanje PRESSED dbc = 0xFF; // a kontrolnu promenljivu dbc postaviti ponovo na pocetnu vrednost. } // Ovime su prakticno postavljeni uslovi za novi ciklus ocitavanja stanja tastera. else if(dbc == 0xFF) // Ukoliko je dobijeni rezultat 0xFF to znaci da smo imali stabilno stanje logicke jedinice CTRL.TA1_STATE = RELEASED; // i da je taster otpušten pa je kontrolni flag postavljen u stanje REALASED if(CTRL.TA1_STATE == PRESSED) // Ovaj deo koda se odnosi na vizuelno obeležavanje stanja tastera TA1 pa ukoliko je taster pritisnut LED1_ON; // svetlece LED1 else // a ukoliko je otpušten LED1_OFF; // LED1 ce biti iskljucena. } }