Autor Tema: menu con pulsadores y vuelveme loco  (Leído 2852 veces)

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

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
menu con pulsadores y vuelveme loco
« en: 19 de Enero de 2008, 08:33:42 »
hola, tengo un problemilla con el menu que estoy haciendo y queria preguntaros si se os ocurre alguna idea para hacer que se quede en un bucle del programa pillado hasta que pulse un boton, os pongo en situacion a ver si consigo explicarme con claridad  8)

esta es la rutina de menu
Código: [Seleccionar]
MENU
BANKSEL PORTC
                                                    ;0 ;-----------------------
CALL CARGA_PARALELO
BTFSS DATO      ;TESTEA DATO PARA CONOCER SI SE HA PULSADO EL BOTON
CALL BUTON_M0
                                                    ;1 ;-----------------------
CALL BUTTON      ;ESTA PONE EN DATO EL Nº DEL BOTON
BTFSS DATO
CALL BUTTON_DOWN ;DECREMENTA EL Nº DE CANAL
                                                    ;2 ;-----------------------
CALL BUTTON      ;ESTA PONE EN DATO EL Nº DEL BOTON
BTFSS DATO
CALL BUTTON_UP    ;AUMENTA EL Nº DE CANAL
                                                    ;3 ;-----------------------
CALL BUTTON      ;ESTA PONE EN DATO EL Nº DEL BOTON
BTFSS DATO
CALL NEW        ;RESETEA A CERO EL Nº DE CANAL
                                                    ;4 ;-----------------------
CALL BUTTON      ;ESTA PONE EN DATO EL Nº DEL BOTON
BTFSS DATO
CALL START       ;ENVIA START
                                                    ;5 ;-----------------------
CALL BUTTON      ;ESTA PONE EN DATO EL Nº DEL BOTON
BTFSS DATO
CALL STOP_B      ;ENVIA STOP
                                                    ;6 ;-----------------------
CALL BUTTON
BTFSS DATO
CALL ENTER_MENU   ;SALTA PARA CAMBIAR EL N DE POTENCIOMETRO
                                                    ;7 ;-----------------------
CALL BUTTON      ;ESTA PONE EN DATO EL Nº DEL BOTON
BTFSS DATO
NOP
                                             ;-----------------------
RETURN
el programa explora el teclado del boton 0 al 7, cuando es pulsado el 6 el programa salta a la rutina ENTER_MENU, esta se queda pillado en un bucle que testea el valor de tres potenciometros y de nuevo el teclado, cambiandole las opciones, esta vez si se pulsa el 6 sale del menu, o si detecta el movimiento de uno de los tres potenciometros, salta a otro menu en el que se tienen tres opciones decrementar un registro; incrementarlo; o salir del menu, pues he aqui mi problema, y es que al pulsar inc o dec sale directamnte no solo del menu en el que esta si no del anterior tambien, os lo voy a intentar explicar con el codigo en la mano  :?
esta es la rutina a la que salta el programa, al pulsar el boton 6 del primer menu
Código: [Seleccionar]
ENTER_MENU
CALL DEMORA_20MS ;DEMORA ANTIREBOTES
CALL RECARGA2    ;PONE LA ENTRADA DEL REGISTRO SELECCIONADA EN DATO
BTFSC DATO      ;TESTEA SI SIGUE A NIVEL BAJO SALTA
RETURN ;SI NO FUE UN REBOTE
CLRW
CALL B2_BCD                               ;CONVIERTE A BCD Y 7 SEGMENTOS
CALL ENVIA_TEXTO ;SACA UN CERO POR LOS DISPLAYS
CALL SUELTA_TECLA          ;HASTA QUE NO SE SUELTE NO CONTINUA EL PROGRAMA
                                                            ;-----------
BANKSEL N_BUTON_CON
MOVF N_BUTON_CON,W
MOVWF N_BUTON_CON_TEMP ;SALVAMOS LA DIRECCION DEL PULSADOR PARA AL SALIR DEL MENU QUEDE DONDE ESTABA
                                                            ;-----------

BSF PUNTEROS,7            ;LO PONE A UNO PARA QUE HAGA LOOPS TESTEANDO LOS POTES

PAIM
CALL TODOS_LOS_CANALES_T        ;TESTEA LA MATRIZ DE POTES HASTA QUE UNO CAMBIA, LO MUESTRA POR EL DISPLAY 
BTFSC PUNTEROS,7
GOTO PAIM
                                                           ;---------------
