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
;-----------------------
RETURNel 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 :?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_TTODOS_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 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,6MENU_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: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