You are on page 1of 6

;****************************************************************** ;* Programa para teste e uso de displays 7 segmentos no PIC 16F84A ;* dsp7seg.

ASM ;* Marcio Soares - 01/09/2003 ;****************************************************************** ; ;Controla 2 displays diretamente: ; Segmentos dos displays ligados a porta B, ; Controle dos displays (catodos) ligados a porta A ; ; ;Freqncia de operacao 4MHz ; ;******************************************************************* ;ltimas alteraes ; ;01/09/2003 - inserido contador atravs da INT em RB0 ;17/09/2003 - alterado rotinas de temporizao p/ maior preciso list p=16F84 list n=0 include <P16F84A.INC> __CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC ;configura bits ;***************************************************************** ; Diretrizes de pr-compilao #DEFINE bank1 #DEFINE bank0 bsf bcf STATUS,RP0 STATUS,RP0 ;seleciona banco 1 ;volta para banco 0

;***************************************************************** ; Constantes PICRES equ PICINT equ PICRAM equ DISPLAY equ C_DSP equ DISP1 DISP2 BEEP equ equ equ org W2 res STATUS2 res PCLATH2 res VAR1 res VAR2 res VAR_AUX res SEG MIN T1 res res res 0x00 0x04 0x20 0x06 0x05 0x01 0x00 0x02 PICRAM 1 1 1 1 1 1 1 1 1 ;vetor de reset ;vector de interrupo ;vector de ram ;display na porta B ;controle do display na porta A ;pino 17, bit 1 porta A ;pino 18, bit 0 porta A ;pino 1, bit 2 porta A ;inicio da RAM ;backup para W ;backup para STATUS ;backup para PCLATH ;guarda dado do primeiro display ;guarda dado do segundo display ;varivel auxiliar p/ converso ;varivel p/ segundos ;varivel p/ minutos ;varivel para temporizador

T2 T3 T4 BZZ1 BZZ2

res res res res res

1 1 1 1 1

;varivel para temporizador ;varivel para temporizador ;varivel para temporizador ;varivel auxiliar 1 p/ buzzer ;varivel auxiliar 2 p/ buzzer

;***************************************************************** ; Reset e vetor de int org goto org goto PICRES config_pic PICINT IntVector

;**************************************************************** ; configura pic config_pic: bank1 movlw movwf movlw movwf bank0 bsf bank1 bsf bank0 bsf 0x00 TRISA 0x01 TRISB INTCON,INTE

;PORTA eh saida ;PORTB 0 entrada ;PORTB 1 a 7 sada ;Habilita int em RB0

OPTION_REG,INTEDG ;interrupao na transiao 1->0 INTCON,GIE ;habilita interrupoes (Global)

;**************************************************************** ; programa principal inicio: movlw movwf movlw movwf movlw movwf clrf clrf clrf aqui_sempre: btfsc goto call goto 0x00 DISPLAY 0x00 VAR1 0x00 VAR2 SEG MIN BZZ2 BZZ2,0 buzzer mostra_disp aqui_sempre ;zera variveis ;limpa display ;coloca valores nas variveis

;testa p/ saber se toca beep ;toca beep ;mostra valores no display ;mantem processamento preso. Aguarda INT sempre

;***************************************************************** ; subrotinas de interrupoes ; salve o contexto geral se necessario (registros W e STATUS) IntVector: movwf swapf clrf movwf movf movwf IntRB0: btfss INTCON,INTF goto OutraInt bcf INTCON,GIE bcf INTCON,INTF call Conta goto IntEnd OutraInt: goto IntEnd: movf movwf swapf movwf swapf swapf PCLATH2,W PCLATH STATUS2,W STATUS W2,F W2,W ; ;restaura PCLATH ;restaura STATUS ; ;restaura W ;habilita INTs ;retorna da INT $ ;interrupo em RB0? ;no, ento checa outra ;desabilita INTs ;limpa registro de interrupo ;conta int ;fim das interrupes W2 STATUS,W STATUS STATUS2 PCLATH,W PCLATH2 ;salva W ;salva STATUS ;salva PCLATH

bsf INTCON,GIE retfie