BANKSEL N_BUTON_CON       ;SALVADO DE LA DIRECCION DEL TECLADO
MOVF N_BUTON_CON_TEMP,W
MOVWF N_BUTON_CON
RETURN
;---------------
en la rutina anterior se ve como pongo el bit PUNTEROS,7 a nivel alto para que no salga del bucle PAIM hasta presionar la tecla 6 que pone a nivel bajo el bit punteros,7  dentro del menu incluido en la call TODOS_LOS_CANALES_T
ahora la rutina TODOS_LOS_CANALES_T
Código: [Seleccionar]
TODOS_LOS_CANALES_T

BANKSEL N_POTE
CLRF N_POTE ;POTES Nº 0
MOVLW REG_POTEX
MOVWF FSR 
                                 ;--------------------------PRUEBA CON SOLO TRES POTENCIOMETROS
;0
MOVLW B'10000101' ;A W
CALL CANAL_AD_X_T ;CANALx DEL CAD
;1
MOVLW B'10001101' ;A W
CALL CANAL_AD_X_T ;CANALx DEL CAD
;2
MOVLW B'10010101' ;A W
CALL CANAL_AD_X_T
CALL MENU_3
RETURN
;--------------------------
si la rutina CANAL_AD_X_T DETECTA cambio de alguno de los potes sigue otro camino, en el que acaba en el ultimo menu con tres opciones, un boton dec un registro y lo guarda en la posicion de una tabla escrita en la eeprom, otro igual pero incf el registro y otro que pone a cero el bit PUNTEROS,6 lo que le hace salir del bucle, previamente puesto a uno antes de llamar al teclado
esta es la rutina CANAL_AD_X_T
Código: [Seleccionar]
CANAL_AD_X_T              ;SELECCIONA CANAL X DEL CAD NO INICIA LA CONVERSION
BANKSEL ADCON0
MOVWF ADCON0
CALL DEMORA          ;LA ADQUISICION CORRECTA PARA CARGAR EL CONDENSADOR ANTES DE INICIAR LA CONVERSION
INCF N_POTE,F           ;SIGUIENTE POTE
INCF FSR,F
BSF ADCON0,GO ;INICIA LA CONVERSION
ESPERA_CAD_T ;TESTEA HASTA QUE TERMINA LA CONVERSIÓN
BTFSC ADCON0,GO        ;HASTA QUE SE PONE A CERO EL BIT GO/DONE
GOTO ESPERA_CAD_T      ;VUELVE ATRAS HASTA QUE TERMINE
MOVF ADRESH,W
MOVWF REG_DIVISOR
CALL COMPENSACION
MOVF REG_DIVISOR,W
RESTA_T
BCF STATUS,Z
SUBWF INDF,W
BTFSC STATUS,Z
RETURN                               ;RETORNA A TODOS_LOS_CANALES_T EL VALOR DEL POTE ERA IGUAL AL ANTERIOR
PILLA_CAMBIO                              ;SI SIGUE POR AQUI ERAN DIFERENTES
BANKSEL REG_DIVISOR       ; SE GUARDA EL
MOVF REG_DIVISOR,W      ;RESULTADO DE LA CONVERSION PARA QUE NO SALTE CONTINUAMENTE
MOVWF INDF                     ;EN EL REGISTRO QUE CORRESPONDE A CADA POTENCIOMETRO
;BYTE Nº DE CONTROLADOR
CALL LECTURA_EEPROM     ;PONE EL VALOR DE LA TABLA EN W
BANKSEL REG_MUESTRA
MOVWF REG_MUESTRA    ; LO GUARDA EN REG_MUESTRA
CALL B2_BCD   ;Y EXIBE EL DATO
CALL ENVIA_TEXTO       ;POR LOS DISPLAYS
BANKSEL PUNTEROS

   ;---------------------------------------------
BSF PUNTEROS,6 ;CON ESTE PUNTERO NO SALE DEL BUCLE HASTA QUE NO SE PONGA A 0 EL BIT 6 DE PUNTERO
CALL MENU_2                    ;AQUI, AQUI¡¡ MALDITA SEA POR QUE NO SE QUEDA PILLADO PARA PODER INCREMENTAR O DECREMENTAR VARIAS VECES EL REGISTRO ARRRRRRRR
   ;---------------------------------------------
RETURN                               ;DEBERIA VOLVER A LA RUTINA TODOS_LOS_CANALES, PERO AL SALIR VA AL PROGRAMA PRINCIPAL Y TENGO QUE VOLVER AEMPEZAR PARA CAMBIAR DE VALOR OTRO REGISTRO
;----------------------------------------
que acaba en la rutina MENU_2, previamente puesto a uno el bit PUNTERO,6
Código: [Seleccionar]
MENU_2
BANKSEL N_BUTON_CON
CLRF N_BUTON_CON
                                                     ;0 ;-----------------------
