Autor Tema: teclado en serie con 74165  (Leído 4016 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
teclado en serie con 74165
« en: 07 de Diciembre de 2007, 14:53:10 »
hola
queria haceros una preguntica.  :mrgreen: he echo una rutina para manejar un teclado con 8-74165, esta lo que hace es enviar note on al pulsar y note off al soltar. a mi para musica me sirve, pero a STK500 no,necesita que cuando se pulse por primera vez envie note on y al volver a pulsar el mismo boton envie note off , he intentado algunas cosas sin exito  :( y mejor que os pregunte como puedo hacerlo que a mi no me sale
os pongo el programa
PROGRAMA
clrf     N_BUTON_CON
call     TECLADO
call     TECLADO
 .............
 ........
tantas veces como entradas de los 74165 y....
goto    PROGRAMA   .....vuelve a empezar

y esta es la rutina
Código: ASM
  1. ;27 portd4      DATO   
  2. ;28 portd5      CLOCK
  3. ;29 portd6      CARGA PARALELO
  4. TECLADO
  5.                 BCF             STATUS,RP0
  6.                 BCF             STATUS,RP1
  7.                 INCF    N_BUTON_CON
  8.                 CALL    RECARGA2        ;PONE EL NUMERO DE BOTON EN LA PUERTA DATO
  9.                 BTFSC   DATO            ;TESTEA EL PIN DATO
  10.                 RETURN                          ;SI ESTA ALTO VUELVE AL PROGRAMA
  11.                 CALL    DEMORA_20MS     ;SI ESTABA BAJO, SALTÓ
  12.                 CALL    RECARGA2        ;PONE EL Nº DE BOTON EN LA PUERTA DATO
  13.                 BTFSC   DATO            ;SI SIGUE ESTANDO BAJO EL DATO, EL PROGRMA SALTA
  14.                 RETURN                          ;SI NO, FUE REBOTE
  15.         ;---------------------------------
  16.                 MOVLW   NOTE_ON                 ;ESTA SECUENCIA DE ENVIOS ACTIVA LA NOTA
  17.                 CALL    ENVIAR_USART
  18.                 MOVF    N_BUTON_CON,W
  19.                 CALL    ENVIAR_USART
  20.                 MOVLW   VELOCITY
  21.                 CALL    ENVIAR_USART
  22.         ;---------------------------------
  23. SUELTA_TECLA                                    ;ESTA SECUENCIA COMPRUEBA QUE SE HAYA SOLTADO LA NOTA
  24.                 CALL    DEMORA  ;DEMORA ANTIREBOTES
  25.                 CALL    RECARGA2        ;VUELVE A PONER A LA ENTRADA DATO EL NUMERO DE BOTON A TRATAR
  26.                 BTFSS   DATO            ;DE ESTA FORMA HASTA QUE NO SE SUELTA EL BOTON NO CALLA LA NOTA NI SALE DEL BUCLE
  27.                 GOTO    SUELTA_TECLA    ;VOLVIENDO A ROTAR EL REGISTRO PARA VOLVER A TESTEARLO
  28.         ;---------------------------------
  29.                 MOVLW   NOTE_OFF                ;ESTA SECUENCIA ENVIA EL APAGADO DE LA NOTA UNA VEZ SE HA SOLTADO LA TECLA
  30.                 CALL    ENVIAR_USART
  31.                 MOVF    N_BUTON_CON,W
  32.                 CALL    ENVIAR_USART
  33.                 MOVLW   VELOCITY
  34.                 CALL    ENVIAR_USART
  35.                 BCF             STATUS,RP0
  36.                 BCF             STATUS,RP1
  37.                 RETURN         
  38.         ;-------------------------------
  39. CARGA_PARALELO                                  ;LACHEA LAS ENTRADAS DEL REGISTRO DE DESPLAZAMIENTO
  40.                 BCF             CARGA                   ;PONE A NIVEL BAJO Y PASAN LAS ENTRADAS PARALELO DEL MULTIPLEXOR AL CARRIL SERIE DEL MISMO
  41.                 NOP
  42.                 NOP
  43.                 NOP
  44.                 NOP
  45.                 BSF             CARGA
  46.                 NOP
  47.                 NOP
  48.                 RETURN 
  49.         ;-------------------------------
  50. PASA_DATO                                               ;AUMENTA UN CLOCK EN EL REGISTRO DE DESPLAZAMIENTO
  51.                 BCF     CLOCK
  52.                 NOP
  53.                 NOP
  54.                 NOP
  55.                 NOP
  56.                 BSF     CLOCK           ;SIGUIENTE CLOCK
  57.                 NOP                             ;ESTABILIZA
  58.                 NOP
  59.                 NOP
  60.                 NOP
  61.                 RETURN
  62.         ;-------------------------------
  63. RECARGA2                                        ;PONE EN LA ENTRADA DATO EL VALOR DE LA ENTRADA DE LOS MULTIPLEXORES = N_POTE          
  64.                 MOVF    N_BUTON_CON,W   ;MUEVE A W
  65.                 MOVWF   N_BUTON         ;DE W A N_BUTON PARA DECREMENTAR EL REGISTRO N_POTES VECES ;)
  66.                 CALL    CARGA_PARALELO  ;LACHEA LOS DATOS
  67.                 DECF    N_BUTON,F               ;PARA LA SALIDA DE DATOS DE UN REGISTRO DE OCHO BITS TENIA QUE DECREMENTAR 9 VECES
  68. RECARGA3
  69.                 CALL    PASA_DATO               ;PASA EL DATO DEL REGISTRO UTILIZANDO LA SEÑAL DE CLOCK
  70.                 DECFSZ  N_BUTON                 ;DECREMENTA (N_BUTON = N_BUTON_CON - .1)
  71.                 GOTO    RECARGA3                ;SIGUIENTE BUTON
  72.                 RETURN                                  ;LLEGO AL BOTON = N_POTE Y VUELVE,YA HA DEJADO EN EL PIN DE ENTRADA EL DATO DEL PIN SELECCIONADO
  73.                
  74. ;-------------------------------------------------------------------------------------

un saludo y gracias
« Última modificación: 07 de Diciembre de 2007, 17:04:38 por alogic.on »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: teclado en serie con 74165
« Respuesta #1 en: 07 de Diciembre de 2007, 17:28:36 »
Código: ASM
  1. ;27 portd4      DATO   
  2. ;28 portd5      CLOCK
  3. ;29 portd6      CARGA PARALELO
  4. TECLADO
  5.                 BCF             STATUS,RP0
  6.                 BCF             STATUS,RP1
  7.                 INCF    N_BUTON_CON
  8.                 CALL    RECARGA2        ;PONE EL NUMERO DE BOTON EN LA PUERTA DATO
  9.                 BTFSC   DATO            ;TESTEA EL PIN DATO
  10.                 RETURN                          ;SI ESTA ALTO VUELVE AL PROGRAMA
  11.                 CALL    DEMORA_20MS     ;SI ESTABA BAJO, SALTÓ
  12.                 CALL    RECARGA2        ;PONE EL Nº DE BOTON EN LA PUERTA DATO
  13.                 BTFSC   DATO            ;SI SIGUE ESTANDO BAJO EL DATO, EL PROGRMA SALTA
  14.                 RETURN                          ;SI NO, FUE REBOTE
  15.         ;---------------------------------
  16.                 MOVLW   NOTE_ON                 ;ESTA SECUENCIA DE ENVIOS ACTIVA LA NOTA
  17.                 CALL    ENVIAR_USART
  18.                 MOVF    N_BUTON_CON,W
  19.                 CALL    ENVIAR_USART
  20.                 MOVLW   VELOCITY
  21.                 CALL    ENVIAR_USART
  22.         ;---------------------------------
  23. SUELTA_TECLA_ON                                 ;ESTA SECUENCIA COMPRUEBA QUE SE HAYA SOLTADO LA NOTA
  24.                 CALL    RECARGA2        ;VUELVE A PONER A LA ENTRADA DATO EL NUMERO DE BOTON A TRATAR
  25.                 BTFSS   DATO            ;DE ESTA FORMA HASTA QUE NO SE SUELTA EL BOTON NO CALLA LA NOTA NI SALE DEL BUCLE
  26.                 GOTO    SUELTA_TECLA_ON ;VOLVIENDO A ROTAR EL REGISTRO PARA VOLVER A TESTEARLO
  27.                 CALL    DEMORA_20MS     ;SI ESTABA BAJO, SALTÓ
  28.                 BTFSS   DATO            ;DE ESTA FORMA HASTA QUE NO SE SUELTA EL BOTON NO CALLA LA NOTA NI SALE DEL BUCLE
  29.                 GOTO    SUELTA_TECLA_ON ;VOLVIENDO A ROTAR EL REGISTRO PARA VOLVER A TESTEARLO
  30.         ;---------------------------------
  31. PRES_TECLA_OFF
  32.                 CALL    RECARGA2            ;PONE EL NUMERO DE BOTON EN LA PUERTA DATO
  33.                 BTFSC   DATO                   ;TESTEA EL PIN DATO
  34.                 GOTO    PRES_TECLA_OFF  ;SI ESTA ALTO VUELVE AL PROGRAMA
  35.                 CALL     DEMORA_20MS    ;SI ESTABA BAJO, SALTÓ
  36.                 CALL     RECARGA2       ;PONE EL Nº DE BOTON EN LA PUERTA DATO
  37.                 BTFSC   DATO            ;SI SIGUE ESTANDO BAJO EL DATO, EL PROGRMA SALTA
  38.                 GOTO    PRES_TECLA_OFF
  39.         ;---------------------------------
  40.                 MOVLW   NOTE_OFF                ;ESTA SECUENCIA ENVIA EL APAGADO DE LA NOTA UNA VEZ SE HA SOLTADO LA TECLA
  41.                 CALL    ENVIAR_USART
  42.                 MOVF    N_BUTON_CON,W
  43.                 CALL    ENVIAR_USART
  44.                 MOVLW   VELOCITY
  45.                 CALL    ENVIAR_USART
  46.                 BCF             STATUS,RP0
  47.                 BCF             STATUS,RP1
  48.         ;---------------------------------
  49. SUELTA_TECLA_OFF                                        ;ESTA SECUENCIA COMPRUEBA QUE SE HAYA SOLTADO LA NOTA
  50.                 CALL    RECARGA2        ;VUELVE A PONER A LA ENTRADA DATO EL NUMERO DE BOTON A TRATAR
  51.                 BTFSS   DATO            ;DE ESTA FORMA HASTA QUE NO SE SUELTA EL BOTON NO CALLA LA NOTA NI SALE DEL BUCLE
  52.                 GOTO    SUELTA_TECLA_OFF        ;VOLVIENDO A ROTAR EL REGISTRO PARA VOLVER A TESTEARLO
  53.                 CALL    DEMORA_20MS     ;SI ESTABA BAJO, SALTÓ
  54.                 BTFSS   DATO            ;DE ESTA FORMA HASTA QUE NO SE SUELTA EL BOTON NO CALLA LA NOTA NI SALE DEL BUCLE
  55.                 GOTO    SUELTA_TECLA_OFF        ;VOLVIENDO A ROTAR EL REGISTRO PARA VOLVER A TESTEARLO
  56.  
  57.                 RETURN         
  58.         ;-------------------------------
  59. CARGA_PARALELO                                  ;LACHEA LAS ENTRADAS DEL REGISTRO DE DESPLAZAMIENTO
  60.                 BCF             CARGA                   ;PONE A NIVEL BAJO Y PASAN LAS ENTRADAS PARALELO DEL MULTIPLEXOR AL CARRIL SERIE DEL MISMO
  61.                 NOP
  62.                 NOP
  63.                 NOP
  64.                 NOP
  65.                 BSF             CARGA
  66.                 NOP
  67.                 NOP
  68.                 RETURN 
  69.         ;-------------------------------
  70. PASA_DATO                                               ;AUMENTA UN CLOCK EN EL REGISTRO DE DESPLAZAMIENTO
  71.                 BCF     CLOCK
  72.                 NOP
  73.                 NOP
  74.                 NOP
  75.                 NOP
  76.                 BSF     CLOCK           ;SIGUIENTE CLOCK
  77.                 NOP                             ;ESTABILIZA
  78.                 NOP
  79.                 NOP
  80.                 NOP
  81.                 RETURN
  82.         ;-------------------------------
  83. RECARGA2                                        ;PONE EN LA ENTRADA DATO EL VALOR DE LA ENTRADA DE LOS MULTIPLEXORES = N_POTE          
  84.                 MOVF    N_BUTON_CON,W   ;MUEVE A W
  85.                 MOVWF   N_BUTON         ;DE W A N_BUTON PARA DECREMENTAR EL REGISTRO N_POTES VECES ;)
  86.                 CALL    CARGA_PARALELO  ;LACHEA LOS DATOS
  87.                 DECF    N_BUTON,F               ;PARA LA SALIDA DE DATOS DE UN REGISTRO DE OCHO BITS TENIA QUE DECREMENTAR 9 VECES
  88. RECARGA3
  89.                 CALL    PASA_DATO               ;PASA EL DATO DEL REGISTRO UTILIZANDO LA SEÑAL DE CLOCK
  90.                 DECFSZ  N_BUTON                 ;DECREMENTA (N_BUTON = N_BUTON_CON - .1)
  91.                 GOTO    RECARGA3                ;SIGUIENTE BUTON
  92.                 RETURN                                  ;LLEGO AL BOTON = N_POTE Y VUELVE,YA HA DEJADO EN EL PIN DE ENTRADA EL DATO DEL PIN SELECCIONADO
  93.                
  94. ;-------------------------------------------------------------------------------------
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: teclado en serie con 74165
« Respuesta #2 en: 07 de Diciembre de 2007, 17:38:11 »
así y ya ?? pues que decir .....

