Você está na página 1de 5

;****************************************************************

;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 <P16F84A.INC>
__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

Você também pode gostar