Você está na página 1de 6

; ; ; ; ; ; ;

******************************************************************* ******************************************************************* ** ** ** Voltmetro com Display de Cristal Lquido ** ** ** ******************************************************************* ******************************************************************* __CONFIG _WDT_ON & _XT_OSC & _LVP_OFF & _BODEN_OFF

; ******************************************************************* ; Cabealho, Vetores de Reset e Interrupo #INCLUDE <P16F877.INC> #DEFINE RS #DEFINE EN TEMPOP TEMPOG EQU EQU 0x20 0x21 equ equ 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x2A PORTA PORTB PORTE,0 PORTE,1 ; Cabealho do PIC16F877 ; Define um nome para PORTE,0 ; Define um nome para PORTE,1 ; Definio da Varivel 8BITs ; Definio da Varivel 8BITs ;port de controle para display ;port de dados para o display ;acumulador "a" de 16 bits usado ;na rotina de diviso ;acumulador "b" de 16 bits usado ;na rotina de diviso ;acumulador "c" de 16 bits usado ;na rotina de diviso ;acumulador "d" de 16 bits usado ;na rotina de diviso ;contador temporrio usado ;na rotina de diviso ;acumulador de 16 bits usado ;para retornar o valor da rotina ;de multiplicao ;operador p/ rotina de multiplicao ;operador p/ rotina de multiplicao ;registrador de uso geral ;armazena valor na unidade da tenso ;armazena valor na dezena1 da tenso ;armazena valor na dezena2 da tenso ; ; ; ; Vetor de Reset Chamada da Rotina CONFIG Vetor de Interrupo Retorno de Interrupo

;*LCD_CNTL ;*LCD_DATA ACCaHI ACCaLO ACCbHI ACCbLO ACCcHI ACCcLO ACCdHI ACCdLO temp H_byte L_byte mulplr mulcnd AUX UNIDADE DEZENA1 DEZENA2 EQU EQU EQU EQU EQU EQU EQU EQU EQU

EQU 0x2B EQU 0x2C EQU 0x2D EQU 0x2E EQU 0x2F EQU 0x30 EQU 0x31 EQU 0x32 ORG GOTO ORG RETFIE 0x00 PCONFIG 0x04

; ******************************************************************* ; Inicializao, Configurao das Portas e Perifricos do PIC PCONFIG BCF BCF CLRF CLRF CLRF CLRF CLRF BCF movlw movwf BSF STATUS,RP0 STATUS,RP1 PORTA PORTB PORTC PORTD PORTE STATUS,RP1 b'01000001' ADCON0 STATUS,RP0 ; ; ; ; ; ; ; Reseta Reseta Reseta Reseta Reseta Reseta Reseta BIT para BANK0 BIT para BANK0 as sadas da PORTA as sadas da PORTB as sadas da PORTC as sadas da PORTD as sadas da PORTE

; Reseta BIT para BANK0 ;liga AD canal 0 ;fosc/8 ; Seta BIT para BANK1 ; Carrega W com o valor 0x01 ; Config PORTA sada exceto RA0 ; ; ; ; ; Carrega W Configura Configura Configura Configura com o PORTB PORTC PORTD PORTE valor 0x00 como sada como sada como sada como sada

MOVLW 0x01 MOVWF TRISA (AN0-entrada analog.) MOVLW 0x00 MOVWF TRISB MOVWF TRISC MOVWF TRISD MOVWF TRISE MOVLW RA0 (AN0) MOVWF 0x0E ADCON1

; PORTA e PORTE como digitais, exceto ; valor justificado a esquerda

MOVLW MOVWF MOVLW MOVWF BCF

0xDF OPTION_REG 0x00 INTCON STATUS,RP0

; ; ; ;

Carrega W com o valor 0xDF Registro OPES (apostila) Carrega W com o valor 0x00 Desabilita as interrupes

; Reseta BIT para BANK0

; ******************************************************************* ; Rotina do LCD LCD CLRWDT MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL MOVLW CALL 0x38 ESCCOM 0x38 ESCCOM 0x06 ESCCOM 0x0C ESCCOM 0x01 ESCCOM 0x81 ESCCOM 'V' ESCDAD 'O' ESCDAD 'L' ESCDAD 'T' ESCDAD 'I' ESCDAD 'M' ESCDAD 'E' ESCDAD 'T' ESCDAD 'R' ESCDAD 'O' ESCDAD ' ' ESCDAD 'P' ESCDAD 'I' ESCDAD 'C' ESCDAD 0xC1 ESCCOM 'T' ESCDAD 'E' ESCDAD 'N' ESCDAD 'S' ESCDAD 'A' ESCDAD 'O' ESCDAD '=' ESCDAD ' ' ESCDAD 0xFF GDELAY 0xFF GDELAY ; Limpa o contador do WDT ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; Carrega W com Inicializao Carrega W com Inicializao Carrega W com Inicializao Carrega W com Inicializao o valor 0x38 do DISPLAY o valor 0x38 do DISPLAY o valor 0x06 do DISPLAY o valor 0x0C do DISPLAY

