Hola amigos, tengo un programa que simulado con el proteus va perfectamente ke se trata de un teclado 4x4 en el puerto B y un Display en el puerto D de tal manera ke si pulsas la tecla en el puerto B sale el digito por el puerto D. Cuando lo pongo en la realidad el PortB todo el rato esta dando unos y ceros las patillas 4 a 7(ke no son las ke escanean tenian ke kedarse kietas como en el proteus) no entiendo el porque, el pic no esta roto xq pasa con otros ke e probao, y claro se salta el btfsc y manda los datos ke le da la gana al display, si alguien prodria decirme el xq se lo agradeceria, x cierto al pasar el dedo por el portb se vuelve mas loco el display todavia
list p=16f877 ;Comando que indica el Pic usado
include "p16f877.inc" ;Etiquetas genéricas para el Pic16F877
org 0x00 ;Inicio del programa en la posición cero de memoria
goto INICIO
org 0x05
Tecla equ 0x40
CONTA equ 0x50
Tecla2 equ 0x49
;Tecla3 equ 0x99
INICIO
CLRF PORTD ;Borra los latch.
CLRF PORTB ;Borra los latch.
BSF STATUS,RP0 ;Selecciona el banco 1
CLRF TRISD ;Selecciona PORTB como salida
MOVLW 0F0H ;PB4-7 como entradas;
MOVWF TRISB ;y PB0-3 como salidas
movlw b'10000011'
MOVWF OPTION_REG
BCF STATUS,RP0 ;selecciona banco 0
BUCLE
call KB_Scan
GOTO BUCLE ;Vuelve a la subrutina BUCLE
KB_Scan ;Escanea el teclado
CLRF Tecla ;Borra Tecla y
INCF Tecla,f ;prepara Tecla para primer c¢digo.
MOVLW b'1000' ;Saca 0 a la primera fila
MOVWF PORTB ;de la Puerta B
NOP ;Nada para estabilizaci¢n de señal.
Cheq_Col BTFSC PORTB,4 ;Primera columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa tecla.
BTFSC PORTB,5 ;Segunda columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa tecla.
BTFSC PORTB,6 ;Tercera columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada, incrementa tecla.
BTFSC PORTB,7 ;Cuarta columna = 0
GOTO antirebotes ;Sale si se ha pulsado tecla.
INCF Tecla,f ;Si no tecla pulsada,incrementa Tecla.
Ultima_Tecla MOVLW d'17' ;Carga W con el n£mero de Teclas + 1.
SUBWF Tecla,w ;y lo compara con el valor actual de Tecla.
BTFSC STATUS,Z ;Si Tecla + 1 = valor actual.
GOTO NTeclas ;No ha sido pulsada ninguna tecla.
BSF STATUS,C ;Pone a 1 Bit C.
RRF PORTB,f ;as¡ la Fila 1 pasa a 1 con la rotaci¢n a izqda.
GOTO Cheq_Col
NTeclas CLRF Tecla ;Coloca variable Tecla a 0
RETURN ;y regresa.
antirebotes
Espera1
BTFSC PORTB,4 ;Si no se suelta la tecla FILA 1
GOTO Espera1 ;vuelve a esperar.
Espera2
BTFSC PORTB,5 ;Si no se suelta la tecla FILA 2
GOTO Espera2 ;vuelve a esperar.
Espera3
BTFSC PORTB,6 ;Si no se suelta la tecla FILA 3
GOTO Espera3 ;vuelve a esperar.
Espera4
BTFSC PORTB,7 ;Si no se suelta la tecla FILA 4
GOTO Espera4 ;vuelve a esperar.
MOVF Tecla,w ;pone en w el numero contenido en la variable
CALL T_Conv ;llama a la tabla de conversion y retorna
MOVWF Tecla ;con el valor en hexadecimal y lo pone en la variable.
movwf Tecla2
movwf PORTD ;Hace que salga ese valor por PORTB
RETURN ;vuelve al programa principal que hizo la llamada.
T_Conv
ADDWF PCL,1
RETLW b'01010101' ;
RETLW b'11110001' ;
RETLW b'01111110' ;
RETLW b'10101010' ;
RETLW b'00111101' ;
RETLW b'00110000' ;
RETLW b'01111001' ;
RETLW b'01001110' ;
RETLW b'00110011' ;
RETLW b'01011011' ;
RETLW b'01011111' ;
RETLW b'00011111' ;
RETLW b'01110000' ;
RETLW b'11111111' ;
RETLW b'01110011' ;
RETLW b'01110111' ;
return
retardo
movlw d'50'
movwf CONTA
espera
clrf INTCON
movlw d'178'
movwf TMR0
espera_1
btfss INTCON,T0IF
goto espera_1
decfsz CONTA,F
goto espera
return
END