LIST P=16F84A ;Indica el modelo de PIC que se usa
;Es un directiva del ensamblador
RADIX HEX ;Los valores se representan en hexadecimal
include "p16f84a.inc"
CBLOCK
ENTRADA1
ENTRADA2
TEMPSALIDA
ENDC
org 0x00 ;Vector de Reset
GOTO Configuracion
org 0x04 ;Vector de interrupcion
RETURN
Configuracion:
BANKSEL TRISA ; Banco 1 , esto luego el compilador lo reemplaza por los BSF/BCF a STATUS,RP0
movlw 0X0E
movwf TRISA
movlw 0X07 ;w entradas Y SALIDAS
movwf TRISB ;w trisa (las lineas de pb salida)
BANKSEL PORTA ; Banco 0
Inicio:
RRF PORTA, W ; De RA3-RA1 a RA2-RA0, quedando el valor xxxx xaaa
ANDLW b'00000111' ; Me aseguro que quede 0000 0aaa
MOVWF ENTRADA1
movf PORTB ; Este va directo, asi que queda xxxx xbbb
ANDLW b'00000111' ; Me aseguro que quede 0000 0bbb
movwf ENTRADA2 ; Ya tengo los datos, es hora de trabajarlos!
INCF ENTRADA2, F ; Incremento F entrada 2 en 1, esto me va a permitir que si es 0 , al restar el primero no sume nada
CLRF TEMPSALIDA ; Limpio mi registro donde se realiza la suma
MOVF ENTRADA1, W ; W = Entrada1
bucle
DECF ENTRADA2, F ; Entrada - 1
BTFSS STATUS, Z ; Es 0 ?
GOTO MostrarResultado; Si es 0: Muestro el resultado, por que termino
ADDWF TEMPSALIDA, F ; No es 0: Le sumo 1 Entrada1 a TempSalida y procedo a decrementar
GOTO bucle ; Vuelvo hasta que quede en 0
MostrarResultado ; Resultado en 000c cccc , debo llevarlo a cccc c000
RLF TEMPSALIDA, F
RLF TEMPSALIDA, F
RLF TEMPSALIDA, W ; Este ultimo que lo rote y que lo ponga en W, me ahorro una instruccion
MOVWF PORTB ; Muevo al puerto
GOTO Inicio
END ;Directiva que indica el final del programa