Carrega W com o valor 0x01 Limpa o DISPLAY Carrega W com o valor 0x84 Posiciona linha 1 coluna 4 Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve W D W A W T W A W P W O W O W L W L W L W L W P W I W C com o caracter no DISPLAY com o caracter no DISPLAY com o caracter no DISPLAY com o caracter no DISPLAY com o caracter no DISPLAY com o caracter no DISPLAY com o caracter no DISPLAY com o caracter no DISPLAY com o caracter no DISPLAY com o caracter no DISPLAY com o caracter no DISPLAY com o caracter no DISPLAY com o caracter no DISPLAY com o caracter no DISPLAY V O L T I M E T R O ESPAO P I C

; Carrega W com o valor 0xC4 ; Posiciona linha 2 coluna 2 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Escreve Carrega Chamada Carrega Chamada W com o caracter T T no DISPLAY W com o caracter E E no DISPLAY W com o caracter N N no DISPLAY W com o caracter S S no DISPLAY W com o caracter A A no DISPLAY W com o caracter O O no DISPLAY W com o caracter = = no DISPLAY W com o caracter ESPAO ESPAO no DISPLAY o tempo de delay da subrotina GDELAY o tempo de delay da subrotina GDELAY

MOVLW CALL GOTO

0xFF GDELAY loop ;LCD

; Carrega o tempo de delay ; Chamada da subrotina GDELAY ; Retorna ao nome LCD

; ******************************************************************* ; Rotina para Escrever Comandos no Display ESCCOM BCF BSF MOVWF BCF MOVLW CALL RETURN RS EN PORTD EN 0x12 GDELAY ; ; ; ; ; ; ; Reseta BIT indicado por RS Seta o BIT indicado por EN Escreve valor W no DISPLAY Reseta BIT indicado por EN Carrega o tempo de delay Chamada da subrotina GDELAY Retorno de subrotina

; ******************************************************************* ; Rotina para Escrever Dados no Display ESCDAD BSF BSF MOVWF BCF MOVLW CALL RETURN RS EN PORTD EN 0x06 GDELAY ; Seta o BIT indicado por RS ; Seta o BIT indicado por EN ; Escreve valor W no DISPLAY ; Reseta BIT indicado por EN ; Carrega o tempo de delay ; Chamada da subrotina GDELAY ; Retorno de subrotina

; ******************************************************************* ; Rotina de Delay Varivel GDELAY MOVWF MOVLW MOVWF CLRWDT DECFSZ 0x00. GOTO DECFSZ 0x00. GOTO RETURN $-06 ; Retorna 6 instrues ; Retorno de subrotina $-02 TEMPOG,F ; Retorna 2 instrues ; Decrementa TEMPOG e pula 1 ; instruo se igual a TEMPOG 0xFF TEMPOP TEMPOP,F ; Carrega TEMPOG com valor W ; Carrega W com o valor 0xFF ; Carrega TEMPOP com valor W ; Limpa o contador do WDT ; Decrementa TEMPOP e pula 1 ; instruo se igual a