CALL CARGA_PARALELO
BTFSS DATO       ;TESTEA DATO PARA CONOCER SI SE HA PULSADO EL BOTON
CALL BUTON_0               ;en esta solo vuelve por si se me ocurre que ponerle
                                                     ;1 ;-----------------------
CALL BUTTON       ;ESTA PONE EN DATO EL Nº DEL BOTON
BTFSS DATO
CALL REG_DOWN     ;DECREMENTA EL Nº DE CANAL
                                                     ;2 ;-----------------------
CALL BUTTON       ;ESTA PONE EN DATO EL Nº DEL BOTON
BTFSS DATO
CALL REG_UP                ;AUMENTA EL Nº DE CANAL
                                                     ;3 ;-----------------------
CALL BUTTON       ;ESTA PONE EN DATO EL Nº DEL BOTON
BTFSS DATO
NOP                                ;por si se me ocurre que ponerle
                                                      ;4 ;-----------------------
CALL BUTTON       ;ESTA PONE EN DATO EL Nº DEL BOTON
BTFSS DATO
NOP                                ;por si se me ocurre que ponerle
                                                      ;5 ;-----------------------
CALL BUTTON
BTFSS DATO
NOP                                ;por si se me ocurre que ponerle
                                                     ;6 ;-----------------------
CALL BUTTON       ;ESTA PONE EN DATO EL Nº DEL BOTON
BTFSS DATO
CALL SALE_DEL_MENU   ;RUTINA QUE SALE DEL MENU, EL POTENCIOMETRO TIENE UNA NUEVA DIRECCION ASIGNADA
                                                     ;7 ;-----------------------
CALL BUTTON       ;ESTA PONE EN DATO EL Nº DEL BOTON
BTFSS DATO
NOP
                                             ;-----------------------
BTFSC PUNTEROS,6
GOTO MENU_2
RETURN
;-------------------------------
ahora os muestro las rutinas de cada boton, ya solo queda esto. en cada una de ellas pongo el bit PUNTERO,6 a uno para que no salga del menu por si quiero inc ó dec el registro varias veces, solo pongo el bit 6 a cero para que salga del bucle en el boton 6 :shock: pero aun así cuando pulso uno de los otros botones no solo sale del bucle de este menu, si no que sale del anterior bucle, en el que se testean los CAD y vuelve al programa principal con normalidad  :shock:
Código: [Seleccionar]
SALE_DEL_MENU
CALL DEMORA_20MS
CALL RECARGA2
BTFSC DATO
RETURN
CLRW
CALL B2_BCD
CALL ENVIA_TEXTO
BCF PUNTEROS,6 ;LO PONE A CERO PARA SALIR DEL BUCLE PAIM_2
CALL SUELTA_TECLA
RETURN

REG_DOWN
CALL DEMORA_20MS
CALL RECARGA2
BTFSC DATO
RETURN
CALL LECTURA_EEPROM
BANKSEL REG_MUESTRA
MOVWF REG_MUESTRA
DECF REG_MUESTRA,F ;DECREMENTA EL REGISTRO CONTINUAMENTE
BTFSC REG_MUESTRA,7
GOTO PONE_A_CERO
CONTINUA_DOWN
CALL ESCRITURA_EEPROM ;Y GUARDA NUEVO VALOR EN LA TABLA
MOVF REG_MUESTRA,W
CALL B2_BCD
CALL ENVIA_TEXTO ;LO MUESTRA POR LOS DISPLAYS
CALL SUELTA_TECLA
BSF PUNTEROS,6 ;LO PONE A UNO PARA NO SALIR DEL BUCLE, AUN ASI LO HACE
RETURN
PONE_A_CERO
MOVLW B'01111111'
MOVWF REG_MUESTRA
GOTO CONTINUA_DOWN

