Para ter um botão que funcione bem deve possuir um filtro para que no acionamento deste não seja executado várias vezes, uma vez que o microcontrolador trabalha em uma velocidade elevada deve-se ter um filtro de no minimo 25 milisegundos para eliminar o riple de chaveamento:
este exemplo possui funcoes de filtro para acionar e liberar e se auto-carrega o filtro, muito utilizado em minhas aplicaçoes, por ter recursos que com alguma implementação possui 4 estagios de funcionamento : ato de pressionar, agir, ato de liberar, liberado
LED_1 = MONITORA FUNCIONAMENTO DO BOTAO
LED_2 = A CADA ACIONAMENTO DO BOTAO MUDA ESTADO DA SAIDA
CBLOCK 0X20
FILTRO_BT_1 ;MEMORIA DE FILTRO PARA BOTAO_1
STATUS_BOTOES ;MEMORIA DE STATUS DOS BOTOES
ENDC
#DEFINE BOTAO_1 PORTA,0 ;DEFINE PINO QUE SERA UTILIZADO COMO BOTAO
#DEFINE STATUS_BOT_1 STATUS_BOTOES,1 ;FLAG QUE INDICA SE BOTAO ESTA PRESSIONADO
#DEFINE LED_1 PORTB,1 ;SAIDA LED_1 MONITORA QUANDO ESTA ACIONADO BOTAO OU LIBERADO
#DEFINE LED_2 PORTB,2 ;SAIDA LED_2 A CADA APERTAO NO BOTAO NUDA SEU ESTADO
;--------------------
0RG 0X00
GOTO INICIO
;--------------------
;--------------------
INICIO
;--------------------
; AQUI FAÇA CONFIGURAÇÃO INICIAL DO MICROCONTROLADOR
;--------------------
MOVLW .100
MOVWF FILTRO_BT_1
MAIN
BTFSC BOTAO_1 ;TESTA SE BOTAO ESTA PRESSIONADO
GOTO BOTAO_1_LIBERADO
BTFSC STATUS_BOT_1 ;TESTA STATUS DO BOTAO
GOTO BOTAO_1_PRESSO
DECFSZ FILTRO_BT_1,F ;DECREMENTA FILTRO DO BOTAO
GOTO PROX_ROTINA
BSF STATUS_BOT_1 ;MARCA BOTAO COMO ACIONADO
;--------------------
; AQUI OQUE FARA O BOTAO AO PRESSIONAR
BSF LED_1
CALL AGE_LED_2
;--------------------
BOTAO_1_PRESSO
MOVLW .200 ;RECOLOCA FILTRO DE BOTAO
MOVWF FILTRO_BT_1
GOTO PROX_ROTINA
BOTAO_1_LIBERADO
BTFSS STATUS_BOT_1 ;TESTA STATUS DO BOTAO
GOTO BOTAO_1_LIVRE
DECFSZ FILTRO_BT_1,F ;DECREMENTA FILTRO DO BOTAO
GOTO PROX_ROTINA
BCF STATUS_BOT_1
;--------------------
; AQUI OQUE FARA O BOTAO AO LIBERAR
BCF LED_1
;--------------------
BOTAO_1_LIVRE
MOVLW .100 ;REPOE FILTRO DE BOTAO
MOVWF FILTRO_BT_1
GOTO PROX_ROTINA
PROX_ROTINA
GOTO MAIN
;--------------------
;--------------------
; SUB ROTINA MUDA ESTADO DE LED_2
;--------------------
AGE_LED_2
BTFSC LED_2 ;TESTA LED_2 ESTA APAGADO ?
GOTO DESL_LED_2
BSF LED_2 ;SIM ENTAO, LIGA E RETORNA
RETURN
DESL_LED_2 ;ESTA ACESO, DESLIGA E RETORNA
BCF LED_2
RETURN
;--------------------
END