Documente Academic
Documente Profesional
Documente Cultură
h>
#define _XTAL_FREQ 20000000
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;
}
}
/*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;
}