REG_UP
CALL DEMORA_20MS
CALL RECARGA2
BTFSC DATO
RETURN
CALL LECTURA_EEPROM
MOVWF REG_MUESTRA
INCF REG_MUESTRA,F ;DECREMENTA EL REGISTRO CONTINUAMENTE
BTFSC REG_MUESTRA,7
GOTO PONE_128
CONTINUA_UP
CALL ESCRITURA_EEPROM     ;Y GUARDA NUEVO VALOR EN LA TABLA
MOVF REG_MUESTRA,W
CALL B2_BCD
CALL ENVIA_TEXTO ;LO MUESTRA POR LOS DISPLAYS
CALL SUELTA_TECLA
BSF PUNTEROS,6   ;LO PONE A UNO PARA NO SALIR DEL BUCLE, AUN ASI LO HACE
RETURN
PONE_128
CLRF REG_MUESTRA
GOTO CONTINUA_UP
puedo subir las rutinas a las que se les llama desde estas, lo unico que puedo decir es que funcionan las rutinas del teclado, usease que cuando pulsas un boton es ese y no otro. y aparte de no quedarse en el loop esperando a pulsar la tecla incf o decf cambia el valor en la tabla de la eeprom y vuelve al programa principal con normalidad sin confundir nº de potenciometro o de los demas pulsadores, de verdad le he dado muchas vueltas a como hacerlo, pero se me han acabado las ideas  :( teneis alguna de como hacerlo

un saludo y gracias
« Última modificación: 20 de Enero de 2008, 16:07:09 por alogic.on »

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: menu con pulsadores y vuelveme loco
« Respuesta #1 en: 19 de Enero de 2008, 17:19:51 »
Hola alogic. Me estoy volviendo loco tratando de entender el programa, ya que la columna 2 y 3 están juntas. Desde que entré, 32 personas an visto este hilo pero no comentaron nada porque de seguro les pasa lo mismo que a mi.

Edita el mensaje para separar la columna 2 y 3 a y la 4 también.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: menu con pulsadores y vuelveme loco
« Respuesta #2 en: 19 de Enero de 2008, 18:07:06 »
 hola, perdonadme pero ahora si que me he quedado  :shock: a que te refieres con las columnas?? cambio y explico hasta que me quede sin aliento, me estoy viendo con cara de tonto :D
no se si ayudará pero os dejo el programa adjunto, que siempre sera mas amigable en el mplab.  no le hagais mucho caso a la simulacion de proteus, en esta si hace el recorrido del menu, cosa que no sucede sobre el circuito.

un saludo y gracias
« Última modificación: 20 de Enero de 2008, 22:59:43 por alogic.on »

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: menu con pulsadores y vuelveme loco
« Respuesta #3 en: 19 de Enero de 2008, 19:49:09 »
El programa assembler se divide por columnas. La primer columna se llama etiquetas, la segunda columna va la operación a realizar, la tercera columna va el registro a modificar, y la cuarta columna se usa como un comentario y no lo usa el esamblador, va siempre con ; y acontinuación el comentario

A modo de ejemplo:

1° columna           2° columna        3°columna       4°columna

menu                    btfsc                 temp,0            ;¿es 0 el bit 0 de temp?
                            goto                  menu              ;no, voy a menu
                            bcf                    temp,1            ;si, pongo a 0 el bit 1 de temp

Chequeo el programa y te digo.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: menu con pulsadores y vuelveme loco
« Respuesta #4 en: 20 de Enero de 2008, 15:55:18 »
hola y gracias, ya sabia yo iba aser una tonterida, pero intentare ser mas ordenado pues ya es dificil entender algo que ha escrito otro como para encima enguarrinarlo mas  :?
respecto al programa creo que es cosa de que se come mas niveles de la pila de los que tiene, pero vuelve al programa principal :shock: seguire dandole vueltas a ver si encuentro la solucion

un saludo y gracias

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: menu con pulsadores y vuelveme loco
« Respuesta #5 en: 20 de Enero de 2008, 18:58:50 »
Bueno, creo que encontre tu problema, Al menos tengo dos.

1: no coincide el programa que subiste en el primer post con el que adjuntaste en el segundo.

2: En la rutina enter menu hay un goto fijate

Código: ASM
  1. ENTER_MENU
  2.                 CALL    DEMORA_20MS                     ;DEMORA ANTIREBOTES
  3.                 CALL    RECARGA2                        ;PONE LA ENTRADA DEL REGISTRO SELECCIONADA EN DATO
  4.                 BTFSC   DATO                            ;TESTEA SI SIGUE A NIVEL BAJO SALTA
  5.                 RETURN                                          ;SI NO FUE UN REBOTE
  6.                 CLRW
  7.                 CALL    B2_BCD
  8.                 CALL    ENVIA_TEXTO                     ;SACA UN CERO POR LOS DISPLAYS
  9.                 CALL    SUELTA_TECLA            ;HASTA QUE NO SE SUELTE NO CONTINUA EL PROGRAMA
  10.         ;-----------
  11.                
  12.                 BSF             PUNTEROS,7                      ;LO PONE A UNO PARA QUE HAGA LOOPS TESTEANDO LOS POTES
  13.  
  14. PAIM
  15.                 CALL    TODOS_LOS_CANALES_T ;TESTEA LA MATRIZ DE POTES HASTA QUE UNO CAMBIA, LO MUESTRA POR EL DISPLAY  
  16.                 BTFSC   PUNTEROS,7
  17.                 GOTO    PAIM
  18.         ;---------------
  19.                 BANKSEL N_BUTON_CON                     ;SALVADO DE LA DIRECCION DEL TECLADO
  20.                 MOVLW   .6
  21.                 MOVWF   N_BUTON_CON
  22.                 GOTO    MENU_0_B7

está justo en la última línea. Bien, esto te lleva aquí

Código: ASM
  1. MENU_0_B7
  2.                 CALL    TECLA
  3.         ;-----------------------
  4.                 RETURN

Aquí tenemos un call que nos lleva a aquí

Código: ASM
  1. TECLA
  2.                 BANKSEL N_BUTON_CON
  3.                 INCF    N_BUTON_CON,F
  4.                 CALL    RECARGA2        ;PONE EL Nº DE BOTON EN LA PUERTA DATO
  5.                 BTFSC   DATO            ;TESTEA EL PIN DATO
  6.                 RETURN                          ;SI ESTA ALTO VUELVE AL PROGRAMA
  7.                 CALL    DEMORA_20MS     ;SI ESTABA BAJO, SALTÓ
  8.                 CALL    RECARGA2        ;PONE EL Nº DE BOTON EN LA PUERTA DATO
  9.                 BTFSC   DATO
  10.                 RETURN

que retornamos a MENU_0_B7

Código: ASM
  1. MENU_0_B7
  2.                 CALL    TECLA
  3.         ;-----------------------
  4.                 RETURN

Retornamos justo en el return y ¿a donde vamos? justo por debajo del call que nos llevó a Enter menu, pero no hay ningún call enter menu, solo hay un goto enter menu por lo que la pila está vacía o mejor dicho cargado con la dirección 0X00. Deras solucionar esto.

Espero novedades.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: menu con pulsadores y vuelveme loco
« Respuesta #6 en: 20 de Enero de 2008, 22:23:18 »
de momento pocas novedades solo que estoy intentando ordenar el codigo  :? mientras puse un post y otro modifique el programa por eso no son iguales cuando empece el post utilizaba un puñao de calls anidadas unas dentro de otras pero he cambiado por goto´s para no gastar la pila, total siempre vuelven al mismo punto , y seguramente se me haya escapado algun goto que deje la pila seca pero al principio era al contrario aun asi no he conseguido hacer el paso de leer y escribir en la eeprom dos veces seguidas sale de ese bucle del programa y cuando miro el valor de la eeprom la ha modificado  :? que es uno de los ultimos pasos
a lo mejor me confundo pero eso justo creo esta bien ENTER_MENU vuelve antes de la call TECLA y lo siguiente es un return. MENU es una call que llama el programa principal que esta en el asm y no en la oja de rutinas
Código: ASM
  1. ;6      ;-----------------------
  2.                 CALL    BUTTON
  3.                 BTFSS   DATO
  4.                 GOTO    ENTER_MENU          ;VA A LA DIRECCION ENTER_MENU
  5. ;7      ;-----------------------
  6. MENU_0_B7                                       ;Y CUANDO TERMINA VUELVE AQUI CON EL GOTO MENU_0_B7
  7.                 CALL    TECLA                    ;HACE LA RUTINA TECLA
  8.         ;-----------------------             ;Y TERMIINA EN LA SIGUIENTE  
  9.                 RETURN                             ;RETORNA AL PROGRAMA PRINCIPAL QUE ESTA EN EL .ASM

pero pero mira eso en la 4 linea de ENTER_MENU si da un falso rebote hay puesto un RETURN y no un goto MENU_0_B7 lo que ya deja un nivel de la pila seco  :? :?
Código: ASM
  1. ENTER_MENU
  2.                 CALL    DEMORA_20MS                     ;DEMORA ANTIREBOTES
  3.                 CALL    RECARGA2                        ;PONE LA ENTRADA DEL REGISTRO SELECCIONADA EN DATO
  4.                 BTFSC   DATO                            ;TESTEA SI SIGUE A NIVEL BAJO SALTA
  5.                 RETURN                                  ;SI NO FUE UN REBOTE
  6.                 CLRW
voy a seguir revisando el programa pasito a pasito a ver en donde la he cagado. entonces como menu mas menos esta bien  8) es el primero que hago y no se si vosotros lo hariais de otra forma para pillar el programa esperando a que pulse uno u otro boton