¡¡¡muchas gracias¡¡¡ :-/ lo voy a probar ahora mismito  :mrgreen:

un saludo y gracias

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: teclado en serie con 74165
« Respuesta #3 en: 09 de Diciembre de 2007, 07:12:23 »
hola
estuve probando la rutina y no me quede agusto con que se quedase el programa en un loop hasta que se volviese a pulsar el mismo boton, pero me dio ideas de como plantearlo :mrgreen:. ahora la rutina usa un bit en el que guarda el estado de la ultima pulsacion para cada boton, usease 64 bits. la rutina se utiliza seleccionando en fsr el registro donde se van a guardar los bits y cada ocho pulsadores cambia a la siguiente direccion en fsr

         BCF      STATUS,RP0
         BCF      STATUS,RP1
         CLRF   N_BUTON         ;empieza boton 0
;1 conjunto para un registro--------------------------
         MOVLW   (N_REG_OUT+.3)
         MOVWF   FSR
         CALL   TECLADO      ;1
         CALL   TECLADO      ;2
         CALL   TECLADO      ;3
         CALL   TECLADO      ;4
         CALL   TECLADO      ;5
         CALL   TECLADO      ;6
         CALL   TECLADO      ;7
         CALL   TECLADO      ;8
         RLF      INDF,F      ;ROTA A LA IZQUIERDA UNA DE MAS PARA DEJAR EL REGISTRO COMO ESTABA
