/********************************************************************* * * * Filename: kbd.c * * Date: 16/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 4 * * * * U primeru je obradeno citanje stanja tastera TA1-TA4 * * i prikaz ovog stanja ukljucivanjem i iskljucivanjem LED5- LED8. * * * *********************************************************************/ #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_OFF RA4 == 1 #define TA2_OFF RA5 == 1 #define TA3_OFF RB3 == 1 #define TA4_OFF RB0 == 1 union { struct { unsigned TA1_STATE:1; // status bit tastera TA1 : 1 - PRESSED, 0 - RELEASED unsigned TA2_STATE:1; // status bit tastera TA2 : 1 - PRESSED, 0 - RELEASED unsigned TA3_STATE:1; // status bit tastera TA3 : 1 - PRESSED, 0 - RELEASED unsigned TA4_STATE:1; // status bit tastera TA4 : 1 - PRESSED, 0 - RELEASED unsigned fill:4; }KEY; unsigned char KEYS; }CTRL; void ReadKeys(void) { static unsigned char dbc[4] = {0xFF,0xFF,0xFF,0xFF}; // niz od 4 debounce promenljive unsigned char i, mask; mask = 0x01; // pomocna promenljiva mask kojom cemo postavljati status bitove tastrea for(i=0;i<4;i++) // Skeniramo stanja sva cetiri tastera { dbc[i] <<= 1; // pri cemu se najpre pomocna promenljiva dbc pomera za jedno mesto ulevo. switch(i) { case 0: // TA1 { if(TA1_OFF) // pa ukoliko odgovarajuci taster nije pritisnut dbc[i] |= 0x01; // na mesto bita najmanje težine upisuje se jedinica. break; } case 1: // TA2 { if(TA2_OFF) dbc[i] |= 0x01; break; } case 2: // TA3 { if(TA3_OFF) dbc[i] |= 0x01; break; } case 3: // TA4 { if(TA4_OFF) dbc[i] |= 0x01; break; } default: break; } if(dbc[i] == 0) // Ako je dobijeni rezultat 0x00 znaci da smo za najmanje 8 ciklusa imali { // stanje stabilne logicke nule CTRL.KEYS |= mask; // pa cemo postaviti kontrolni flag u stanje PRESSED dbc[i] = 0xFF; // i odgovarajucu kontrolnu promenljivu dbc postaviti ponovo na pocetnu vrednost. } else if(dbc[i] == 0xFF) // Ukoliko je dobijeni rezultat 0xFF to znaci da smo imali stabilno stanje logicke jedinice CTRL.KEYS &= ~mask; // i da je taster otpušten pa je kontrolni flag postavljen u stanje REALASED mask <<= 1; } } /****************************** * 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 WPUA5 = 1; // weak pull-up na portu RA5 je omogucen ANSELB = 0; // Svi pinovi porta B onfigurisani kao digitalni I/O WPUB = 0b00001001; // weak pull-up na portovima RB0 i RB3 omoguceni TRISB = 0b00001111; // Pinovi RB0-RB4 ulazni, pinovi RB4-RB7 izlazni LATB |= 0b00001111; // LED1-LED4 ugašene. nWPUEN = 0; // Weak pull-ups are enabled by individual WPUx latch values /****************************** * MAIN LOOP * ******************************/ while(1) { __delay_ms(1); // Uzimanje uzorka obavlja se svake milisekunde ReadKeys(); // kada citamo trenutna stanja svih tastera LATB = CTRL.KEYS << 4; // LED4 - LED7 prate stanja tastera T1 - T4 } }