; ******************************************************************* loop bsf ADCON0, GO_DONE ;colhe dado do canal analgico espera_ad: btfsc goto movf movwf movlw movwf call movf movwf movf movwf clrf movlw movwf call movf call movlw call ADCON0, GO_DONE ;testa para ver se dado pronto espera_ad ;dado ainda no pronto, continua teste ADRESH,W mulplr 0xFA mulcnd mpy_F H_byte,W ACCbHI L_byte,W ACCbLO ACCaHI 0xff ACCaLO D_divF ACCbLO,W AJUSTE_DECIMAL ;carrega valor da converso em "W" ;carrega mulplr com contedo de "W" ;.250 ;carrega com 250 decimal mulcnd ;para adaptar a leitura (fundo de escala 25V) ;chama rotina de multiplicao ;salva resutado da multiplicao ;em ACCb para ser usado na ;rotina de diviso ;carrega ACCa com 255 decimal (fundo de ;escala do conversor A/D ;(Converso em 8 bits) ;chama rotina de diviso ;pega resultado da diviso ;faz ajuste decimal ;comando para posicionar o cursor ;na linha 2, coluna 9

0XC9 ESCCOM ; SEND_CMD

movf addlw call movf addlw call movlw call movf addlw call movlw CALL goto

DEZENA2,W 0X30 ESCDAD ; SEND_CHAR DEZENA1,W 0X30 ESCDAD ; SEND_CHAR ',' ESCDAD ; SEND_CHAR UNIDADE,W 0X30 ESCDAD ; SEND_CHAR 'V' ESCDAD ; SEND_CHAR loop

;converte BCD da DEZENA2 em ASCII ;envia para LCD ;converte BCD da DEZENA1 em ASCII ;envia para LCD ;escreve uma virgula no LCD ;envia para LCD ;converte BCD da INIDADE em ASCII ;envia para LCD ;escreve "V" no LCD ;envia para LCD ;faz eternamente

;********************************************************************** ;* Ajuste decimal ;* W [HEX] = dezena [DEC] ; unidade [DEC] ;* Conforme indicado no livro - "Conectando o PIC - Recursos avanados ;* Autores Nicols Csar Lavinia e David Jos de Souza ;* ;* Alterada por Mrcio Jos Soares para uso com nmeros com duas dezenas e uma unidade ;* ;* Esta rotina recebe um argumento passado pelo acumulador "W" e retorna nas variveis ;* DEZENA1, DEZENA2 e UNIDADE o nmero BCD correspondente ao parmetro passado. AJUSTE_DECIMAL: movwf clrf clrf clrf movf btfsc return ini_ajuste: incf movf xorlw btfss goto clrf movf xorlw btfss goto clrf incf goto incDez1: incf fim_ajuste: decfsz goto return DEZENA1,F AUX,F ini_ajuste ;Incrementa dezena1 ;Fim da converso ? ;No - volta para continuar ;sim, final da converso AUX UNIDADE DEZENA1 DEZENA2 AUX,F STATUS,Z ;salva valor a converter em AUX ;limpa unidade ;limpa dezena1 ;limpa dezena2 ;valor a converter = 0 ? ;sim - retorna ;No - incrementa unidade ;carrega W com valor em unidade ;unidade = 10 decimal ? ;no ;sim, limpa unidade UNIDADE ;carrega W com valor em dezena1 ;compara com nove ; ;no, valor menor que 9. Incrementa dezena 1 ;limpa dezena1 ;sim, incrementa dezena2 ;desvia

UNIDADE,F UNIDADE,W 0X0A STATUS,Z fim_ajuste UNIDADE DEZENA1,W 0x09 STATUS,Z incDez1 DEZENA1 DEZENA2,F fim_ajuste

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; * ROTINA DE DIVISO by Microchip - AN544 * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;**************************************************************************** ; Double Precision Division ;**************************************************************************** ; Division : ACCb(16 bits) / ACCa(16 bits) -> ACCb(16 bits) with ; Remainder in ACCc (16 bits)

; (a) Load the Denominator in location ACCaHI & ACCaLO ( 16 bits ) ; (b) Load the Numerator in location ACCbHI & ACCbLO ( 16 bits ) ; (c) CALL D_divF ; (d) The 16 bit result is in location ACCbHI & ACCbLO ; (e) The 16 bit Remainder is in locations ACCcHI & ACCcLO ;**************************************************************************** D_divF MOVLW MOVWF MOVF MOVWF MOVF MOVWF CLRF CLRF CLRF CLRF DIV BCF RLF RLF RLF RLF MOVF SUBWF BTFSS GOTO MOVF SUBWF NOCHK BTFSS GOTO MOVF SUBWF BTFSS DECF MOVF SUBWF BSF em b NOGO RLF RLF DECFSZ GOTO RETURN temp,F DIV ACCbLO,F ACCbHI,F ;fim da diviso ? ;no - volta para DIV ;sim, ento retorna STATUS,C NOGO ACCaLO,W ACCcLO,F STATUS,C ACCcHI,F ACCaHI,W ACCcHI,F STATUS,C ;carry setado se c>a ;c-a. Resposta em c STATUS,C ACCdLO,F ACCdHI,F ACCcLO,F ACCcHI,F ACCaHI,W ACCcHI,W STATUS,Z NOCHK ACCaLO,W ACCcLO,W ;verifica se a>c 0x10 temp ACCbHI,W ACCdHI ACCbLO,W ACCdLO ACCbHI ACCbLO ACCcHI ACCcLO ;.16 ;carrega contador para diviso

;salva ACCb em ACCd ;limpa ACCb ;limpa ACCc

;se bit msb igual, ento verifica lsb

;shift de 1. Resultado

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; * ROTINA DE MULTIPLICAO by Microchip - AN544 * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;**************************************************************************** ; 8x8 Software Multiplier ; ( Fast Version : Straight Line Code ) ;**************************************************************************** ; ; The 16 bit result is stored in 2 bytes ; Before calling the subroutine " mpy ", the multiplier should ; be loaded in location " mulplr ", and the multiplicand in ; " mulcnd " . The 16 bit result is stored in locations ; H_byte & L_byte. ; Performance : ; Program Memory : 37 locations ; # of cycles : 38 ; Scratch RAM : 0 locations ;******************************************************************* ; ******************************************** ; Define a macro for adding & right shifting ; ******************************************** mult MACRO bit ;Inicio da macro mult

BTFSC ADDWF RRF RRF ENDM

mulplr,bit H_byte,F H_byte,F L_byte,F ;fim da macro

; ***************************** ; Begin Multiplier Routine ; ***************************** mpy_F CLRF CLRF MOVF BCF Reg. mult mult mult mult mult mult mult mult 0 1 2 3 4 5 6 7 H_byte L_byte mulcnd,W STATUS,C ; move the multiplicand to W reg. ; Clear carry bit in the status

movf H_byte,0 movf L_byte,0 movwf mulcnd RETURN ; RETORNA

; Fim de Programa END