;2
         MOVLW   (N_REG_OUT+.4)
         MOVWF   FSR
         CALL   TECLADO
         CALL   TECLADO
         CALL   TECLADO........... y asi hasta gastar todas las posiciones, tantas como pulsadores
        CALL    ENVIA_TEXTO    ;esta rutina saca los datos en serie de que boton esta pulsado o no
y esta es la rutina

Código: ASM
  1. ;-------------------------------------------------------------------------------------
  2. ;registros de desplazamiento entrada 74165
  3. ;27 portd4      DATO   ENTRADA DE DATO
  4. ;28 portd5      CLOCK
  5. ;29 portd6      CARGA PARALELO
  6. TECLADO
  7.                 BCF             STATUS,RP0
  8.                 BCF             STATUS,RP1
  9.                 RLF             INDF,F          ;ROTA A LA IZQUIERDA EL SIGUIENTE BIT QUE CORRESPONDE CON EL BOTON PULSADO
  10.                 INCF    N_BUTON_CON
  11.                 CALL    RECARGA2        ;PONE EL Nº DE BOTON EN LA PUERTA DATO
  12.                 BTFSC   DATO            ;TESTEA EL PIN DATO
  13.                 RETURN                          ;SI ESTA ALTO VUELVE AL PROGRAMA
  14.                 CALL    DEMORA_20MS     ;SI ESTABA BAJO, SALTÓ
  15.                 CALL    RECARGA2        ;PONE EL Nº DE BOTON EN LA PUERTA DATO
  16.                 BTFSC   DATO            ;SI SIGUE ESTANDO BAJO EL DATO, EL PROGRMA SALTA
  17.                 RETURN                          ;SI NO, FUE REBOTE
  18.         ;---------------------------------
  19.                 BTFSC   STATUS,C        ;TESTEA C QUE FUE ROTADO INDF ANTES
  20.                 GOTO    SUELTA_TECLA_OFF        ;SI ESTA A UNO VA A APAGAR LA NOTA
  21.         ;--------------------------------
  22. SUELTA_TECLA_ON                         ;SI ESTABA A CERO APAGADO ENCIENDE LA NOTA
  23.                 CALL    DEMORA  ;DEMORA ANTIREBOTES
  24.                 CALL    RECARGA2        ;VUELVE A PONER A LA ENTRADA DATO EL NUMERO DE BOTON A TRATAR
  25.                 BTFSS   DATO            ;DE ESTA FORMA HASTA QUE NO SE SUELTA EL BOTON, NO SALE DEL BUCLE
  26.                 GOTO    SUELTA_TECLA_ON ;VOLVIENDO A ROTAR EL REGISTRO PARA TESTEARLO DE NUEVO
  27.         ;--------------------------------
  28.                 MOVLW   NOTE_ON                 ;ESTA SECUENCIA DE ENVIOS ACTIVA LA NOTA
  29.                 CALL    ENVIAR_USART
  30.                 MOVF    N_BUTON_CON,W
  31.                 CALL    ENVIAR_USART
  32.                 MOVLW   VELOCITY
  33.                 CALL    ENVIAR_USART
  34.                 BSF             STATUS,C                ;Y PONE A UNO EL BIT QUE LE CORRESPONDE
  35.                 RETURN                                  ;LA SIGUIENTE INSTRUCCION RLF LO METE EN EL REGISTRO
  36.         ;---------------------------------
  37. SUELTA_TECLA_OFF                                        ;ESTA SECUENCIA COMPRUEBA QUE SE HAYA SOLTADO LA NOTA
  38.                 CALL    DEMORA  ;DEMORA ANTIREBOTES
  39.                 CALL    RECARGA2        ;VUELVE A PONER A LA ENTRADA DATO EL NUMERO DE BOTON A TRATAR
  40.                 BTFSS   DATO            ;DE ESTA FORMA HASTA QUE NO SE SUELTA EL BOTON NO CALLA LA NOTA NI SALE DEL BUCLE
  41.                 GOTO    SUELTA_TECLA_OFF        ;VOLVIENDO A ROTAR EL REGISTRO PARA VOLVER A TESTEARLO
  42.         ;---------------------------------
  43.                 MOVLW   NOTE_OFF                ;ESTA SECUENCIA ENVIA EL APAGADO DE LA NOTA UNA VEZ SE HA SOLTADO LA TECLA
  44.                 CALL    ENVIAR_USART
  45.                 MOVF    N_BUTON_CON,W
  46.                 CALL    ENVIAR_USART
  47.                 MOVLW   VELOCITY
  48.                 CALL    ENVIAR_USART
  49.                 BCF             STATUS,C                ;Y PONE A CERO EL BIT QUE LE CORRESPONDE
  50.                                                                 ;LA SIGUIENTE INSTRUCCION RLF LO METE EN EL REGISTRO
  51.                 BCF             STATUS,RP0             
  52.                 BCF             STATUS,RP1             
  53.                 RETURN         
  54.         ;-------------------------------
  55. CARGA_PARALELO                                  ;LACHEA LAS ENTRADAS DEL REGISTRO DE DESPLAZAMIENTO
  56.                 BCF             CARGA                   ;PONE A NIVEL BAJO Y PASAN LAS ENTRADAS PARALELO DEL MULTIPLEXOR AL CARRIL SERIE DEL MISMO
  57.                 NOP
  58.                 NOP
  59.                 NOP
  60.                 NOP
  61.                 BSF             CARGA
  62.                 NOP
  63.                 NOP
  64.                 RETURN 
  65.         ;-------------------------------
  66. PASA_DATO                                               ;AUMENTA UN CLOCK EN EL REGISTRO DE DESPLAZAMIENTO
  67.                 BCF     CLOCK
  68.                 NOP
  69.                 NOP
  70.                 NOP
  71.                 NOP
  72.                 BSF     CLOCK           ;SIGUIENTE CLOCK
  73.                 NOP                             ;ESTABILIZA
  74.                 NOP
  75.                 NOP
  76.                 NOP
  77.                 RETURN
  78.         ;-------------------------------
  79. RECARGA2                                        ;PONE EN LA ENTRADA DATO EL VALOR DE LA ENTRADA DE LOS MULTIPLEXORES = N_POTE          
  80.                 MOVF    N_BUTON_CON,W   ;MUEVE A W
  81.                 MOVWF   N_BUTON         ;DE W A N_BUTON PARA DECREMENTAR EL REGISTRO N_POTES VECES ;)
  82.                 CALL    CARGA_PARALELO  ;LACHEA LOS DATOS
  83.                 DECF    N_BUTON,F               ;PARA LA SALIDA DE DATOS DE UN REGISTRO DE OCHO BITS TENIA QUE DECREMENTAR 9 VECES ¿¿Y PARA EL ENTRADA??
  84. RECARGA3
  85.                 CALL    PASA_DATO               ;PASA EL DATO DEL REGISTRO UTILIZANDO LA SEÑAL DE CLOCK
  86.                 DECFSZ  N_BUTON                 ;DECREMENTA N_BUTON = N_POTE
  87.                 GOTO    RECARGA3                ;SIGUIENTE BUTON
  88.                 RETURN                                  ;LLEGO AL BOTON = N_POTE Y VUELVE,YA HA DEJADO EN EL PIN DE ENTRADA EL DATO DEL PIN SELECCIONADO
  89.                
  90. ;-------------------------------------------------------------------------------------
  91. 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
  92. ;-------------------------------------------------------------------------------------------------     
  93. ;20 22 21  PATITAS DE SALIDA DISPLAYS MODULO DOUT CORE J8
  94. ;-------------------------------------------------------------------------------------------------
  95. ;20--> SERIAL OUT FOR MULTIPLEXERS IN PIN14 74595
  96. ;22--> SIGNAL CLOCK                        IN PIN11 74595
  97. ;21--> LATCH                                       IN PIN12 74595
  98.  
  99.                 ;------------------------------------------------------------
  100. LATCH           BSF             PORTD,2
  101.                         NOP
  102.                         NOP
  103.                         BCF             PORTD,2
  104.                         NOP
  105.                         NOP
  106.                         MOVF    FSR_TEMP2,W
  107.                         MOVWF   FSR
  108.                         RETURN
  109. ;--------------------CONFIGURACION DEL SPI 8BITS CON LAS PATILLAS RA0 Y RA1 ---------------------------------------------
  110.  
  111. ;------------------------------------------------------------------------------------------------------------------------
  112.  
  113.         ;---------------------------------------------------------
  114. ENVIA_TEXTO
  115.                 BCF             STATUS,RP0                      ;PAGE 0
  116.                 MOVF    FSR,W
  117.                 MOVWF   FSR_TEMP2
  118.                 MOVLW   N_REG_OUT                                       ;Nº DE REGISTROS A LA SALIDA
  119.                 MOVWF   N_DIGITOS
  120.                 MOVLW   REG_MEM_DISPLAYS                        ;DONDE ESTA EL PRIMER BYTE A SACAR EN SERIE
  121.                 MOVWF   FSR
  122.                
  123. ENVIAR_SPI
  124.                 MOVF    INDF,W
  125.                 MOVWF   REG_ENV_SPI                     ;DE W A REG_ENV_SPI
  126.                 MOVLW   .9                                      ;Nº DE BITS DEL REGISTRO A W
  127.                 MOVWF   N_BITS                          ;DE W A N_BITS
  128. REMONT         
  129.                 DECFSZ  N_BITS                          ;DECREMENTA Nº DE BITS 8-0
  130.                 GOTO    ENVIA_BIT                       ;SALTA A ENVIA_BIT
  131.                 GOTO    COMPLETA                        ;RETORNA, NO QUEDAN MAS BITS A ENVIAR
  132.  
  133. ENVIA_BIT
  134.                 RLF             REG_ENV_SPI,F           ;ROTA A LA IZQUIERDA Y EL BIT DE MAS PESO VA AL CARRY, A LA SIGUIENTE
  135.                                                                     ;ESTE VUELVE A ENTRAR POR EL CARRY;Y CUANDO PASAN 8 BITS VUELVE A DEJAR EL QUE ESTABA
  136.                 BTFSC   STATUS,C                        ;TESTEA SI ES CERO O UNO
  137.                 GOTO    ENVIA_UNO                       ;SI FUE CERO NO SALTA Y VA A ENVIA _UNO
  138.                         ;--------------ENVIA CERO Y ESPERA NUEVO BIT------------------------------------
  139. ENVIA_CERO                                                      ;SI FUE CERO SALTA PARA ENVIAR CERO POR EL SPI
  140.                 BCF             PORTD,1                         ;PONE A CERO RA0
  141.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  142.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  143.                 BSF             PORTD,3                         ;CLOCK EN ALTO RA1 PARA ENVIAR DATO
  144.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  145.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  146.                 BCF             PORTD,1                         ;PONE A CERO RA0
  147.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  148.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  149.                 BCF             PORTD,3                         ;PONE A CERO CLOCK PARA ESPERAR NUEVO DATO
  150.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  151.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  152.                 GOTO    REMONT                                          ;RETORNA PARA ENVIAR NUEVO BIT
  153.                         ;--------------ENVIA UNO Y ESPERA NUEVO BIT-----------------------------------
  154. ENVIA_UNO                                                       ;SI EL CARRY ESTABA A UNO, NO SALTÓ
  155.                 BSF             PORTD,1                         ;1 EN DATO
  156.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  157.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  158.                 BSF             PORTD,3                         ;CLOCK A UNO PARA ENVIAR DATO
  159.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  160.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  161.                 BCF             PORTD,1                         ;PONE A CERO PARA ESPERAR NUEVO DATO
  162.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  163.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  164.                 BCF             PORTD,3                         ;PONE A CERO PARA ESPERAR NUEVO DATO
  165.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  166.                 NOP                                                     ;ESPERA PARA ESTABILIZAR
  167.                 GOTO    REMONT                                          ;RETORNA PARA ENVIAR NUEVO BIT
  168. COMPLETA
  169.                 DECFSZ  N_DIGITOS
  170.                 GOTO    OTRO_MAS
  171.                 GOTO    LATCH
  172. OTRO_MAS
  173.                 INCF    FSR
  174.                 GOTO    ENVIAR_SPI