un saludo y gracias
« Última modificación: 20 de Enero de 2008, 23:04:00 por alogic.on »

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: menu con pulsadores y vuelveme loco
« Respuesta #7 en: 22 de Enero de 2008, 08:58:51 »
hola
aqui estoy, feliz como un niño  :mrgreen: localice por fin la maldita linea que hacia volver al principio del programa, estaba en la rutina de ESCRITURA_EEPROM al final de la rutina, esta, habilitaba las interrupciones, que como para modificar el programa las deshabilité para centrarme en el menu se me habia pasado, y nos a jodio que volvia al principio del programa, dicen que no hay mal que por bien no venga y que de todo se aprende ¡¡¡maldita linea¡¡¡ pero ya está, ahora desde el circuito puedo modificar las tablas de la eeprom y con lo sucedido he aprendido a que tengo que colocar mejor el programa :?(gracias Leon Pic) el orden es algo muy importante si quieres ahorrar gran parte de trabajo, y ademas a no anidar tantas calls que consumen niveles de pila, ahora una vez conseguido esto ya solo queda incorporarlo al programa original aunque sea a martillassos

un saludo y gracias

P.D. ya que usé este post para mencionar como utilizar reg de desplazamiento como un teclado ahora os cuelgo unas rutinitas para manejar un teclado matricial de X columnas por X lineas utilizando registros de desplazamiento, que con solo seis pines del pic podemos poner el teclado matricial que necesitemos 

