TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Moisés Sánchez en 26 de Junio de 2019, 20:37:43
-
Buenas tardes. Llevo varios días diseñando un programa para hacer que 4 displays muestren mi fecha de cumpleaños en los siguientes formatos: Día/mes mes/año
El funcionamiento en protoboard debe ser que muestre un formato u otro cambiándolo con un push button. El problema es que cuando presiono el push, va cambiando entre un formato y otro bastante rápido, de tal forma que se queda en el formato en que se deja de presionar el push.
¿Cómo puedo solucionarlo?
Estoy usando un PIC16F8A en lenguaje ensamblador.
Dejo mi código aquí:
;Etiquetas Directivas Variables Comentarios
#include P16F84A.INC
LIST P=16F84A
RADIX HEX
__config _XT_OSC & _WDT_OFF & _PWRTE_ON
;area de declarar registros
num1 EQU 0x0C ;2
num2 EQU 0x0D ;1
num3 EQU 0x0E ;0
num4 EQU 0x0F ;7
cblock 0x12
endc
;cabecera de datos
org 0
;Cuerpo del programa
INICIO bsf STATUS, 0x05
movlw 0x10
movwf TRISA
clrf TRISB
bcf STATUS, 0X05
clrf num1
clrf num2
clrf num3
clrf num4
;numeros de la fecha
movlw 0x3F
movwf num1
movlw 0xFD
movwf num2
movlw 0x06
movwf num3
START
;Display1
movf num3,0
movwf PORTB
bsf PORTA,0
call DELAY1ms
bcf PORTA,0
;Display2
movf num3,0
movwf PORTB
bsf PORTA,1
call DELAY1ms
bcf PORTA,1
;Display3
movf num2,0
movwf PORTB
bsf PORTA,2
call DELAY1ms
bcf PORTA,2
;Display4
movf num1,0
movwf PORTB
bsf PORTA,3
call DELAY1ms
bcf PORTA,3
btfss PORTA,4
goto START
goto START2
START2
;DESPUES DEL BOTON
;Display1
movf num1,0
movwf PORTB
bsf TRISA,0
call DELAY1ms
bcf TRISA,0
;Display2
movf num1,0
movwf PORTB
bsf TRISA,1
call DELAY1ms
bcf TRISA,1
;Display3
movf num3,0
movwf PORTB
bsf TRISA,2
call DELAY1ms
bcf TRISA,2
;Display4
movf num3,0
movwf PORTB
bsf TRISA,3
call DELAY1ms
bcf TRISA,3
btfss PORTA,4
goto START2
goto START
;Adicionales
boton btfss PORTA,4
goto boton
goto antirebote
antirebote btfss PORTA,4
goto antirebote
goto DELAYBOTTON
DELAYBOTTON
bsf PORTA,4
call DELAYms
bcf PORTA,4
goto boton
;TIME DELAY
cblock
DELAY
DELAY2
DELAY3
endc
DELAYms
movlw 0XC8
movwf DELAY2
DELAY_Bms
movlw 0XFA
movwf DELAY
DELAY_Cms
nop
decfsz DELAY,F
goto DELAY_Cms
decfsz DELAY2,F
goto DELAY_Bms
return
cblock
DELAY1
DELAY2.1
endc
DELAY1ms
movlw 0X06
movwf DELAY2.1
DELAY_B
movlw 0XF9
movwf DELAY1
DELAY_C
nop
decfsz DELAY1,F
goto DELAY_C
decfsz DELAY2.1,F
goto DELAY_B
return
end
-
Hola, puedes aplicar al menos dos soluciones, una por hardware, es decir añadir algún filtro o FLIP-FLOP R/S(poco práctico) pero funciona, la otra alternativa es por software.
Yo utilizo el siguiente criterio.
Cuándo se pulsa un botón, comienza a incrementar una variable, que debe tener un límite máximo, para no seguir contando.
Entonces si dicho valor es > que, aplicó la acción que requiero.
Cuándo el botón se suelta, la variable vuelve a cero.
-
Una opcion es la que te dice Robert, la otra es tener una variable con un bit que podamos cambiar para poder identificar si el boton esta presionado o no.... Entonces tu programa seria algo asi:
Esta presionado el boton (boton real)?
NO -> Borro el bit de "boton presionado" en mi variable y salgo, aca es cuando detecto que salio
SI- > continuo
Esta activo el bit de "boton presionado"?
SI -> Salgo , ya que estaba en 1 antes,, eso quiere decir que se sigue presionando
NO -> continuo
Espero un ratito 10ms Se repite aca para que el delay no quede arriba y ocurra siempre
Esta presionado el boton real?
NO-> Salgo , ya que fue un rebote
SI -> continuo
Activo el bit de "boton presionado" en mi variable
Cambio la forma de mostrar
Salgo.
PD: No hay ninguna necesidad de usar BCF y BSF sobre tu entrada como lo estas haciendo.