Sorry jeje....aki va mi codigo.....no kacho ke onda...esta hecho para el kompilador CC5X..
Codigo:
//programa de lectura de un teclado matricial conectado al puerto B.
//se realiza una lectura cada 10ms.
/*char ADCON0 @ 0x1F; // Registro ADCON0
char ADCON1 @ 0x9F; // Direccion del registro ADCON1
char ADRESL@0x9E;
char ADRESH@0x1E;
char TXSTA@0x98;
char RCSTA@0x18;
char SPBRG@0x99;
char TXREG@0x19;
char RCREG@0x1A;*/
char Tecla, Temp,Temp1,Temp2, Pulsada;
char Tecla, Temp,Temp1,Temp2, Pulsada;
void delay_ms(char ms)
{/*
#asm
DEMORA movlw .55 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .181 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
return ; 2+2 Fin.
#endasm
;-------------------------------------------------------------
Requerimientos
-----------------
- Declaracion de PDel0 (registro)
- Declaracion oe PDel1 (registro)
- 1 nivel Stack
Ejemplo de uso
--------------
call DEMORA ; Delay 50000 ciclos (incluyen call+return)
*/uns16 x,y,z;
z=10000;y=100;
x=z*y;
while (x)
{
x>>= 0;
x--;
}*/}
void Lee_Tecla()
{//para las kolumnas
TRISB = 0b11110000;
OPTION.7 = 0; // habilita pull-ups
PORTB = 0;
#asm
comf PORTB,W; // Lee y complementa
movwf Temp1; // Lee y complementa (Columna)
swapf Temp1,f; // Cambia alta por baja
#endasm
Temp=0;
while (!(Temp1 & 0x01)) // cuenta hasta que llegue a un bit set
{
Temp1>>= 1;
Temp++;
}
if (Temp<4) // se ha pulsado
{
Temp2=Temp; // Guardo columna
//para las filas
TRISB = 0b00001111; // ahora la fila
OPTION.7 = 0; // habilita pull-ups
PORTB = 0;
#asm
comf PORTB,W; // Lee y complementa
movwf Temp1; // Lee y complementa (Fila)
#endasm
Temp=0;
while (!(Temp1 & 0x01)) // cuenta hasta que llegue a un bit set
{ Temp1>>=1;
Temp++;
}
if (Temp<4) // Fila correcta
{ Temp1=Temp;
Tecla=(Temp2<<2)+Temp1; //variable Tecla dice kual es la accionada
/*para mostrar la tecla pulsada kon leds en el puerto A
switch (Tecla)
{
case 0: if (Tecla==0x05) //Muestra en binario la tekla pulsada comenzando por la 1ª tecla "0". pone 01H.-
PORTA=0x01; break;
case 1: if (Tecla==0x06) //Muestra en binario la 2ª tecla "1".PONE 02H.-
PORTA=0x02; break;
case 2: if (Tecla==0x07) //Muestra en binario la 3ª tecla "2".
PORTA=0x03; break;
case 3: if (Tecla==0x08) //Muestra en binario la 4ª tecla "3".
PORTA=0x04; break;
case 4: if (Tecla==0x09) //Muestra en binario la 5ª tecla "4".
PORTA=0x05; break;
case 5: if (Tecla==0x0A) //Muestra en binario la 6ª tecla "5".
PORTA=0x06; break;
case 6: if (Tecla==0x0B) //Muestra en binario la 7ª tecla "6".
PORTA=0x07; break;
case 7: if (Tecla==0x0C) //Muestra en binario la 8ª tecla "7".
PORTA=0x08; break;
case 8: if (Tecla==0x0D) //Muestra en binario la 9ª tecla "8".
PORTA=0x09; break;
case 9: if (Tecla==0x0E) //Muestra en binario la 10ª tecla "9".
PORTA=0x0A; break;
case 10: if (Tecla==0x0F) //Muestra en binario la 11ª tecla "A".
PORTA=0x0B; break;
case 11: if (Tecla==0x10) //Muestra en binario la 12ª tecla "B".
PORTA=0x0C; break;
case 12: if (Tecla==0x11) //Muestra en binario la 13ª tecla "C".
PORTA=0x0D; break;
case 13: if (Tecla==0x12) //Muestra en binario la 14ª tecla "D".
PORTA=0x0E; break;
case 14: if (Tecla==0x13) //Muestra en binario la 15ª tecla "E". PONE UN 0FH
PORTA=0x0F; break;
case 15: if (Tecla==0x14) //Muestra en binario la ultima tecla "F". PONE UN 10H .-
PORTA=0x10; break;
}
*/}
else Tecla=0xFF;
}
else Tecla=0xFF;
}
void main()
{
//Puerto A se selecciona komo salida
while(1)
{
Lee_Tecla ();
delay_ms (10);
PORTB = Tecla;
}
}
Weno...parece ke me falta poner el ADCON1 para salida digital....Expliko el ccto ke estoy haciendo.....Tengo konektado un teklado matricial al pic16f874A por el puerto B....y kiero ver la tekla pulsada a traves de unos leds en el puerto A......el otro dia me dijeron ke se podian poner los leds en el mismo puerto B...pero no se....no kise...los leds indikan en binario el numero de la tekla...p ej: si apreto el "0"...los leds indican un 1..en binario: 00000001
weno este es mi problemita.....esto de los leds es para probar el programa para leer el teklado matricial.....porke lo ke kiero hacer al final es enviar la tekla presionada a traves de RS232 hasta el PC y verla en un programa tipo hyperterminal....