Código: ASM
  1. CBLOCK  0X20
  2.                         COLUMNAS
  3.                         N_BUTTON
  4.                         N_BUTTON_CON
  5.                         N_VECES
  6.                         PDel0
  7.                         PDel1
  8.                         CARGADOR
  9.                         ENDC
  10.  
  11. ;CONEXIONES DE LOS REGISTROS DEL TECLADO_MATRICIAL XxX
  12. ;###########################################                           
  13. #DEFINE         SR_IN           PORTB,1
  14. #DEFINE         SR_OUT          PORTB,2
  15. #DEFINE         CLOCK_IN        PORTB,3
  16. #DEFINE         LATCH_OUT       PORTB,4
  17. #DEFINE         CLOCK_OUT       PORTB,5
  18. #DEFINE         LATCH_IN        PORTB,6
  19. ;###########################################
  20. #DEFINE         NUMERO_DE_ENTRADAS      .8                              ;Nº DE PULSADORES CONCTADOS A LAS IN PARALELO DE LOS 74165
  21. #DEFINE         NUM_COLUMNAS            B'11111101'             ;SECUENCIA A CARGAR EN LOS REGISTROS 74595 COLUMNAS DE TECLADO
  22. #DEFINE         NUM_VECES               .9                              ;Nº+1 DE VECES QUE TIENE QUE CAMBIAR DE COLUMNA
  23. ;DEFINIENDO ESTOS VALORES SE PUEDEN USAR TECLADOS MATRICIALES DE 3x2, 4x4 CADA UNO QUE PONGA EL QUE NECESITE

