hola buenas tardes es mi primer programa que realizo y ya sale todo bien pero quiero meterle un dalay en el boton que estoy usando ya que me detecta como 4 pulsaciones cuando solo lo pulso una vez y quisiera que con cada pulso tardara 1segundo en detectar el otro y asi evitar varias pulsaciones alguien me puede ayudar en como meterle las pulsaciones? mi proyecto consta de un contador que funciona con un boton(pushbotton) cuanta del 1 al 999 con 3 displays de anodo comun y un pic 4f887 que cuando deja de ser utilizado se pone en modo suspencion y se recetea para cuando detecta otro pulso enciende eh inicia la cuenta desde cero mi codigo es el siguiente:
include P16F887.INC
__CONFIG _CONFIG1, _FOSC_INTRC_NOCLKOUT & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF
__CONFIG _CONFIG2, _WRT_OFF & _BOR4V_BOR21V
CBLOCK 0x020
CENTENAS
DECENAS
UNIDADES
TIEMPO
TIEMPO_M
BANDERA_TMP
W_TEMP
STATUS_TEMP
ENDC
#DEFINE BOTON PORTA,4; AQUI PUEDES CAMBIAR EL BIT Y PUERTO QUE QUIERAS QUE SEA EL BOTON SIN NECESIDAD DE CAMBIAR EN TODO EL PROGRAMA
ORG 0x00
GOTO INICIO
ORG 0X04
;=================================
; INTERRUPCIONES
;=================================
INT_SUB:
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
BCF INTCON, T0IF
INCF TIEMPO,F
MOVFW TIEMPO
XORLW .153 ;TIEMPO PARA 10seg, lo necesitamos 6 veces mas para completar el minuto
BTFSS STATUS, Z
GOTO FIN_INTE
TERMINO_TMP
CLRF TIEMPO
INCF TIEMPO_M,F
MOVFW TIEMPO_M
XORLW .6 ;TESTEAMOS SI YA VAN 6 VECES DE 10 SEGUNDOS
BTFSS STATUS,Z
GOTO FIN_INTE
TERMINO_MINUTO
BSF BANDERA_TMP,0
CLRF TIEMPO
CLRF TIEMPO_M
FIN_INTE:
BSF INTCON, GIE
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
;=================================
; TABLAS
;=================================
;Con display de anodo comun, EL BIT7 ES EL PUNTO DEL DISPLAY
BIN2SEVEN_SEG
ANDLW B'00001111'
ADDWF PCL,F
RETLW B'11000000' ;'0'
RETLW B'11111001' ;'1'
RETLW B'10100100' ;'2'
RETLW B'10110000' ;'3'
RETLW B'10011001' ;'4'
RETLW B'10010010' ;'5'
RETLW B'10000010' ;'6'
RETLW B'11111000' ;'7'
RETLW B'10000000' ;'8'
RETLW B'10011000' ;'9'
RETLW B'10001000' ;'A'
RETLW B'10000011' ;'B'
RETLW B'11000110' ;'C'
RETLW B'10100001' ;'D'
;;Con display de catodo comun, EL BIT0 ES EL PUNTO DEL DISPLAY
;BIN2SEVEN_SEG
; ANDLW B'00001111'
; ADDWF PCL,F
; RETLW B'01111110' ;'0'
; RETLW B'00001100' ;'1'
; RETLW B'10110110' ;'2'
; RETLW B'10011110' ;'3'
; RETLW B'11001100' ;'4'
; RETLW B'11011010' ;'5'
; RETLW B'11111010' ;'6'
; RETLW B'00001110' ;'7'
; RETLW B'11111110' ;'8'
; RETLW B'11001110' ;'9'
; RETLW B'11101110' ;'A'
; RETLW B'11111000' ;'B'
; RETLW B'01110010' ;'C'
; RETLW B'10111100' ;'D'
;=================
; CONFIG
;=================
INICIO
Banksel PORTA
CLRF PORTA
CLRF PORTB
BANKSEL ANSEL
CLRF ANSEL
CLRF ANSELH
BANKSEL TRISB;ENTRADAS Y SALIDAS
CLRF PORTB
CLRF PORTC
CLRF PORTD
; CLRF PORTA
BSF BOTON
BANKSEL OPTION_REG
MOVLW b'11000111';OSC INTERNO, PREESCALER 1:256= 65.5 mS cada sobreflujo del TMR para que sean 10 segundos necesitamos que sea 153*65.5mS
MOVWF OPTION_REG
BANKSEL INTCON; HABILITACION DE LA INTERRUPCION DEL TMR0
BSF INTCON, T0IE
BSF INTCON, PEIE
BCF INTCON, GIE ;AUN NO ENCENDEMOS LA INTERRUPCION
BANKSEL PORTA
CLRF TIEMPO
CLRF BANDERA_TMP
;========================
; PROGRAMA PRINCIPAL
;=======================
RESETEO:;AQUI VA A REGRESAR CADA VEZ QUE PASEN LOS 10 SEGUNDOS
BCF INTCON, GIE
CLRF TIEMPO
CLRF TIEMPO_M
CLRF BANDERA_TMP
CLRF UNIDADES
CLRF DECENAS
CLRF CENTENAS
; CLRF PORTA
MOVLW 0XFF
MOVWF PORTB
MOVWF PORTC
MOVWF PORTD
TESTEO_BOTON:
BTFSS BOTON
GOTO TESTEO_BOTON
BTFSC BOTON
GOTO $-1; ESTA INSTRUCCION ES COMO UN GOTO A LA INSTRUCCION ANTERIOR -1
MOVLW 0X00 ;PARA ASEGURAR CEROS AL INICIO
CALL BIN2SEVEN_SEG
; MOVWF PORTA
MOVWF PORTB
MOVWF PORTC
MOVWF PORTD
INICIA_CUENTA:
INC_UNI:
MOVFW UNIDADES
XORLW .9
BTFSS STATUS,Z
GOTO INC_UNI2
CLRF UNIDADES
MOVF UNIDADES,W
CALL BIN2SEVEN_SEG
MOVWF PORTD
GOTO INC_DEC
INC_UNI2:
INCF UNIDADES, F
MOVFW UNIDADES
CALL BIN2SEVEN_SEG
MOVWF PORTD
GOTO FIN_CUENTA
;------------------------
INC_DEC:
MOVFW DECENAS
XORLW .9
BTFSS STATUS,Z
GOTO INC_DEC2
CLRF DECENAS
MOVF DECENAS,W
CALL BIN2SEVEN_SEG
MOVWF PORTC
GOTO INC_CENT
INC_DEC2:
INCF DECENAS, F
MOVFW DECENAS
CALL BIN2SEVEN_SEG
MOVWF PORTC
GOTO FIN_CUENTA
;------------------------
INC_CENT:
MOVFW CENTENAS
XORLW .9
BTFSS STATUS,Z
GOTO INC_CENT2
CLRF CENTENAS
MOVF CENTENAS,W
CALL BIN2SEVEN_SEG
MOVWF PORTB
GOTO INC_UNI
INC_CENT2:
INCF CENTENAS,F
MOVFW CENTENAS
CALL BIN2SEVEN_SEG
MOVWF PORTB
;--------------------------
FIN_CUENTA:
CLRF TMR0
BSF INTCON,GIE; EMPIEZA A CONTAR TMR0
ESPERA2:
BTFSC BANDERA_TMP,0
GOTO RESETEO
BTFSS BOTON
GOTO ESPERA2
BTFSC BOTON
GOTO $-1
BCF INTCON, GIE
CLRF TIEMPO
CLRF TIEMPO_M
CLRF BANDERA_TMP
GOTO INICIA_CUENTA
END