; *************************************************************************** ; * TECLADO AD * ; * * ; * ALESSANDRO FERREIRA DA CUNHA * ; * * ; *************************************************************************** ; * DATA: 25/12/2006 - ELETRÔNICA TOTAL * * ; *************************************************************************** ; *************************************************************************** ; * DESCRIÇÃO GERAL * ; *************************************************************************** ; SOFTWARE QUE FAZ A LEITURA DO TECLADO AD ; ; *************************************************************************** ; * CONFIGURAÇÕES PARA GRAVAÇÃO * ; *************************************************************************** __CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_ON & _XT_OSC #INCLUDE ; MICROCONTROLADOR UTILIZADO ; *************************************************************************** ; * VARIÁVEIS * ; *************************************************************************** CBLOCK 0X70 ; POSIÇÃO COMUM DA MEMÓRIA RAM TESTE ; VALOR CONVERTIDO PELO A/D SERÁ TESTADO NESTE REGISTRADOR CONTADOR ; REGISTRADOR QUE FAZ O DEBOUNCING DO TECLADO TECLA_LOW ; VALOR OBTIDO DO CONVERSOR A/D - PARTE BAIXA TECLA_HIGH ; VALOR OBTIDO DO CONVERSOR A/D - PARTE ALTA TECLA_FIM ; VALOR FINAL DA TECLA JÁ SELECIONADO ENDC ; *************************************************************************** ; * BANCOS DE RAM * ; *************************************************************************** #DEFINE BANCO1 BSF STATUS,RP0 ; SELECIONA O BANCO 1 DA MEMORIA RAM #DEFINE BANCO0 BCF STATUS,RP0 ; SELECIONA O BANCO 0 DA MEMORIA RAM ; *************************************************************************** ; * CONSTANTES INTERNAS * ; *************************************************************************** ; ESTE PROGRAMA NÃO UTILIZA NENHUMA CONSTANTE. ; *************************************************************************** ; * FLAGs DE SOFTWARE * ; *************************************************************************** ; ESTE PROGRAMA NÃO UTILIZA NENHUM FLAG DE USUÁRIO ; *************************************************************************** ; * ENTRADAS * ; *************************************************************************** ; *************************************************************************** ; * SAÍDAS * ; *************************************************************************** ; *************************************************************************** ; * VETOR DE RESET DO MICROCONTROLADOR * ; *************************************************************************** ORG 0X0000 ; ENDEREÇO DO VETOR DE RESET GOTO INICIO ; PULA PARA O INCIO DO PROGRAMA E FAZ AS ; CONFIGURAÇÕES DE HARDWARE ; *************************************************************************** ; * VETOR DE INTERRUPÇÃO DO MICROCONTROLADOR * ; *************************************************************************** ORG 0X0004 ; ENDEREÇO DO VETOR DE INTERRUPÇÃO RETFIE ; *************************************************************************** ; * SUBROTINAS * ; *************************************************************************** ; ************* CONVERSÃO BINÁRIO DISPLAY DE 7 SEGMENTOS ***************** CONVERTE ANDLW B'00001111' ;MASCARA VALOR DE CONTADOR CONSIDERAR SOMENTE ATÉ 15 ADDWF PCL,F RETLW B'11101110' ; 00 - RETORNA 0 RETLW B'00101000' ; 01 - RETORNA 1 RETLW B'11001101' ; 02 - RETORNA 2 RETLW B'01101101' ; 03 - RETORNA 3 RETLW B'00101011' ; 04 - RETORNA 4 RETLW B'01100111' ; 05 - RETORNA 5 RETLW B'11100111' ; 06 - RETORNA 6 RETLW B'00101100' ; 07 - RETORNA 7 RETLW B'11101111' ; 08 - RETORNA 8 RETLW B'01101111' ; 09 - RETORNA 9 RETLW B'10101111' ; 10 - RETORNA A RETLW B'11100011' ; 11 - RETORNA b RETLW B'11000110' ; 12 - RETORNA C RETLW B'11101001' ; 13 - RETORNA d RETLW B'11000111' ; 14 - RETORNA E RETLW B'10000111' ; 15 - RETORNA F ; *************************************************************************** ; * CONFIGURAÇÕES INICIAIS DE HARDWARE E SOFTWARE * ; *************************************************************************** INICIO CLRF PORTA ; ZERA TODAS AS SAÍDAS CLRF PORTB CLRF PORTC BANCO1 ; SELECIONA BANCO 1 DA RAM MOVLW B'00000000' ;O VALOR LITERAL QUE ESTAVA NO ACUMULADOR MOVWF TRISA ;É TRANSFERIDO PARA O REGISTRADOR TRISA. ;SE UM BIT = 0 --> PINO = SAÍDA ;SE UM BIT = 1 --> PINO = ENTRADA ;NO NOSSO HARDWARE, APENAS OS PINOS RA0 -> RA3 ;SÃO ENTRADA, POR ISSO, SOMENTE ESTES BITS SÃO ;AJUSTADOS COMO ENTRADA. MOVLW B'00000000' MOVWF TRISB ; CONFIGURA I/O DO PORTB MOVLW B'11111111' MOVWF TRISC ; CONFIGURA I/O DO PORTC MOVLW B'11001111' ; CONFIGURA OPTIONS MOVWF OPTION_REG ; REGISTRADOR OPTION_REG ; ;| RBPU INTEDG T0CS T0SE PSA PS2 PS1 PSO | ;| 1 1 0 0 1 1 1 1 | ; ; PULL-UPs DESABILITADOS ; INTER. NA BORDA DE SUBIDA DO RB0 ; TIMER0 INCREM. PELO CICLO DE MÁQUINA ; WDT - 1:128 ; TIMER - 1:1 MOVLW B'00000000' ; CONFIGURA INTERRUPÇÕES MOVWF INTCON ; POR ENQUANTO AS INTERRUPÇÕES ESTÃO DESLIGADAS ; ; REGISTRADOR INTCON ; ;| GIE PEIE T0IE INTE RBIE T0IF INTF RBIF | ;| 0 1 1 0 0 0 0 0 | ; MOVLW B'00000100' ; CONFIGURA CONVERSOR A/D MOVWF ADCON1 ; ; REGISTRADOR ADCON1 ; ;| ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0 | ;| 1 0 0 0 1 1 1 0 | ; ; JUSTIFICADO À DIREITA ; 2 BITS EM ADRESH E 8 BITS EM ADRESL ; ; RA0 COMO ANALÓGICO ; RA1, RA2, RA3 E RA5 COMO I/O DIGITAL ; ; Vref+ = VDD (+5V) ; Vref- = GND ( 0V) BANCO0 ; SELECIONA BANCO 0 DA RAM MOVLW B'01001001' ; CONFIGURA CONVERSOR A/D MOVWF ADCON0 ; ; REGISTRADOR ADCON0 ; ;| ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE - ADON | ;| 0 1 0 0 0 0 0 1 | ; ;VELOCIDADE -> Fosc/8 ; ; CANAL 0 SENDO UTILIZADO (RA0/AN0) ; ; MÓDULO A/D LIGADO ; *************************************************************************** ; * AGUARDA ESTOURO DE WATCHDOG TIMER * ; *************************************************************************** BTFSC STATUS,NOT_TO GOTO $-1 ; *************************************************************************** ; * ZERA A MEMÓRIA RAM * ; *************************************************************************** MOVLW 0X20 MOVWF FSR LIMPA_RAM CLRF INDF INCF FSR,F MOVF FSR,W XORLW 0X80 BTFSS STATUS,Z GOTO LIMPA_RAM ; *************************************************************************** ; * CONVERSÃO PRINCIPAL * ; *************************************************************************** PRINCIPAL CLRWDT ; LIMPA WATCHDOG TIMER MOVLW .10 ;INICIALIZA O CONTADOR DE DEBOUNCING MOVWF CONTADOR BSF ADCON0,GO ; INICIA A 1ª CONVERSÃO A/D BTFSC ADCON0,GO ; FIM DA 1ª CONVERSÃO? GOTO $-1 ; NÃO - AGUARDA ; SIM MOVF ADRESL,W ; SALVA VALOR DA 1ª CONVERSÃO NO WORK MOVWF TESTE ; CARREGA WORK EM TESTE SEGUNDA BSF ADCON0,GO ; INICIA A 2ª CONVERSÃO A/D BTFSC ADCON0,GO ; FIM DA 2ª CONVERSÃO? GOTO $-1 ; NÃO - AGUARDA ; SIM MOVF ADRESL,W ; SALVA VALOR DA 2ª CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TESTE,W ; TESTA SE O VALOR DA CONVERSÃO FOI IGUAL BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO PRINCIPAL ; NÃO - REFAZ AS MEDIDAS ; SIM BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO DECF CONTADOR ; DECREMENTA O CONTADOR DE DEBOUNCING BTFSS STATUS,Z ; JÁ FEZ A DÉCIMA CONVERSÃO IGUAL? GOTO SEGUNDA ; NÃO - REFAZ AS MEDIDAS ; SIM MOVF ADRESL,W ;SALVA A PARTE BAIXA MOVWF TECLA_LOW MOVF ADRESH,W ;SALVA A PARTE ALTA MOVWF TECLA_HIGH ; *************************************************************************** ; * TESTA: QUAL FOI A TECLA PRESSIONADA? * ; *************************************************************************** ; ********************** VALORES ESPERADOS NO AD ************************ ; ; Tecla HEXA Reg. H Reg. L ; 1 3FA 3 FA ; 2 39E 3 9E ; 3 360 1 60 ; A 166 1 66 ; 4 3A6 3 A6 ; 5 358 3 58 ; 6 323 3 23 ; B 15C 1 5C ; 7 2B2 2 B2 ; 8 285 2 85 ; 9 266 2 66 ; C 131 3 31 ; * 1FA 1 FA ; 0 1E3 1 E3 ; # 1D1 1 D1 ; D 106 1 06 ; ; *************************************************************************** ; ******************************** TECLA 1 ****************************** TECLA1 MOVLW 0xFA ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA2 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x03 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA2 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .1 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 2 ****************************** TECLA2 MOVLW 0x9E ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA3 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x03 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA3 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .2 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 3 ****************************** TECLA3 MOVLW 0x60 ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA4 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x01 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA4 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .3 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 4 ****************************** TECLA4 MOVLW 0x66 ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA5 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x01 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA5 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .10 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 5 ****************************** TECLA5 MOVLW 0xA6 ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA6 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x03 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA6 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .5 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 6 ****************************** TECLA6 MOVLW 0x58 ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA7 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x03 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA7 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .6 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 7 ****************************** TECLA7 MOVLW 0x23 ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA8 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x03 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA8 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .7 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 8 ****************************** TECLA8 MOVLW 0x5C ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA9 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x01 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA9 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .11 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 9 ****************************** TECLA9 MOVLW 0xB2 ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA10 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x02 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA10 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .9 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 10 ****************************** TECLA10 MOVLW 0x85 ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA11 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x02 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA11 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .10 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 11 ****************************** TECLA11 MOVLW 0x66 ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA12 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x02 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA12 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .11 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 12 ****************************** TECLA12 MOVLW 0x31 ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA13 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x03 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA13 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .12 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 13 ****************************** TECLA13 MOVLW 0xFA ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA14 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x01 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA14 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .14 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 14 ****************************** TECLA14 MOVLW 0xE3 ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA15 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x01 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA15 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .0 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 15 ****************************** TECLA15 MOVLW 0xD1 ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA16 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW 0x01 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO TECLA16 ; NÃO - VERIFICA PRÓXIMA TECLA ; SIM MOVLW .15 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; ******************************** TECLA 16 ****************************** TECLA16 MOVLW 0x06 ; SALVA VALOR DA PARTE BAIXA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_LOW,W ; TESTA SE A TECLA PRESSIONADA FOI 1 OU * BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO PRINCIPAL ; NÃO - VOLTA PARA LOOP ; SIM MOVLW 0x01 ; SALVA VALOR DA PARTE ALTA DA CONVERSÃO NO WORK BCF STATUS,Z ; GARANTE QUE O ZERO NÃO FOI AFETADO XORWF TECLA_HIGH,W; TESTA SE A TECLA PRESSIONADA FOI 1 BTFSS STATUS,Z ; OS VALORES MEDIDOS FORAM IGUAIS? GOTO PRINCIPAL ; NÃO - VOLTA PARA LOOP ; SIM MOVLW .13 ;COLOCA O VALOR CORRESPONDENTE MOVWF TECLA_FIM ; NA TECLA FINAL GOTO MOSTRA ; *************************************************************************** ; * MOSTRA QUAL FOI A TECLA PRESSIONADA * ; *************************************************************************** MOSTRA MOVF TECLA_FIM,W CALL CONVERTE MOVWF PORTB GOTO PRINCIPAL ; VOLTA PARA LOOP ; *************************************************************************** ; * TÉRMINO DO PROGRAMA * ; *************************************************************************** END ; FIM DO PROGRAMA