;**************************************************************** ;Programa TRANCA.ASM - Controle de fechadura elétrica - versão 1.0 ;Desenvolvido por Marcio Soares ;Compilador - MPASM ;Ultima alteração - 29/10/2002 ;**************************************************************** ;Ports ;RA0-RA3 -> Saidas p/ LEDs, buzzer e rele ;RB0-RB2 -> Saidas para scan de teclado (colunas) ;RB4-RB7 -> Entradas para scan de teclado (linhas) ; ;Este programa opera com senha master ;e senha para alarme silencioso ; ;se senha master true, liga rele ;se senha alarme true, liga rele e alarme silencioso ;se senha false, toca buzzer e retorna 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 RELE equ 0x00 ;rele LED1 equ 0x01 ;Led verde LED2 equ 0x04 ;Led vermelho BUZZER equ 0x03 ;buzzer ALARME equ 0x02 ;saída para alarme silencioso MAST1 equ 0x09 ;senha master 9394 MAST2 equ 0x03 MAST3 equ 0x09 MAST4 equ 0x04 ALAR1 equ 0x08 ;senha para alarme silencioso ALAR2 equ 0x03 ALAR3 equ 0x08 ALAR4 equ 0x04 ;************************************************ ;Variaveis de uso do programa ;************************************************ org RAMINIT ;endereco da RAM TEMP res 1 ;temporizador TECLA res 1 ;guarda a tecla, trabalho TECLA1 res 1 ;guarda a tecla 1 TECLA2 res 1 ;guarda a tecla 2 TECLA3 res 1 ;guarda a tecla 3 TECLA4 res 1 ;guarda a tecla 4 TECLA_L res 1 TECNR res 1 ;posição da tecla T1 res 1 ;temporizador T2 res 1 ;temporizador T3 res 1 ;temporizador ;************************************************* ; Inicio do setup da PIC ;************************************************* org PICRES ;endereco de reset goto inicio ;desvia p/ inicio org PICINT ;endereco do vector de INT retfie ;************************************************* ; Rotina para setar a PIC ;************************************************* inicio: movlw 0x00 ;ajuste para os bits INTCON movwf INTCON clrf PORTA clrf PORTB 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) clrf TECNR ;limpa posição da tecla para testes bcf PORTA,LED2 ;liga led vermelho call beep2 ;toca beep, 2 vezes ;************************************************* ; Rotina principal de varredura do teclado ;************************************************* loop: call _5ms ;aguarda 1ms 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 nop ;perde ciclos nop ;para poder ler no mesmo port nop movf PORTB,0 ;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 loop ;********************************************************* ; rotina para salvar tecla para verificação ;********************************************************* salva: movwf TECLA ;salva tecla call beep ;toca beep call _300ms ;aguarda 300ms btfss TECNR,0 ;verifica em qual posição goto sv1 ;vai salvar a tecla btfss TECNR,1 goto sv2 btfss TECNR,2 goto sv3 goto sv4 sv1: movf TECLA,W ;posição 1 movwf TECLA1 bsf TECNR,0 goto sv_end sv2: movf TECLA,W ;posição 2 movwf TECLA2 bsf TECNR,1 goto sv_end sv3: movf TECLA,W ;posição 3 movwf TECLA3 bsf TECNR,2 goto sv_end sv4: movf TECLA,W ;posição 4 movwf TECLA4 call compara ;compara se código esta ok com master call alarme ;compara se código esta ok com alarme clrf TECNR ;limpa registro de teclas sv_end: goto loop ;*********************************************************************** ; rotina para detectar tecla ;*********************************************************************** det_tecla: nop ;perde 6 ciclos para evitar repiques nop ;do teclado nop nop nop nop 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 deu_pau: 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,0 ;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 deu_pau ;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_tec: call tabela ;chama tabela goto salva ;salva tela tabela: decf TEMP,1 ;decrementa TEMP movf TEMP,0 ;poe temp em w addwf PCL,1 ;soma W a PC retlw 0x0F ;coluna não existe retlw 0x0F ; retlw 0x0F ; retlw 0x0F ; retlw 0x0A ;* tecla 7BH retlw 0x07 ;7 tecla BBH retlw 0x04 ;4 tecla DBH retlw 0x01 ;1 tecla EBH retlw 0x00 ;0 tecla 7DH retlw 0x08 ;8 tecla BDH retlw 0x05 ;5 tecla DDH retlw 0x02 ;2 tecla EDH retlw 0x0C ;# tecla 7EH retlw 0x09 ;9 tecla BEH retlw 0x06 ;6 tecla DEH retlw 0x03 ;3 tecla EEH ;********************************************************* ; rotina para comparar senha teclada com senha master ;********************************************************* compara: movf TECLA1,W ;salva tecla1 em W andlw 0xFF ;faz end para isolar bits xorlw MAST1 ;xor com senha 1, se zero, valida btfss STATUS,Z goto invalido ;primeira tecla invalida movf TECLA2,W ;salva tecla2 em W andlw 0xFF ;faz end para isolar bits xorlw MAST2 ;xor com senha 2, se zero, valida btfss STATUS,Z goto invalido ;segunda tecla invalida movf TECLA3,W ;salva tecla3 em W andlw 0xFF ;faz end para isolar bits xorlw MAST3 ;xor com senha 3, se zero, valida btfss STATUS,Z goto invalido ;terceira tecla invalida movf TECLA4,W ;salva tecla4 em W andlw 0xFF ;faz end para isolar bits xorlw MAST4 ;xor com senha 4, se zero, valida btfss STATUS,Z goto invalido ;quarta tecla invalida bsf PORTA,RELE ;liga rele e led verde, desliga led vermelho e alarme bsf PORTA,LED1 bsf PORTA,LED2 bcf PORTA,ALARME call beep2 ;toca beep, 2 vezes call _1000ms ;aguarda 3 s call _1000ms call _1000ms bcf PORTA,RELE ;desliga rele e led verde, liga led vermelho bcf PORTA,LED1 bcf PORTA,LED2 goto comp_end invalido: call beep3 ;toca beep, 3 vezes comp_end: return ;********************************************************* ; rotina para comparar senha teclada com senha alarme ;********************************************************* alarme: movf TECLA1,W ;salva tecla1 em W andlw 0xFF ;faz end para isolar bits xorlw ALAR1 ;xor com senha 1, se zero, valida btfss STATUS,Z goto inv_alar ;primeira tecla invalida movf TECLA2,W ;salva tecla2 em W andlw 0xFF ;faz end para isolar bits xorlw ALAR2 ;xor com senha 2, se zero, valida btfss STATUS,Z goto inv_alar ;segunda tecla invalida movf TECLA3,W ;salva tecla3 em W andlw 0xFF ;faz end para isolar bits xorlw ALAR3 ;xor com senha 3, se zero, valida btfss STATUS,Z goto inv_alar ;terceira tecla invalida movf TECLA4,W ;salva tecla4 em W andlw 0xFF ;faz end para isolar bits xorlw ALAR4 ;xor com senha 4, se zero, valida btfss STATUS,Z goto inv_alar ;quarta tecla invalida bsf PORTA,RELE ;liga rele, alarme e led verde, desliga led vermelho bsf PORTA,LED1 bsf PORTA,LED2 bsf PORTA,ALARME call beep2 ;toca beep, 2 vezes call _1000ms ;aguarda 3 s call _1000ms call _1000ms bcf PORTA,RELE ;desliga rele e led verde, liga led vermelho bcf PORTA,LED1 bcf PORTA,LED2 inv_alar: return ;********************************************************* ; rotina para tocar o buzzer ;********************************************************* beep: movlw 50 ;prepara para fazer 50 vezes movwf T3 goto beepA beep2: movlw 100 ;prepara para fazer 100 vezes movwf T3 goto beepA beep3: movlw 150 ;prepara para fazer 150 vezes movwf T3 beepA: bsf PORTA,BUZZER ;liga buzzer call _1ms ;aguarda 1 ms bcf PORTA,BUZZER ;desliga buzzer call _1ms ;aguarda 1 ms decfsz T3,1 ;decrementa T3 goto beepA ;faz até ser zero return ;********************************************************* ; rotinas de temporização ;********************************************************* _1ms: movlw 0x02 ;carrega W com 01 movwf T1 ;carrega T1 com W goto car_1 _5ms: movlw 0x06 ;carrega W com 06 movwf T1 ;carrega T1 com W goto car_1 _300ms: movlw 0x56 ;carrega W com 86 movwf T1 ;carrega T1 com W goto car_1 _1000ms: movlw 0xFF movwf T1 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