;**************************************************************** ; subrotina - mostra display mostra_disp: movf movwf call movwf nop nop nop bsf call bcf movf movwf call movwf C_DSP,DISP1 _30ms C_DSP,DISP1 VAR2,W VAR_AUX prep_ret DISPLAY VAR1,W VAR_AUX prep_ret DISPLAY ;pega valor display 1 ;salva na varivel auxiliar ;prepara valor de retorno ;coloca valor no display ;perde 3 ciclos

;ativa catodo do display ;temporiza 30 ms ;desliga catodo ;pega valor display 2 ;salva na varivel auxiliar ;prepara valor de retorno ;coloca valor no display

nop nop nop bsf call bcf return C_DSP,DISP2 _30ms C_DSP,DISP2

;perde 3 ciclos

;ativa catodo do display ;temporiza 30 ms ;desliga catodo ;volta

;**************************************************************** ; subrotina - prepara retorno do display ; ; Entrada - valor decimal ; Saida - valor adaptado para 7 segmento prep_ret: MOVF addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw VAR_AUX,W PCL,F B'01111110' B'00001100' B'10110110' B'10011110' B'11001100' B'11011010' B'11111010' B'00001110' B'11111110' B'11011110' 0x00 0x00 0x00 0x00 0x00 0x00 ;coloca ;soma W ; 00 no ; 01 no ; 02 no ; 03 no ; 04 no ; 05 no ; 06 no ; 07 no ; 08 no ; 09 no ; ; ; ; ; ; erro erro erro erro erro erro variavel auxiliar em W a PCL display display display display display display display display display display retorna retorna retorna retorna retorna retorna 0 0 0 0 0 0

clrf VAR_AUX return

; apenas previne erro de desvio no PCL

;********************************************************* ; Conta - conta numero de ints ; ; Preparada para contar segundos ; conta de 0000 a 9999 segundos ;********************************************************* Conta: incf movf xorlw btfss goto movlw movwf incf movf xorlw btfss SEG,F SEG,W 0x3C STATUS,Z fimconta 0x00 SEG VAR1,F VAR1,W 0x0A STATUS,Z ;incrementa segundo ;move segundo para W ;compara com 60 ; ;menor, apenas volta ;zera SEG ;incrementa 1 display ; ;compara com 10

goto movlw movwf incf movf xorlw btfss goto movlw movwf movwf bcf movlw movwf fimconta: return

fimconta 0x00 VAR1 VAR2,F VAR2,W 0x06 STATUS,Z fimconta 0x00 VAR1 VAR2 INTCON,GIE 0x01 BZZ2 ;zera VAR1 ;incrementa 2 display ; ;compara com 6

;zera todas VAR

;desabilita INTs ;para voltar a contar, so resetando ;final da contagem, toca beep ;volta

;********************************************************* ; rotina de alarme ;********************************************************* buzzer: movlw 0x32 ;carrega com 50 movwf BZZ1 ;variavel auxiliar de toque bz1: bsf PORTA,BEEP ;liga beep call _10ms ;aguarda 1ms bcf PORTA,BEEP ;desliga beep call _10ms call _10ms decfsz BZZ1,F ;decrementa goto bz1 call _200ms ;aguarda 400ms (quase 1/2 segundo) call _200ms ;aguarda 400ms (quase 1/2 segundo) goto buzzer ;********************************************************* ; rotinas de temporizao ;********************************************************* _10ms: movlw movwf P0: nop decfsz T1, F goto P0 goto P2 nop return ; ; ; ; ; ; perde 1 ciclo tempo igual a zero? no, faz novamente perde 2 ciclos perde +1 ciclo fim. .248 T1 ; seta numero de repeties

P1: P2:

_30ms: movlw 0x03 ;carrega W com 3

movwf _30_1:

T2

;carrega T2 com W ;chama _10ms 3x

call _10ms decfsz T2,F goto _30_1 return _200ms: movlw movwf _200_1: call _10ms decfsz T2,F goto _200_1 return 0x14 T2

;carrega W com 20 ;carrega T2 com W ;chama _10ms 20x

;**************************************************************** ; fim do programa end

You might also like