Código: ASM
  1. PULSADORES_MATRIZ_CON_REGISTROS MACRO
  2. TECLADO_MAT
  3.                 BANKSEL         COLUMNAS
  4.                 MOVLW           NUM_COLUMNAS            ;Nº DE COLUMNAS
  5.                 MOVWF           COLUMNAS
  6.                 MOVLW           NUM_VECES
  7.                 MOVWF           N_VECES
  8. TECLADO
  9.                 DECFSZ          N_VECES,F
  10.                 GOTO            STREEP
  11.                 RETURN                                                  ;VUELVE_CUANDO SE ACABA EL Nº DE SALIDAS
  12. STREEP
  13.                 BSF                     STATUS,C                       
  14.                 RRF                     COLUMNAS,F
  15.                 BTFSC           COLUMNAS,0
  16.                 GOTO            SACA_UNO
  17. SACA_CERO
  18.                 BANKSEL         PORTD
  19.                 BCF                     SR_OUT
  20.                 NOP
  21.                 NOP
  22.                 CALL            SIGUIENTE_CLOCK_OUT
  23.                 GOTO            COMPRUEBA
  24. SACA_UNO
  25.                 BANKSEL         PORTD
  26.                 BSF                     SR_OUT
  27.                 NOP
  28.                 NOP
  29.                 CALL            SIGUIENTE_CLOCK_OUT
  30.                 GOTO            COMPRUEBA              
  31.         ;---------------------------------     
  32. COMPRUEBA
  33.                 BANKSEL         N_BUTTON
  34.                 MOVLW           NUMERO_DE_ENTRADAS      ;segun el nº de registros de desplazamiento
  35.                 MOVWF           N_BUTTON
  36. DESCONTANDO_BUTTON
  37.                 DECFSZ          N_BUTTON,F                      ;VA DESCONTANDO Y TESTEANDO
  38.                 GOTO            MENOS_UNO                       ; HASTA QUE LLEGA A CERO,O
  39.                 GOTO            TECLADO                         ;QUE SALTE A LA SIGUIETE COLUMNA
  40. MENOS_UNO
  41.                 CALL            RECARGA                         ;PONE EL DATO EN LA ENTRADA SR_IN
  42.                 BTFSC           SR_IN                           ;SI CONTINUA A CERO LA ENTRADA ESTA PULSADO Y EL PROGAMA SALTA
  43.                 GOTO            DESCONTANDO_BUTTON      ;SI NO PASA AL SIGUIENTE BOTON 
  44. BOTON_PULSADO
  45.                 CALL            DEMORA_5MS                      ;SI FUE PULSADO HACE UNA PAUSA
  46.                 CALL            RECARGA                         ;PONE EL DATO EN LA SR_IN
  47.                 BTFSC           SR_IN                           ;Y VUELVE A COMPROBAR
  48.                 GOTO            DESCONTANDO_BUTTON      ;SI ESTA EN ALTO HUBO REBOTE Y VUELVE PARA SEGUIR PASANDO ENTRADAS DEL CARRIL
  49.                 CALL            SELECCION                       ;ESTABA A NIVEL BAJO, SE GUARDA EN W EL VALOR DE LAS TABLAS
  50. ESPERA_UP
  51.                 CALL            RECARGA
  52.                 BTFSS           SR_IN
  53.                 GOTO            ESPERA_UP                       ;espera a que se levante el pulsador
  54.                 GOTO            DESCONTANDO_BUTTON      ;Y VUELVE HASTA LLEGAR A CERO QUE PASA A BUSCAR LA SIGUIENTE COLUMNA
  55.         ;-----------------------------------
  56. ;SE PODRIA PONER UNA DE LAS TABLAS CON GOTOS A MENUS SUB-INTERNOS PARA HACER MODIFICACIONES
  57. SELECCION
  58.                 MOVF            N_VECES,W                       ;SI ESTABA A 0 HACE UNA SELECCION PARA CONOCER QUE BOTON HA SIDO PULSADO
  59.                 BANKSEL         PCL
  60.                 ADDWF           PCL,F                           ;CON EL Nº DE COLUMNA
  61.                 GOTO            TABLA1
  62.                 GOTO            TABLA2
  63.                 GOTO            TABLA3
  64.                 GOTO            TABLA4
  65.                 GOTO            TABLA5
  66.                 GOTO            TABLA6
  67.                 GOTO            TABLA7
  68.                 GOTO            TABLA8
  69.                 GOTO            TABLA9
  70.                 GOTO            TABLA10        
  71.  
  72. TABLA1
  73.                 CALL            SUMA_N_BUTTON           ;Y CON EL Nº DE BOTON VUELVE CON UN VALOR DIFERENTE
  74.                 ADDWF           PCL,F                           ;SEGUN EN QUE TABLA
  75.         DT      .1,.2,.3,.4,.5,.6,.7,.8,.9
  76. TABLA2
  77.                 CALL            SUMA_N_BUTTON
  78.                 ADDWF           PCL,F
  79.         DT      .10,.11,.12,.13,.14,.15,.16,.17
  80. TABLA3
  81.                 CALL            SUMA_N_BUTTON
  82.                 ADDWF           PCL,F
  83.         DT      .18,.19,.20,.21,.22,.23,.24,.25
  84. TABLA4
  85.                 CALL            SUMA_N_BUTTON
  86.                 ADDWF           PCL,F
  87.         DT      .26,.27,.28,.29,.30,.31,.32,.33
  88. TABLA5
  89.                 CALL            SUMA_N_BUTTON
  90.                 ADDWF           PCL,F
  91.         DT      .34,.35,.36,.37,.38,.39,.40,.41
  92. TABLA6
  93.                 CALL            SUMA_N_BUTTON           ;Y CON EL Nº DE BOTON VUELVE CON UN VALOR DIFERENTE
  94.                 ADDWF           PCL,F                           ;SEGUN EN QUE TABLA
  95.         DT      .1,.2,.3,.4,.5,.6,.7,.8,.9
  96. TABLA7
  97.                 CALL            SUMA_N_BUTTON
  98.                 ADDWF           PCL,F
  99.         DT      .10,.11,.12,.13,.14,.15,.16,.17
  100. TABLA8
  101.                 CALL            SUMA_N_BUTTON
  102.                 ADDWF           PCL,F
  103.         DT      .18,.19,.20,.21,.22,.23,.24,.25
  104. TABLA9
  105.                 CALL            SUMA_N_BUTTON
  106.                 ADDWF           PCL,F
  107.         DT      .26,.27,.28,.29,.30,.31,.32,.33
  108. TABLA10
  109.                 CALL            SUMA_N_BUTTON
  110.                 ADDWF           PCL,F
  111.         DT      .34,.35,.36,.37,.38,.39,.40,.41
  112. SUMA_N_BUTTON
  113.                 BANKSEL         N_BUTTON
  114.                 MOVF            N_BUTTON,W
  115.                 BANKSEL         PCL    
  116.                 RETURN 
  117.         ;----------------------------------
  118.  
  119.  
  120. RECARGA
  121.                 BANKSEL N_BUTTON
  122.                 MOVF    N_BUTTON,W                              ;INDICA EL Nº DE BOTON
  123.                 MOVWF   N_BUTTON_CON                    ;-AL QUE SE QUIERE ACCEDER
  124.                 CALL    LATCHIN                                 ;-PONE LOS DATOS EN EL CARRIL SERIE
  125. MENOS_1                                                                
  126.                 BCF             CLOCK_IN                               
  127.                 NOP
  128.                 NOP
  129.                 NOP
  130.                 NOP
  131.                 BSF             CLOCK_IN
  132.                 NOP
  133.                 NOP
  134. DESCUENTA_3
  135.                 DECFSZ  N_BUTTON_CON,F                  ;Y DECREMENTA
  136.                 GOTO    MENOS_1                                 ;-PONIENDO UN DATO TRAS OTRO DEL CARRIL DE LOS REGISTROS EN LA SR_IN
  137.                 RETURN                                                  ;HASTA QUE LLEGA A CERO
  138.  
  139.         ;----------------------------------    
  140. SIGUIENTE_CLOCK_OUT
  141.                 BCF                     CLOCK_OUT
  142.                 NOP
  143.                 NOP
  144.                 BSF                     CLOCK_OUT
  145.                 NOP
  146.                 NOP
  147.                 CALL            LATCHOUT
  148.                 RETURN
  149.         ;-----------------------------------           
  150. LATCHOUT
  151.                 BSF                     LATCH_OUT
  152.                 NOP
  153.                 NOP
  154.                 BCF                     LATCH_OUT
  155.                 NOP
  156.                 NOP
  157.                 RETURN 
  158.         ;-----------------------------------
  159. LATCHIN
  160.                 BSF                     LATCH_IN
  161.                 NOP
  162.                 NOP
  163.                 NOP
  164.                 NOP
  165.                 BCF                     LATCH_IN
  166.                 NOP
  167.                 NOP
  168.                 RETURN
  169. ;-------------------------------------------------------------
  170. ; Generado con PDEL ver SP  r 1.0  el 22/06/2008 Hs 13:26:24
  171. ; Descripcion: Delay 25000 ciclos
  172. ;-------------------------------------------------------------
  173. DEMORA_5MS  movlw     .44       ; 1 set numero de repeticion  (B)
  174.         movwf     PDel0     ; 1 |
  175. PLoop1  movlw     .141      ; 1 set numero de repeticion  (A)
  176.         movwf     PDel1     ; 1 |
  177. PLoop2  clrwdt              ; 1 clear watchdog
  178.         decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
  179.         goto      PLoop2    ; 2 no, loop
  180.         decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
  181.         goto      PLoop1    ; 2 no, loop
  182. PDelL1  goto PDelL2         ; 2 ciclos delay
  183. PDelL2  clrwdt              ; 1 ciclo delay
  184.         return              ; 2+2 Fin.
  185. ;-------------------------------------------------------------
  186.                 ENDM
« Última modificación: 26 de Junio de 2008, 15:49:42 por alogic.on »

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: menu con pulsadores y vuelveme loco
« Respuesta #8 en: 22 de Enero de 2008, 09:22:14 »
 :-/ :-/ :-/ :-/ Bravo Fito  :-/ :-/ :-/ :-/ me alegro muchos :-/ :-/
por fin lo lograste  :-/ :-/ :-/ :-/