un saludo y gracias

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: teclado en serie con 74165
« Respuesta #4 en: 09 de Diciembre de 2007, 12:08:43 »
Hola. Tu teclado tiene 64 teclas? :O
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: teclado en serie con 74165
« Respuesta #5 en: 09 de Diciembre de 2007, 12:59:46 »
son las que he puesto,  :D a lo mejor parecen muchas, pero se queda corto, necesito manejar 20 teclas por canal y de momento son seis, 

un saludo y gracias

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: teclado en serie con 74165
« Respuesta #6 en: 15 de Diciembre de 2007, 16:52:49 »
hola
me pidieron por el privado si podia modificar la rutina para guardar los ocho bits en un registro, aqui esta :mrgreen: si se hacerlo claro que no me importa, :mrgreen: pero prefiero que los que enviais correos a mi cuenta sea por otra cosa y no para preguntar cosas del foro  " :shock: sera que da verguenza hablar aqui " :D :D asi podemos poner la duda y la respuesta que de esta forma si alguien mas le pasa puede leerlo
el programa ha de repetir la rutina tantas veces como registros a la entrada y definir al principio esos pines ademas de configurarlos como in/out etc, etc....

#DEFINE      DATO         PORTD,4      ;9 del 74165
#DEFINE      CLOCK         PORTD,5     ;15 y 2
#DEFINE      CARGA         PORTD,6     ;1
PROGRAMA2
         BCF      STATUS,RP0
         BCF      STATUS,RP1
         CLRF   N_BUTON_CON  ;HAY QUE LIMPIAR EL REGISTRO ANTES DE EMPEZAR
   
         CALL   ENCODER   ;1 registro 74165

         CALL   ENCODER   ;2 registros 74165.....
         RETURN
y estas son las rutinas
Código: [Seleccionar]
ENCODER
BCF STATUS,RP0
BCF STATUS,RP1
MOVLW .9 ;Nº DE BITS DEL REGISTRO A W
MOVWF N_BITS ;DE W A N_BITS
REMUEVE
INCF N_BUTON_CON ;INCREMENTA SIGUIENTE BIT
DECFSZ N_BITS ;DECREMENTA SI NO ES CERO SIGUIENTE BIT SI ES CERO SALTA Y SALE
GOTO SELECCION
CALL RESTA              ;aqui ya el dato salvado en reg_divisor
RETURN

SELECCION
CALL RECARGA2 ;PONE EL Nº DE BIT EN LA PUERTA DATO
BTFSC DATO
GOTO ES_UNO
ES_CERO
BCF STATUS,C
RLF REG_DIVISOR
GOTO REMUEVE
ES_UNO
BSF STATUS,C
RLF REG_DIVISOR
GOTO REMUEVE

;-------------------------------
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

;-------------------------------------------------------------------------------------


un saludo y gracias