;-------------------------------------------------------------------------------------
;registros de desplazamiento entrada 74165
;27 portd4 DATO ENTRADA DE DATO
;28 portd5 CLOCK
;29 portd6 CARGA PARALELO
TECLADO
BCF STATUS,RP0
BCF STATUS,RP1
RLF INDF,F ;ROTA A LA IZQUIERDA EL SIGUIENTE BIT QUE CORRESPONDE CON EL BOTON PULSADO
INCF N_BUTON_CON
CALL RECARGA2 ;PONE EL Nº DE BOTON EN LA PUERTA DATO
BTFSC DATO ;TESTEA EL PIN DATO
RETURN ;SI ESTA ALTO VUELVE AL PROGRAMA
CALL DEMORA_20MS ;SI ESTABA BAJO, SALTÓ
CALL RECARGA2 ;PONE EL Nº DE BOTON EN LA PUERTA DATO
BTFSC DATO ;SI SIGUE ESTANDO BAJO EL DATO, EL PROGRMA SALTA
RETURN ;SI NO, FUE REBOTE
;---------------------------------
BTFSC STATUS,C ;TESTEA C QUE FUE ROTADO INDF ANTES
GOTO SUELTA_TECLA_OFF ;SI ESTA A UNO VA A APAGAR LA NOTA
;--------------------------------
SUELTA_TECLA_ON ;SI ESTABA A CERO APAGADO ENCIENDE LA NOTA
CALL DEMORA ;DEMORA ANTIREBOTES
CALL RECARGA2 ;VUELVE A PONER A LA ENTRADA DATO EL NUMERO DE BOTON A TRATAR
BTFSS DATO ;DE ESTA FORMA HASTA QUE NO SE SUELTA EL BOTON, NO SALE DEL BUCLE
GOTO SUELTA_TECLA_ON ;VOLVIENDO A ROTAR EL REGISTRO PARA TESTEARLO DE NUEVO
;--------------------------------
MOVLW NOTE_ON ;ESTA SECUENCIA DE ENVIOS ACTIVA LA NOTA
CALL ENVIAR_USART
MOVF N_BUTON_CON,W
CALL ENVIAR_USART
MOVLW VELOCITY
CALL ENVIAR_USART
BSF STATUS,C ;Y PONE A UNO EL BIT QUE LE CORRESPONDE
RETURN ;LA SIGUIENTE INSTRUCCION RLF LO METE EN EL REGISTRO
;---------------------------------
SUELTA_TECLA_OFF ;ESTA SECUENCIA COMPRUEBA QUE SE HAYA SOLTADO LA NOTA
CALL DEMORA ;DEMORA ANTIREBOTES
CALL RECARGA2 ;VUELVE A PONER A LA ENTRADA DATO EL NUMERO DE BOTON A TRATAR
BTFSS DATO ;DE ESTA FORMA HASTA QUE NO SE SUELTA EL BOTON NO CALLA LA NOTA NI SALE DEL BUCLE
GOTO SUELTA_TECLA_OFF ;VOLVIENDO A ROTAR EL REGISTRO PARA VOLVER A TESTEARLO
;---------------------------------
MOVLW NOTE_OFF ;ESTA SECUENCIA ENVIA EL APAGADO DE LA NOTA UNA VEZ SE HA SOLTADO LA TECLA
CALL ENVIAR_USART
MOVF N_BUTON_CON,W
CALL ENVIAR_USART
MOVLW VELOCITY
CALL ENVIAR_USART
BCF STATUS,C ;Y PONE A CERO EL BIT QUE LE CORRESPONDE
;LA SIGUIENTE INSTRUCCION RLF LO METE EN EL REGISTRO
BCF STATUS,RP0
BCF STATUS,RP1
RETURN
;-------------------------------
CARGA_PARALELO ;LACHEA LAS ENTRADAS DEL REGISTRO DE DESPLAZAMIENTO
BCF CARGA ;PONE A NIVEL BAJO Y PASAN LAS ENTRADAS PARALELO DEL MULTIPLEXOR AL CARRIL SERIE DEL MISMO
NOP
NOP
NOP
NOP
BSF CARGA
NOP
NOP
RETURN
;-------------------------------
PASA_DATO ;AUMENTA UN CLOCK EN EL REGISTRO DE DESPLAZAMIENTO
BCF CLOCK
NOP
NOP
NOP
NOP
BSF CLOCK ;SIGUIENTE CLOCK
NOP ;ESTABILIZA
NOP
NOP
NOP
RETURN
;-------------------------------
RECARGA2 ;PONE EN LA ENTRADA DATO EL VALOR DE LA ENTRADA DE LOS MULTIPLEXORES = N_POTE
MOVF N_BUTON_CON,W ;MUEVE A W
MOVWF N_BUTON ;DE W A N_BUTON PARA DECREMENTAR EL REGISTRO N_POTES VECES ;)
CALL CARGA_PARALELO ;LACHEA LOS DATOS
DECF N_BUTON,F ;PARA LA SALIDA DE DATOS DE UN REGISTRO DE OCHO BITS TENIA QUE DECREMENTAR 9 VECES ¿¿Y PARA EL ENTRADA??
RECARGA3
CALL PASA_DATO ;PASA EL DATO DEL REGISTRO UTILIZANDO LA SEÑAL DE CLOCK
DECFSZ N_BUTON ;DECREMENTA N_BUTON = N_POTE
GOTO RECARGA3 ;SIGUIENTE BUTON
RETURN ;LLEGO AL BOTON = N_POTE Y VUELVE,YA HA DEJADO EN EL PIN DE ENTRADA EL DATO DEL PIN SELECCIONADO
;-------------------------------------------------------------------------------------
os voy a poner la rutina que se utiliza para poner un led a cada pulsador , que en conjunto creo que es una buena practica para usar entradas y salidas serie, asi aclara el por que he guardado los bits en esos 8 registros, y a alguien que se encuentre en una situacion parecida le puede servir
;-------------------------------------------------------------------------------------------------
;20 22 21 PATITAS DE SALIDA DISPLAYS MODULO DOUT CORE J8
;-------------------------------------------------------------------------------------------------
;20--> SERIAL OUT FOR MULTIPLEXERS IN PIN14 74595
;22--> SIGNAL CLOCK IN PIN11 74595
;21--> LATCH IN PIN12 74595
;------------------------------------------------------------
LATCH BSF PORTD,2
NOP
NOP
BCF PORTD,2
NOP
NOP
MOVF FSR_TEMP2,W
MOVWF FSR
RETURN
;--------------------CONFIGURACION DEL SPI 8BITS CON LAS PATILLAS RA0 Y RA1 ---------------------------------------------
;------------------------------------------------------------------------------------------------------------------------
;---------------------------------------------------------
ENVIA_TEXTO
BCF STATUS,RP0 ;PAGE 0
MOVF FSR,W
MOVWF FSR_TEMP2
MOVLW N_REG_OUT ;Nº DE REGISTROS A LA SALIDA
MOVWF N_DIGITOS
MOVLW REG_MEM_DISPLAYS ;DONDE ESTA EL PRIMER BYTE A SACAR EN SERIE
MOVWF FSR
ENVIAR_SPI
MOVF INDF,W
MOVWF REG_ENV_SPI ;DE W A REG_ENV_SPI
MOVLW .9 ;Nº DE BITS DEL REGISTRO A W
MOVWF N_BITS ;DE W A N_BITS
REMONT
DECFSZ N_BITS ;DECREMENTA Nº DE BITS 8-0
GOTO ENVIA_BIT ;SALTA A ENVIA_BIT
GOTO COMPLETA ;RETORNA, NO QUEDAN MAS BITS A ENVIAR
ENVIA_BIT
RLF REG_ENV_SPI,F ;ROTA A LA IZQUIERDA Y EL BIT DE MAS PESO VA AL CARRY, A LA SIGUIENTE
;ESTE VUELVE A ENTRAR POR EL CARRY;Y CUANDO PASAN 8 BITS VUELVE A DEJAR EL QUE ESTABA
BTFSC STATUS,C ;TESTEA SI ES CERO O UNO
GOTO ENVIA_UNO ;SI FUE CERO NO SALTA Y VA A ENVIA _UNO
;--------------ENVIA CERO Y ESPERA NUEVO BIT------------------------------------
ENVIA_CERO ;SI FUE CERO SALTA PARA ENVIAR CERO POR EL SPI
BCF PORTD,1 ;PONE A CERO RA0
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
BSF PORTD,3 ;CLOCK EN ALTO RA1 PARA ENVIAR DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
BCF PORTD,1 ;PONE A CERO RA0
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
BCF PORTD,3 ;PONE A CERO CLOCK PARA ESPERAR NUEVO DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
GOTO REMONT ;RETORNA PARA ENVIAR NUEVO BIT
;--------------ENVIA UNO Y ESPERA NUEVO BIT-----------------------------------
ENVIA_UNO ;SI EL CARRY ESTABA A UNO, NO SALTÓ
BSF PORTD,1 ;1 EN DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
BSF PORTD,3 ;CLOCK A UNO PARA ENVIAR DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
BCF PORTD,1 ;PONE A CERO PARA ESPERAR NUEVO DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
BCF PORTD,3 ;PONE A CERO PARA ESPERAR NUEVO DATO
NOP ;ESPERA PARA ESTABILIZAR
NOP ;ESPERA PARA ESTABILIZAR
GOTO REMONT ;RETORNA PARA ENVIAR NUEVO BIT
COMPLETA
DECFSZ N_DIGITOS
GOTO OTRO_MAS
GOTO LATCH
OTRO_MAS
INCF FSR
GOTO ENVIAR_SPI