;**************************************************************** ;Programa PICT_HEX.ASM - Teclado de 16 teclas com PIC ;Desenvolvido por Marcio Soares ;Compilador - MPASM ;Ultima alteração - 23/06/2003 ;Esta versão acende led´s de acordo com valor HEX da tecla - vide tabela ;**************************************************************** ;Ports ;RA0-RA3 -> Saidas p/ LEDs ;RB0-RB2 -> Saidas para scan de teclado (colunas) ;RB4-RB7 -> Entradas para scan de teclado (linhas) radix dec include __CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC ;configura bits ;********************************************** ;Define registros PICRES equ 0x00 PICINT equ 0x04 RAMINIT equ 0x0C ;********************************************** ;Variaveis já definidas em P16F84A.INC ; ;PORTA, PORTB, STATUS, PCL, DC, C, Z ;********************************************** ;Variaveis de uso do programa ; org RAMINIT ;endereco da RAM TEMP res 1 TECLA res 1 TECLA_L res 1 T1 res 1 T2 res 1 AUX1 res 1 org PICRES ;endereco de reset goto inicio ;desvia p/ inicio org PICINT ;endereco do vector de INT retfie ;********************************************** ;inicio do programa ;seta ambiente inicio: movlw 0x00 ;ajuste para os bits INTCON movwf INTCON bsf STATUS,RP0 ;seleciona banco 1 para options e tris movlw 0x00 ;ajusta os bits em A como saida movwf TRISA movlw 0xF0 ;ajusta os bits em B como saida e entradas movwf TRISB bcf STATUS,RP0 ;volta ao banco 0... (padrão do reset) movlw 0x04 ;apaga leds do port A movwf PORTA movwf AUX1 clrf PORTB ;********************************************** ;loop principal loop: movlw B'11110111' ;seta em low primeira coluna movwf TEMP ;salva tec1: bsf STATUS,RP0 ;seleciona banco 1 movlw 0xF0 movwf TRISB ;seta novamente o port B bcf STATUS,RP0 ;volta ao banco 0 movf TEMP,0 ;carrega W com TEMP movwf PORTB ;envia TEMP para B movf PORTB,W ;Le o port B andlw 0xF0 ;mascara para ver se houve... xorlw 0xF0 ;mudanca no port btfss STATUS,Z ;nao??? entao pula proximo goto det_tecla ;sim??? entao tem tecla tec3: bsf STATUS,C ;seta carry rrf TEMP,1 ;marca próxima coluna btfsc STATUS,C ;ultima coluna??? pula proximo goto tec1 ;senao, faz novamente clrf TECLA ;zera tecla decf TECLA,1 ;faz tecla igual FF tec2: clrf PORTB ;zera port B bsf STATUS,RP0 ;seta banco 1 movlw 0xF0 movwf TRISB ;seta novamente portb bcf STATUS,RP0 ;volta ao banco 0 goto led ;led 3, opera invertido apaga: movlw 0x04 goto led acende: movwf TECLA led1: movwf PORTA ;ativa led call pausa led: movf AUX1,W ;pega ultimo valor movwf PORTA goto loop ;volta para inicio det_tecla: incf TECLA,1 ;incrementa tecla btfss STATUS,Z ;se TECLA estava limpa, pula goto tec2 ;senao, limpa e volta movf PORTB,0 ;colhe tecla iorlw B'00001111' ;operacao OR andwf TEMP,0 ;AND do resultado com TEMP movwf TECLA ;salva em tecla pega_tec: andlw B'00001111' ;pega o bit em low (coluna) movwf TECLA_L ;grava em tecla linha movlw 0x04 ;valor para contador movwf TEMP ;carrega valor em TEMP pt1: bsf STATUS,C ;seta bit carry rrf TECLA_L,1 ;roda a direita btfss STATUS,C ;testa bit de carry, se 1 pula goto pega_hi ;pega parte alta decfsz TEMP,1 ;decrementa TEMP goto pt1 ;loop ate zerar contador erro_meu: goto inicio ;retorna e inicializa pega_hi: decf TEMP,1 ;decrementa TEMP swapf TECLA,0 ;troca 0 por 1 e vice-versa andlw B'00001111' ;and do resultado com o literal movwf TECLA_L ;salva o novo valor movf TEMP,W ;carrega temp em W addwf PCL,1 ;soma counter ao Program Counter goto pega4 ;pula para cada um de acordo com PC goto pega8 goto pega12 goto pega16 pega4: movlw 0x04 ;seta contador com 4 pega_com: movwf TEMP ;salva em temp pega_c1: bsf STATUS,C ;seta o bit de carry rrf TECLA_L,1 ;roda a direita btfss STATUS,C ;testa o carry goto tabela_tec ;carry=0, vai para tabela decfsz TEMP,1 ;decrementa temp goto pega_c1 ;loop, testa novamente goto erro_meu ;ERRO! forca reset pega8: movlw 0x08 ;carrega W com 8 goto pega_com ;testa pega12: movlw 0x0C ;carrega W com 12 goto pega_com pega16: movlw 0x10 ;carrega W com 16 goto pega_com ;testa ;********************************************** ;tabela com valores das teclas tabela_tec: call tabela ;chama tabela movwf AUX1 ;salva Tecla goto acende ;acende leds tabela: decf TEMP,1 ;decrementa TEMP movf TEMP,0 ;poe temp em w addwf PCL,F ;soma W a PC ;Led 3 opera invertido, então tabela deve passar bit 2 para PORT A ;também invertido -> 0=1 e 1=0 ; valor de retorno valor real e tecla retlw 0x07 ;03 tecla 77H -> F3 retlw 0x03 ;07 tecla B7H -> F2 retlw 0x0F ;11 tecla D7H -> F1 retlw 0x0B ;15 tecla E7H -> E retlw 0x06 ;2 tecla 7BH -> 9 retlw 0x02 ;6 tecla BBH -> 6 retlw 0x0E ;10 tecla DBH -> 3 retlw 0x0A ;14 tecla EBH -> C retlw 0x05 ;1 tecla 7DH -> 8 retlw 0x01 ;5 tecla BDH -> 5 retlw 0x0D ;9 tecla DDH -> 2 retlw 0x09 ;13 tecla EDH -> ponto retlw 0x04 ;0 tecla 7EH -> 7 retlw 0x00 ;4 tecla BEH -> 4 retlw 0x0C ;8 tecla DEH -> 1 retlw 0x08 ;12 tecla EEH -> 0 ;********************************************** ;subrotina de temporização pausa: movlw 0xff ;carrega W com 255 movwf T1 ;carrega T1 com W car_1: movlw 0xff ;carrega W com 255 movwf T2 ;carrega T2 com 255 dec_1: decfsz T2,1 ;decrementa T2 goto dec_1 ;255 x T1 vezes decfsz T1,1 ;decrementa T1 goto car_1 ;volta a carregar T2 retlw 0x00 ;retorna 0 em W ; ;********************************************** ;fim do programa ;********************************************** end