Sunteți pe pagina 1din 3

#include <xc.

h>
#define _XTAL_FREQ 20000000

//Zona de los bits de configuraci�n


#pragma config PLLDIV = 5 // PLL Prescaler Divide by 5 (20 MHz/5 = 4 MHZ)
#pragma config CPUDIV = OSC1_PLL2 // System Clock Postscaler (20 MHz/1 = 20 MHz)
#pragma config USBDIV = 2 // USB Clock Full-Speed (96 MHz/2 = 48 MHz)
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config PWRT = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOR = OFF // Brown-out Reset disabled
#pragma config BORV = 3 // Brown-out Reset Voltage (Minimum 2.05V)
#pragma config WDT = OFF // Watchdog Timer disabled
#pragma config CCP2MX = OFF // CCP2 MUX bit (CCP2 is multiplexed with RB3)
#pragma config PBADEN = OFF // PORTB A/D (PORTB<4:0> configured as digital
I/O)
#pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled)
#pragma config STVREN = ON // Stack Full/Underflow will cause Reset
#pragma config LVP = OFF // Single-Supply ICSP disabled

char kbread (char);


unsigned char x, scan, dato, fila, columna, filas, columnas, tecla,
valor,valor1,i,cuenta;
char valortecla[16]={0x01,0x02,0x03,0x0A,
0x04,0x05,0x06,0x0B,
0x07,0x08,0x09,0x0C,
0x0F,0x00,0x0D,0x0E};
unsigned char tabla[4]={0x0A,0x09,0x05,0x06};
//unsigned char tabla1[4]={0x06,0x05,0x09,0x0A};

void main(void)
{
//configuro puertos como entradas o salidas
TRISC = 0X00;
TRISD = 0x00; // Configura el PUERTO D como salida.
TRISA = 0xF0; // PA[7..4]=entrada, PA[3..0]=salida
ADCON1 = 0x0F; // PortA como digital (no analogico)
TRISB = 0xF0; // PB[7..4]=entrada, PB[3..0]=salida
INTCON2bits.RBPU = 0; // Configura el pin RB0 como entrada.

//escanear el teclado
//LATD = 0xFF;
i=0;
// Wvalor1=1;

cuenta=0;
while(1)
{
scan = 0xFE;
for(x=0; x<4; x++)
{
LATB = scan; // LatB = scan (detecta las filas)
__delay_ms(10);
dato = PORTB; // dato = PORTB (ver si hay tecla pulsada)
if(dato!=scan) // si dato != scan, hay tecla pulsada
{
tecla= kbread(dato);
//LATD = tecla;
valor = valortecla[tecla];
if(valor== 0x00) LATD = 0x09;
if(valor== 0x01) LATD = 0x97;
if(valor== 0x02) LATD = 0x2A;
if(valor== 0x03) LATD = 0x0E;
if(valor== 0x04) LATD = 0x9C;
if(valor== 0x05) LATD = 0x4C;
if(valor== 0x06) LATD = 0x48;
if(valor== 0x07) LATD = 0x1F;
if(valor== 0x08) LATD = 0x08;
if(valor== 0x09) LATD = 0x1C;
if(valor== 0x0A) LATD = 0x18;
if(valor== 0x0B) LATD = 0xC8;
if(valor== 0x0C) LATD = 0x69;
if(valor== 0x0D) LATD = 0x8A;
if(valor== 0x0E) LATD = 0x9E;
if(valor== 0x0F) LATD = 0xF8;
//pulso1=1;
valor1=1;
}
if(valor==0x0E)
{if(valor1==1)
{for(cuenta=0; cuenta<=7; cuenta++) //giro horario
{if(i==4) i=0;
LATA = tabla[i]; //lee el valor del switch
__delay_ms(1000);
i++;
if(i==4) i=0;
}
valor1=0;
}
}

if(valor==0x0F)
{if(valor1==1)
{for(cuenta=0; cuenta<=7; cuenta++) //giro antihorario
{if(i==0) i=4;
LATA = tabla[i-1]; //lee el valor del switch
__delay_ms(1000);
i--;
if(i==0) i=4;
}
valor1=0;
}
}

scan = (scan<<1)|1; // se hace OR para solo tener un 0


}
}
} //fin de main

/*area de funciones*/
char kbread (char num)
{
// detecto que fila se ha activado
filas = dato & 0x0F;
switch (filas)
{
case 0x0E: {fila= 0; break;}
case 0x0D: {fila= 1; break;}
case 0x0B: {fila= 2; break;}
case 0x07: {fila= 3; break;}
}
// detecto que columna se ha activado
columnas = dato & 0xF0;
switch (columnas)
{
case 0xE0: {columna= 0; break;}
case 0xD0: {columna= 1; break;}
case 0xB0: {columna= 2; break;}
case 0x70: {columna= 3; break;}
}
columna= (fila<<2)+columna;
return columna;
}

S-ar putea să vă placă și