;ANTES: 0x21= 0xFF
;ENVIO VALOR: 00001111
;DESPUES: 0x21=0x7F
#INCLUDE <P16F877A.inc>
LIST P=16F877A
ERRORLEVEL -302,-306
ARRAY_LED_CH1 EQU 0x20
;...
N_BUTON_CON EQU 0xF0
N_BUTON_NOTE EQU 0xF1
ORG 0x000
movlw 0xFF
movwf 0x21 ;rellenar posicion de la cual poder el bit7 a cero a continuacion
movlw b'00001111' ;Afectar(poner a cero) al bit 7 del byte 1 del buffer
call SELECTION_REG
movf 0x21,W
mowf PORTB ;mostrar resultado en puertoB
nop
SELECTION_REG
BANKSEL N_BUTON_CON ;GUARDA N_BUTON_CON EN SU REGISTRO DE TRABAJO
movwf N_BUTON_CON
ANDLW B'00111000' ;CON ESTO SE ASEGURA QUE SOLO HAYA HASTA 8 REGISTROS A LA SALIDA
MOVWF N_BUTON_NOTE
BCF STATUS,C ;LO ROTA 1 VEZ A LA IZQ Y SWAPEA NIBBLES PARA CONOCER A QUE REGISTRO PERTENECE
RLF N_BUTON_NOTE,F
SWAPF N_BUTON_NOTE,F
MOVF N_BUTON_NOTE,W ;N_BUTON A W
BANKISEL ARRAY_LED_CH1
ADDLW ARRAY_LED_CH1 ;LO SUMA CON LA POSICION DE LOS REGISTROS PARA LOS LED
BTFSC STATUS,C ;la suma excede la posición 0xFF de memoria?
BSF STATUS,IRP
MOVWF FSR ;Y LO GUARDA EN FSR, INDF YA APUNTA AL REGISTRO PARA LOS LED
PAGESEL TABLA_LEDS
CALL TABLA_LEDS ;DE 0-7 SELECCIONA QUE BOTON DEL REGISTRO FUE PULSADO PARA SACAR LOS DATOS A LOS LED
xorlw 0xFF
ANDWF INDF,F ;Forzar bit de byte seleccionado a 0
PAGESEL $
RETURN
org 0x1000
TABLA_LEDS
MOVF N_BUTON_CON,W
ANDLW B'00000111' ;CREO QUE DE ESTA FORMA PODEMOS HAYAR DEL 0 A 7 CUAL ES PARA DIVIDIR EL Nº DE BOTONES EN MULTIPLOS DE 8
ADDWF PCL,F
DT B'00000001', B'00000010', B'00000100', B'00001000', B'00010000', B'00100000', B'01000000', B'10000000'
END