Hola. Supuse que al pulsador 1 lo tienes conectado a PORTA,0 y al pulsador 2 a PORTA,1.Los pulsadores envian 0v cuando estan presionados, y 5v cuando no lo estan.
Debes tener en cuenta siempre el antirrebote(darle un tiempo a que la señal del pulsador se estabilice) cuando utilizas pulsadores.
Este codigo hace que el led conectado a PORTB,0 encienda cuando presionas el pulsador 1, y se apague cuando presiones el pulsador 2.
Otro detalle,hacer:
CLRF PORTA
COMF PORTA,0
es incorrecto.
CLRF PORTA configura todo el puertoA como salida.
COMF PORTA,0 hace que el valor del puertoA se complemente valiendo entonces el valor binario 11111111. El problema es que al resultado de ese complemento lo guardas en 0(el acumulador o conocido gralmente como W) y no en 1(el registro que en este caso es el puertoA). Por lo tanto, el PUERTOA continua configurado como salida, en lugar de ser entrada. Espero que no hayas quemado los pines....
Por lo tanto SI seria correcto pero inadecuado hacer:
CLRF PORTA
COMF PORTA,1
Pero te recomiendo que hagas directamente asi:
MOVLW 0xff
MOVWF PORTA
Si bien estas dos ultimas hacen lo mismo, esta ultima opcion que te puse, te permitira mayor flexibilidad si en el futuro deseas alternar entre entradas y salidas.
El programa:
Codigo:
list p=16F84A
ESTADO EQU 0x03
PORTA EQU 0x05
PORTB EQU 0x06
CONTA0 EQU 0x1C
CONTA1 EQU 0x1D
org 0
bsf ESTADO,5
movlw 0xff
movwf PORTA
clrf PORTB
bcf ESTADO,5
INICIO btfss PORTA,0
goto ENCENDER
btfss PORTA,1
goto APAGAR
goto INICIO
APAGAR call antirrebote
bcf PORTB,0
goto INICIO
ENCENDER call antirrebote
bsf PORTB,0
goto INICIO
antirrebote
clrf CONTA0
RET1
movlw .51
movwf CONTA1
decfsz CONTA1,1
goto $-1
decfsz CONTA0,1
goto RET1
return
end
Exitos.