; *************************************************************************** ; * 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'00011111' ;MASCARA VALOR DE CONTADOR CONSIDERAR SOMENTE ATÉ 16 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 RETLW B'00010000' ; 16 - RETORNA ERRO DE LEITURA ; ***************** TABELA DE VALORES POSSÍVEIS NO A/D ******************** TABELA_A_D ADDWF PCL,F RETLW .16 ; 00 - ERRO RETLW .16 ; 01 - ERRO RETLW .16 ; 02 - ERRO RETLW .16 ; 03 - ERRO RETLW .16 ; 04 - ERRO RETLW .16 ; 05 - ERRO RETLW .16 ; 06 - ERRO RETLW .16 ; 07 - ERRO RETLW .16 ; 08 - ERRO RETLW .16 ; 09 - ERRO RETLW .16 ; 10 - ERRO RETLW .16 ; 11 - ERRO RETLW .16 ; 12 - ERRO RETLW .16 ; 13 - ERRO RETLW .16 ; 14 - ERRO RETLW .16 ; 15 - ERRO RETLW .16 ; 16 - ERRO RETLW .16 ; 17 - ERRO RETLW .16 ; 18 - ERRO RETLW .16 ; 19 - ERRO RETLW .16 ; 20 - ERRO RETLW .16 ; 21 - ERRO RETLW .16 ; 22 - ERRO RETLW .16 ; 23 - ERRO RETLW .16 ; 24 - ERRO RETLW .16 ; 25 - ERRO RETLW .16 ; 26 - ERRO RETLW .16 ; 27 - ERRO RETLW .16 ; 28 - ERRO RETLW .16 ; 29 - ERRO RETLW .16 ; 30 - ERRO RETLW .16 ; 31 - ERRO RETLW .16 ; 32 - ERRO RETLW .16 ; 33 - ERRO RETLW .16 ; 34 - ERRO RETLW .16 ; 35 - ERRO RETLW .16 ; 36 - ERRO RETLW .16 ; 37 - ERRO RETLW .16 ; 38 - ERRO RETLW .16 ; 39 - ERRO RETLW .16 ; 40 - ERRO RETLW .16 ; 41 - ERRO RETLW .16 ; 42 - ERRO RETLW .16 ; 43 - ERRO RETLW .16 ; 44 - ERRO RETLW .16 ; 45 - ERRO RETLW .16 ; 46 - ERRO RETLW .16 ; 47 - ERRO RETLW .16 ; 48 - ERRO RETLW .16 ; 49 - ERRO RETLW .16 ; 50 - ERRO RETLW .16 ; 51 - ERRO RETLW .16 ; 52 - ERRO RETLW .16 ; 53 - ERRO RETLW .16 ; 54 - ERRO RETLW .16 ; 55 - ERRO RETLW .16 ; 56 - ERRO RETLW .16 ; 57 - ERRO RETLW .16 ; 58 - ERRO RETLW .16 ; 59 - ERRO RETLW .16 ; 60 - ERRO RETLW .16 ; 61 - ERRO RETLW .16 ; 62 - ERRO RETLW .13 ; 63 - RETORNA TECLA D RETLW .13 ; 64 - RETORNA TECLA D RETLW .13 ; 65 - RETORNA TECLA D RETLW .13 ; 66 - RETORNA TECLA D RETLW .16 ; 67 - ERRO RETLW .16 ; 68 - ERRO RETLW .16 ; 69 - ERRO RETLW .16 ; 70 - ERRO RETLW .16 ; 71 - ERRO RETLW .16 ; 72 - ERRO RETLW .16 ; 73 - ERRO RETLW .12 ; 74 - RETORNA TECLA C RETLW .12 ; 75 - RETORNA TECLA C RETLW .12 ; 76 - RETORNA TECLA C RETLW .12 ; 77 - RETORNA TECLA C RETLW .12 ; 78 - RETORNA TECLA C RETLW .16 ; 79 - ERRO RETLW .16 ; 80 - ERRO RETLW .16 ; 81 - ERRO RETLW .16 ; 82 - ERRO RETLW .16 ; 83 - ERRO RETLW .16 ; 84 - ERRO RETLW .11 ; 85 - RETORNA TECLA B RETLW .11 ; 86 - RETORNA TECLA B RETLW .11 ; 87 - RETORNA TECLA B RETLW .10 ; 88 - RETORNA TECLA A RETLW .10 ; 89 - RETORNA TECLA A RETLW .10 ; 90 - RETORNA TECLA A RETLW .16 ; 91 - ERRO RETLW .16 ; 92 - ERRO RETLW .16 ; 93 - ERRO RETLW .16 ; 94 - ERRO RETLW .16 ; 95 - ERRO RETLW .16 ; 96 - ERRO RETLW .16 ; 97 - ERRO RETLW .16 ; 98 - ERRO RETLW .16 ; 99 - ERRO RETLW .16 ; 100 - ERRO RETLW .16 ; 101 - ERRO RETLW .16 ; 102 - ERRO RETLW .16 ; 103 - ERRO RETLW .16 ; 104 - ERRO RETLW .16 ; 105 - ERRO RETLW .16 ; 106 - ERRO RETLW .16 ; 107 - ERRO RETLW .16 ; 108 - ERRO RETLW .16 ; 109 - ERRO RETLW .16 ; 110 - ERRO RETLW .16 ; 111 - ERRO RETLW .16 ; 112 - ERRO RETLW .16 ; 113 - ERRO RETLW .15 ; 114 - RETORNA TECLA # RETLW .15 ; 115 - RETORNA TECLA # RETLW .15 ; 116 - RETORNA TECLA # RETLW .15 ; 117 - RETORNA TECLA # RETLW .15 ; 118 - RETORNA TECLA # RETLW .0 ; 119 - RETORNA TECLA 0 RETLW .0 ; 120 - RETORNA TECLA 0 RETLW .0 ; 121 - RETORNA TECLA 0 RETLW .0 ; 122 - RETORNA TECLA 0 RETLW .16 ; 123 - ERRO RETLW .13 ; 124 - RETORNA TECLA * RETLW .13 ; 125 - RETORNA TECLA * RETLW .13 ; 126 - RETORNA TECLA * RETLW .13 ; 127 - RETORNA TECLA * RETLW .13 ; 128 - RETORNA TECLA * RETLW .16 ; 129 - ERRO RETLW .16 ; 130 - ERRO RETLW .16 ; 131 - ERRO RETLW .16 ; 132 - ERRO RETLW .16 ; 133 - ERRO RETLW .16 ; 134 - ERRO RETLW .16 ; 135 - ERRO RETLW .16 ; 136 - ERRO RETLW .16 ; 137 - ERRO RETLW .16 ; 138 - ERRO RETLW .16 ; 139 - ERRO RETLW .16 ; 140 - ERRO RETLW .16 ; 141 - ERRO RETLW .16 ; 142 - ERRO RETLW .16 ; 143 - ERRO RETLW .16 ; 144 - ERRO RETLW .16 ; 145 - ERRO RETLW .16 ; 146 - ERRO RETLW .16 ; 147 - ERRO RETLW .16 ; 148 - ERRO RETLW .16 ; 149 - ERRO RETLW .16 ; 150 - ERRO RETLW .9 ; 151 - RETORNA TECLA 9 RETLW .9 ; 152 - RETORNA TECLA 9 RETLW .9 ; 153 - RETORNA TECLA 9 RETLW .9 ; 154 - RETORNA TECLA 9 RETLW .9 ; 155 - RETORNA TECLA 9 RETLW .16 ; 156 - ERRO RETLW .16 ; 157 - ERRO RETLW .16 ; 158 - ERRO RETLW .8 ; 159 - RETORNA TECLA 8 RETLW .8 ; 160 - RETORNA TECLA 8 RETLW .8 ; 161 - RETORNA TECLA 8 RETLW .8 ; 162 - RETORNA TECLA 8 RETLW .8 ; 163 - RETORNA TECLA 8 RETLW .16 ; 164 - ERRO RETLW .16 ; 165 - ERRO RETLW .16 ; 166 - ERRO RETLW .16 ; 167 - ERRO RETLW .16 ; 168 - ERRO RETLW .16 ; 169 - ERRO RETLW .7 ; 170 - RETORNA TECLA 7 RETLW .7 ; 171 - RETORNA TECLA 7 RETLW .7 ; 172 - RETORNA TECLA 7 RETLW .7 ; 173 - RETORNA TECLA 7 RETLW .7 ; 174 - RETORNA TECLA 7 RETLW .16 ; 175 - ERRO RETLW .16 ; 176 - ERRO RETLW .16 ; 177 - ERRO RETLW .16 ; 178 - ERRO RETLW .16 ; 179 - ERRO RETLW .16 ; 180 - ERRO RETLW .16 ; 181 - ERRO RETLW .16 ; 182 - ERRO RETLW .16 ; 183 - ERRO RETLW .16 ; 184 - ERRO RETLW .16 ; 185 - ERRO RETLW .16 ; 186 - ERRO RETLW .16 ; 187 - ERRO RETLW .16 ; 188 - ERRO RETLW .16 ; 189 - ERRO RETLW .16 ; 190 - ERRO RETLW .16 ; 191 - ERRO RETLW .16 ; 192 - ERRO RETLW .16 ; 193 - ERRO RETLW .16 ; 194 - ERRO RETLW .16 ; 195 - ERRO RETLW .16 ; 196 - ERRO RETLW .16 ; 197 - ERRO RETLW .6 ; 198 - RETORNA TECLA 6 RETLW .6 ; 199 - RETORNA TECLA 6 RETLW .6 ; 200 - RETORNA TECLA 6 RETLW .6 ; 201 - RETORNA TECLA 6 RETLW .6 ; 202 - RETORNA TECLA 6 RETLW .16 ; 203 - ERRO RETLW .16 ; 204 - ERRO RETLW .16 ; 205 - ERRO RETLW .16 ; 206 - ERRO RETLW .16 ; 207 - ERRO RETLW .16 ; 208 - ERRO RETLW .16 ; 209 - ERRO RETLW .16 ; 210 - ERRO RETLW .16 ; 211 - ERRO RETLW .5 ; 212 - RETORNA TECLA 5 RETLW .5 ; 213 - RETORNA TECLA 5 RETLW .5 ; 214 - RETORNA TECLA 5 RETLW .3 ; 215 - RETORNA TECLA 3 RETLW .3 ; 216 - RETORNA TECLA 3 RETLW .3 ; 217 - RETORNA TECLA 3 RETLW .3 ; 218 - RETORNA TECLA 3 RETLW .16 ; 219 - ERRO RETLW .16 ; 220 - ERRO RETLW .16 ; 221 - ERRO RETLW .16 ; 222 - ERRO RETLW .16 ; 223 - ERRO RETLW .16 ; 224 - ERRO RETLW .16 ; 225 - ERRO RETLW .16 ; 226 - ERRO RETLW .16 ; 227 - ERRO RETLW .16 ; 228 - ERRO RETLW .2 ; 229 - RETORNA TECLA 2 RETLW .2 ; 230 - RETORNA TECLA 2 RETLW .2 ; 231 - RETORNA TECLA 2 RETLW .4 ; 232 - RETORNA TECLA 4 RETLW .4 ; 233 - RETORNA TECLA 4 RETLW .4 ; 234 - RETORNA TECLA 4 RETLW .4 ; 235 - RETORNA TECLA 4 RETLW .16 ; 236 - ERRO RETLW .16 ; 237 - ERRO RETLW .16 ; 238 - ERRO RETLW .16 ; 239 - ERRO RETLW .16 ; 240 - ERRO RETLW .16 ; 241 - ERRO RETLW .16 ; 242 - ERRO RETLW .16 ; 243 - ERRO RETLW .16 ; 244 - ERRO RETLW .16 ; 245 - ERRO RETLW .16 ; 246 - ERRO RETLW .16 ; 247 - ERRO RETLW .16 ; 248 - ERRO RETLW .16 ; 249 - ERRO RETLW .16 ; 250 - ERRO RETLW .16 ; 251 - ERRO RETLW .1 ; 252 - RETORNA TECLA 1 RETLW .1 ; 253 - RETORNA TECLA 1 RETLW .1 ; 254 - RETORNA TECLA 1 RETLW .1 ; 255 - RETORNA TECLA 1 ; *************************************************************************** ; * 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 | ;| 0 0 0 0 1 1 1 0 | ; ; JUSTIFICADO À ESQUERDA ; 8 BITS EM ADRESH E 2 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 ADRESH,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 ADRESH,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 DECI Reg. H Reg. L ; 1 1018 254 64 ; 2 926 231 64 ; 3 864 216 0 ; A 358 89 128 ; 4 934 233 64 ; 5 856 215 0 ; 6 803 200 128 ; B 348 87 0 ; 7 690 172 128 ; 8 645 161 64 ; 9 614 153 128 ; C 305 76 64 ; * 506 126 64 ; 0 483 120 192 ; # 465 116 0 ; D 262 65 128 ; ; *************************************************************************** ; *************************************************************************** ; * SELECIONA O VALOR DO A/D * ; *************************************************************************** SELECIONA_A_D MOVF TECLA_HIGH,W CALL TABELA_A_D MOVWF TECLA_FIM MOVF TECLA_FIM,W CALL CONVERTE MOVWF PORTB GOTO PRINCIPAL ; VOLTA PARA LOOP ; *************************************************************************** ; * TÉRMINO DO PROGRAMA * ; *************************************************************************** END ; FIM DO PROGRAMA