Você está na página 1de 15

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

;* NOME LCD TESTE *


;* CEDUP-CURSO ELETRONICA *
;* DESENVOLVIDO POR FERNANDO DALMOLIN *
;* VERSAO 1.0 DATA 18/08/2020 *
;*
;*******************************************************************************
;* NOME DO PROJETO DISPLAY LCD *
;*******************************************************************************

;* MODELO PARA PIC 16F628A *


;*******************************************************************************
;* ARQUIVOS DE DEFINICAO *
;*******************************************************************************
#INCLUDE <P16F628A.INC> ;ARQUIVO PADRAO MICROCHIP PARA 16F628A

__CONFIG _BOREN_ON&_CP_OFF&_PWRTE_ON&_WDT_OFF&_LVP_OFF&_MCLRE_ON&_XT_OSC

;_CP_OFF ==> MEMORIA DE PROGRAMA DESPROTEGIDA CONTRA LEITURA


;_CPD_OFF ==> MEMORIA EEPROM PROTEGIDA CONTRA LEITURA
;_DEBUG_OFF ==> DEBUG DESATIVADO
;_LVP_OFF ==> PROGRAMACAO EM BAIXA TENSAO DESABILITADA
;_WRT_OFF ==> SEM PERMISSAO PARA ESCREVER NA MEMORIA DE PROGRAMA
;_BODEN_ON ==> BROWN-OUT ATIVADO
;_PWRTE_ON ==> POWER-ON RESET ATIVADO
;_WDT_ON ==> WDT ATIVADO
;_MCLRE_ON ==> PARA MASTER CLEAR EXTERNO ATIVADO
;_MCLRE_OFF ==> PARA MASTER CLEAR EXTERNO DESATIVADO
;_XT_OSC ==> OSCILADOR A CRISTAL (4MHz)
;_HS_OSC ==> OSCILADOR A CRISTAL (20MHz)

;*******************************************************************************
;* PAGINACAO DE MEMORIA *
;*******************************************************************************
BANK0 MACRO ;MACRO PARA SELECAO DO BANCOO
BCF STATUS,RP0 ;IMPOE 0 NO BIT 5 DO REGISTRADOR STATUS
BCF STATUS,RP1 ;IMPOE O NO BIT 6 DO REGISTRADOR STATUS
ENDM ;FIM DE MACRO
BANK1 MACRO ;MACRO PARA SELECAO DO BANCO 1
BSF STATUS,RP0 ;IMPOE 1 NO BIT 5 DO REGISTRADOR STATUS
BCF STATUS,RP1 ;IMPOE O NO BIT 6 DO REGISTRADOR STATUS
ENDM ;FIM DE MACRO
BANK2 MACRO ;MACRO PARA SELECAO DO BANCO 2
BCF STATUS,RP0 ;IMPOE 0 NO BIT 5 DO REGISTRADOR STATUS
BSF STATUS,RP1 ;IMPOE 1 NO BIT 6 DO REGISTRADOR STATUS
ENDM ;FIM DE MACRO
BANK3 MACRO ;MACRO PARA SELECAO DO BANCO 3
BSF STATUS,RP0 ;IMPOE 1 NO BIT 5 DO REGISTRADOR STATUS
BSF STATUS,RP1 ;IMPOE 1 NO BIT 6 DO REGISTRADOR STATUS
ENDM ;FIM DE MACRO
;******************************************************************************
;* VARIAVEIS *
;******************************************************************************
CBLOCK 0x20 ;ENDERECO INICIAL DA MEMORIA DE STATUS
W_TEMP
STATUS_TEMP
TEMPO0 ;VARIAVEL DE TEMPO DA ROTINA DELAY_MS
TEMPO1 ;VARIAVEL DE TEMPO DA ROTINA DELAY_MS
TMPLCDREGISTER:2 ;VARIAVEL TMPLCDREGISTER 2 BYTES
DEZESEIS1
DEZESEIS2
VAR1
VAR2
MAX
MIN
FLAG01 ;FLAG O1 REGISTRADOR DE FLAGS
ENDC ;FIM DO BLOCO DE MEMORIA
;******************************************************************************
;* FLAGS INTERNOS *
;******************************************************************************
; DEFINICAO DE TODOS OS FLAGS DO SISTEMA
;
;******************************************************************************
;* CONSTANTES *
;******************************************************************************
;NOME DA VARIAVEL EQU LITERAL
;******************************************************************************
;* DEFINCAO DAS ENTRADAS *
;******************************************************************************

#DEFINE BOTAO_LD PORTB,7 ;Define como L/D o bit 7 do PORTB.


#DEFINE BT_MENU PORTB,6 ;Define como BOTAO_MENU o bit 6 do PORTB.
#DEFINE BT_INC1 PORTB,5 ;Define como BOTAO_INC o bit 5 do PORTB.
#DEFINE BT_INC2 PORTB,4 ;Define como BOTAO_DEC o bit 4 do PORTB.
#DEFINE BT_ENTER PORTB,3 ;Define como BOTAO_ENTER o bit 3 do PORTB.

;******************************************************************************
; DEFINICAO DAS SAIDAS *
;******************************************************************************
#DEFINE LCD_RS PORTB,1 ;DEFINE LCD_RS COMO BIT1 DO PORTB
#DEFINE LCD_E PORTB,0 ;DEFINE LCD_E COMO BIT0 DO PORTB
#DEFINE LCD_DB4 PORTA,0 ;DEFINE LCD_DB4 COMO BIT2 DO PORTA
#DEFINE LCD_DB5 PORTA,1 ;DEFINE LCD_DB5 COMO BIT4 DO PORTA
#DEFINE LCD_DB6 PORTA,2 ;DEFINE LCD_DB6 COMO BIT6 DO PORTA
#DEFINE LCD_DB7 PORTA,3 ;DEFINE LCD_DB7 COMO BIT7 DO PORTA
;******************************************************************************
; VETOR DE RESET *
;******************************************************************************
ORG 0X00 ;ENDERECO INICIAL DE PROCESSAMENTO
GOTO INICIO ;IR PARA O INICIO
;******************************************************************************
;* INICIO DA INTERRUPCAO *
;******************************************************************************
ORG 0x04 ;ENDERECO INICIAL DA INTERRUPCAO
MOVWF W_TEMP ;COPIA W PARA W_TEMP
SWAPF STATUS,W ;SWAPF NO VALOR DE STATUS E GUARDA EM W
MOVWF STATUS_TEMP ;MOVE VALOR DE W PARA SATATUS_TEMP
;******************************************************************************
;* ROTINA DE INTERRUPCAO *
;******************************************************************************
;AQUI SERAO ESCRITAS AS ROTINAS DE RECONHECIMENTO E TRATAMENTO DAS INTERRUPCOES
;******************************************************************************
;* ROTINA DE SAIDA DE INTERRUPCAO *
;******************************************************************************
SAI_INT
SWAPF STATUS_TEMP,W ;SWAPF NO VALOR DE STATUS E GUARDA EM W
MOVWF STATUS ;MOVE STATUS_TEMP PARA STATUS
SWAPF W_TEMP,F ;SWAPF NO VALOR DE W_TEMP E GUARDA EM F
SWAPF W_TEMP,W ;MOVE W_TEMP PARA W
RETFIE ;FINAL DA ITERRUPCAO
;******************************************************************************
;* ROTINAS *
;******************************************************************************
DELAY_50MS
MOVLW .99 ;MOVE LITERAL PARA W
MOVWF TEMPO0 ;MOVE VALOR DE W PARA O ARQUIVO TEMPO0
LOOP1 ;MARCADOR
MOVLW .167 ;MOVE VALOR DE LITERAL PARA W
MOVWF TEMPO1 ;MOVE VALOR DE W PARA O ARQUIVO TEMPO
LOOP2 ;MARCADOR
DECFSZ TEMPO1,F ;DECREMENTA VARIAVEL TEMPO1, E GUARDA NELA MESMA
GOTO LOOP2 ;RETORNA PARA O LOOP 2
DECFSZ TEMPO0,F ;DECREMENTA VARIAVEL TEMPO0, E GUARDA NELA MESMA
GOTO LOOP1 ;RETORNA PARA O LOOP 1
RETURN ;ENCERRA ROTINA

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * ROTINA DE DELAY (DE 1MS AT� 256MS) *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA � UMA ROTINA DE DELAY VARI�VEL, COM DURA��O DE 1MS X O VALOR PASSADO
; EM WORK (W).
; EXEMPLO DE 250MS
; MOVLW .250
; CALL DELAY_MS
; EXEMPLO DE 50MS
; MOVLW .50
; CALL DELAY_MS

DELAY_MS
MOVWF TEMPO1 ;CARREGA TEMPO1 (UNIDADES DE 10MS)

LOOP4
MOVLW .198
MOVWF TEMPO0 ;MOVE VALOR DE W PARA O ARQUIVO TEMPO
LOOP3
DECF TEMPO0,F
MOVF TEMPO0,W
BTFSS STATUS,Z
GOTO LOOP3
NOP ;1us
NOP ;1us
NOP ;1us
NOP ;1us
DECFSZ TEMPO1,F ; FIM DE TEMPO1 ?
GOTO LOOP4 ; N�O - VOLTA 11 INSTRU��ES
; SIM
RETURN ; RETORNA
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * ROTINA DE DELAY DE 1S *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

DELAY_1S
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
RETURN ;ENCERRA ROTINA
;******************************************************************************
;* SUBROTINAS *
;******************************************************************************

;**********************************************************************
; SUBROTINAS PARA ESCRITA EM LCD 16X2, COMUNICACAO A 4 BITS
; INIT LCD
; THIS SUBROUTINE MUST BE CALLED BEFORE EACH OTHER LCD SUBROUTINE
;**********************************************************************
LCDINIT
MOVLW 30 ;WAIT 30 MS
CALL DELAY_MS
;****************
; RESET SEQUENCE
;****************

BCF LCD_RS ;SET LCD COMMAND MODE

;SEND A RESET SEQUENCE TO LCD

BSF LCD_DB4
BSF LCD_DB5
BCF LCD_DB6
BCF LCD_DB7
BSF LCD_E ;ENABLES LCD
MOVLW 5 ;WAIT 5 MS
CALL DELAY_MS
BCF LCD_E ;DISABLES LCD
MOVLW 1 ;WAIT 1MS
CALL DELAY_MS
BSF LCD_E ;ENABLES LCD
MOVLW 1 ;WAIT 1MS
CALL DELAY_MS
BCF LCD_E ;DISABLES LCD
MOVLW 1 ;WAIT 1MS
CALL DELAY_MS
BSF LCD_E ;ENABLES E
MOVLW 1 ;WAIT 1MS
CALL DELAY_MS
BCF LCD_E ;DISABLES E
MOVLW 1 ;WAIT 1MS
CALL DELAY_MS
BCF LCD_DB4
BSF LCD_DB5
BCF LCD_DB6
BCF LCD_DB7
BSF LCD_E ;ENABLES LCD
MOVLW 1 ;WAIT 1MS
CALL DELAY_MS
BCF LCD_E ;DISABLED LCD
MOVLW 1 ;WAIT 1MS
CALL DELAY_MS

;SET 4 BIT DATA BUS LENGTH


MOVLW 28H;00101000
CALL LCDSENDCOMMAND

;ENTRY MODE SET, INCREMENT, NO SHIFT

MOVLW 06H;00000110
CALL LCDSENDCOMMAND

GOTO LCD01
;DISPLAY ON, CURSON ON, BLINK OFF

;GOTO LCD01
;GOTO LCD02
LCD01 ;DISPLAY ON, CURSON OFF, BLINK OFF
MOVLW 0CH
CALL LCDSENDCOMMAND
;CLEAR DISPLAY
; CALL LCDCLEAR
RETURN
LCD02 ;DISPLAY ON, CURSOR OFF, PULSANTE BLOCO NEGRO
MOVLW 0DH
CALL LCDSENDCOMMAND
;CLEAR DISPLAY
; CALL LCDCLEAR
RETURN
LCD03 ;DISPLAY ON, CURSOR ON, PULSANTE BLOCO NEGRO
MOVLW 0FH
CALL LCDSENDCOMMAND
;CLEAR DISPLAY
; CALL LCDCLEAR
RETURN
LCD04 ;DISPLAY ON, CURSOR ON, PULSANTE OFF
MOVLW 0EH
CALL LCDSENDCOMMAND
;CLEAR DISPLAY
; CALL LCDCLEAR
RETURN

;**********************************************************************
; CLEAR LCD
;**********************************************************************

LCDCLEAR
;CLEAR DISPLAY

MOVLW 01H
CALL LCDSENDCOMMAND
MOVLW 2 ;WAIT 2 MS
CALL DELAY_MS

;DD RAM ADDRESS SET 1ST DIGIT

MOVLW 80H;
CALL LCDSENDCOMMAND
RETURN

;**********************************************************************
; LOCATE CURSOR ON LCD
; W = D7-D4 ROW, D3-D0 COL
;**********************************************************************

LCDLOCATE
MOVWF TMPLCDREGISTER+0
MOVLW 80H
MOVWF TMPLCDREGISTER+1
MOVF TMPLCDREGISTER+0,W
ANDLW 0FH
IORWF TMPLCDREGISTER+1,F
BTFSC TMPLCDREGISTER+0,4
BSF TMPLCDREGISTER+1,6
MOVF TMPLCDREGISTER+1,W
CALL LCDSENDCOMMAND
RETURN

;**********************************************************************
; SEND A DATA TO LCD
;**********************************************************************

LCDSENDDATA
BSF LCD_RS
CALL LCDSENDBYTE
RETURN

;**********************************************************************
; SEND A COMMAND TO LCD
;**********************************************************************

LCDSENDCOMMAND
BCF LCD_RS
CALL LCDSENDBYTE
RETURN

;**********************************************************************
; SEND A BYTE TO LCD BY 4 BIT DATA BUS
;**********************************************************************

LCDSENDBYTE
;SAVE VALUE TO SEND

MOVWF TMPLCDREGISTER ;SEND HIGHTER FOUR BITS


BCF LCD_DB4
BCF LCD_DB5
BCF LCD_DB6
BCF LCD_DB7
BTFSC TMPLCDREGISTER,4
BSF LCD_DB4
BTFSC TMPLCDREGISTER,5
BSF LCD_DB5
BTFSC TMPLCDREGISTER,6
BSF LCD_DB6
BTFSC TMPLCDREGISTER,7
BSF LCD_DB7
BSF LCD_E ;ENABLES LCD
MOVLW 1 ;WAIT 1MS
CALL DELAY_MS
BCF LCD_E ;DISABLED LCD
MOVLW 1 ;WAIT 1MS
CALL DELAY_MS

;SEND LOWER FOUR BITS

BCF LCD_DB4
BCF LCD_DB5
BCF LCD_DB6
BCF LCD_DB7
BTFSC TMPLCDREGISTER,0
BSF LCD_DB4
BTFSC TMPLCDREGISTER,1
BSF LCD_DB5
BTFSC TMPLCDREGISTER,2
BSF LCD_DB6
BTFSC TMPLCDREGISTER,3
BSF LCD_DB7
BSF LCD_E ;ENABLES LCD
MOVLW 1 ;WAIT 1MS
CALL DELAY_MS
BCF LCD_E ;DISABLED LCD
MOVLW 1 ;WAIT 1MS
CALL DELAY_MS
RETURN

;
***********************************************************************************
*************************
;ALFABETO
LA
MOVLW 'A' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LB
MOVLW 'B' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LC
MOVLW 'C' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LD
MOVLW 'D' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LE
MOVLW 'E' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LF
MOVLW 'F' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LG
MOVLW 'G' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LH
MOVLW 'H' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LI
MOVLW 'I' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LJ
MOVLW 'J' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LL
MOVLW 'L' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LM
MOVLW 'M' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LN
MOVLW 'N' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LO
MOVLW 'O' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LP
MOVLW 'P' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LQ
MOVLW 'Q' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LR
MOVLW 'R' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LS
MOVLW 'S' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LT
MOVLW 'T' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LU
MOVLW 'U' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LV
MOVLW 'V' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LX
MOVLW 'X' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
LZ
MOVLW 'Z' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
L0
MOVLW '0' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
L1
MOVLW '1' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
L2
MOVLW '2' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
L3
MOVLW '3' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
L4
MOVLW '4' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
L5
MOVLW '5' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
L6
MOVLW '6' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
L7
MOVLW '7' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
L8
MOVLW '8' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
L9
MOVLW '9' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN

ESPACO
MOVLW ' ' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN
PONTO
MOVLW '.' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
RETURN

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;ROTINA QUE LIGA TODOS OS CARACTERES POR 3 SEGUNDOS
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
TESTA_LCD

MOVLW .16 ;VALOR REFERENTE A N� DE COLUNAS


MOVWF DEZESEIS1
MOVWF DEZESEIS2
CALL LCDINIT ;SALTA PARA SUBROTINA DE INICIALIZACAO DO LCD
MOVLW 0X00 ;MOVE O VALOR HEXADECIMAL 00 PARA WORK
CALL LCDLOCATE ;SALTA PARA SUBROTINA DE POSICIONAMENTO DO CURSOR NA
PRIMEIRA LINHA E COLUNA PRIMEIRA
LCD1
MOVLW 0XFF ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
DECFSZ DEZESEIS1,F
GOTO LCD1
MOVLW 0X10 ;MOVE O VALOR HEXADECIMAL 10 PARA WORK
CALL LCDLOCATE ;SALTA PARA SUBROTINA DE POSICIONAMENTO DO CURSOR NA
SEGUNDA LINHA E COLUNA PRIMEIRA
LCD2
MOVLW 0XFF ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
DECFSZ DEZESEIS2,F
GOTO LCD2
CALL DELAY_1S
;CALL LCDCLEAR

;MOSTRA NOME DO FABRICANTE

MOVLW 0X00 ;MOVE O VALOR HEXADECIMAL 04 PARA WORK


CALL LCDLOCATE ;SALTA PARA SUBROTINA DE POSICIONAMENTO
DO CURSOR NA PRIMEIRA LINHA E COLUNA UM
CALL ESPACO
CALL ESPACO
CALL LC
CALL LE
CALL LD
CALL LU
CALL LP
CALL ESPACO
CALL LT
CALL LI
CALL LM
CALL LB
CALL LO
CALL ESPACO
CALL ESPACO
CALL ESPACO
MOVLW 0X10 ;MOVE O VALOR HEXADECIMAL 10 PARA WORK
CALL LCDLOCATE ;SALTA PARA SUBROTINA DE POSICIONAMENTO
DO CURSOR NA SEGUNDA LINHA E COLUNA UM
CALL ESPACO
CALL ESPACO
CALL ESPACO
CALL ESPACO
CALL ESPACO
CALL ESPACO
CALL L2
CALL L0
CALL L2
CALL L0
CALL ESPACO
CALL ESPACO
CALL ESPACO
CALL ESPACO
CALL ESPACO
CALL ESPACO
CALL DELAY_1S
CALL LCDCLEAR ;LIMPA LCD
RETURN

;MOSTRA O MODELO DA MAQUINA E VERSAO DO PROGRAMA POR 3 SEGUNDOS NA PRIMEIRA LINHA


;MOSTRA O NUMERO DE SERIE NA SEGUNDA LINHA O NUMERO DE SERIE INICIOU EM 000100-XXXX
;OS XXXX E MES E ANO DE FABRICA?AO EX. 000101-0209 PRIMEIRA MAQUINA FABRICADA EM
FEVEREIRO DE 2009

VERSAO

MOVLW 0X00 ;MOVE O VALOR HEXADECIMAL 04 PARA WORK


CALL LCDLOCATE ;SALTA PARA SUBROTINA DE POSICIONAMENTO DO CURSOR NA
PRIMEIRA LINHA E COLUNA UM
CALL LD
CALL LA
CALL LL
CALL ESPACO
CALL L1
CALL L5
CALL L0
CALL L0
CALL ESPACO
CALL ESPACO
CALL ESPACO
CALL LV
CALL LE
CALL LR
CALL L0
CALL L0
MOVLW 0X10 ;MOVE O VALOR HEXADECIMAL 10 PARA WORK
CALL LCDLOCATE ;SALTA PARA SUBROTINA DE POSICIONAMENTO
DO CURSOR NA SEGUNDA LINHA E COLUNA UM
CALL LN
MOVLW 0XDF ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
CALL ESPACO
CALL L0
CALL L0
CALL L0
CALL L1
CALL L0
CALL L1
MOVLW '-' ;ENVIA O CARACTER PARA O WORK
CALL LCDSENDDATA ;SALTA PARA SUBROTINA DE ESCRITA NO LCD
CALL L0
CALL L2
CALL L0
CALL L9
CALL ESPACO
CALL ESPACO
CALL DELAY_1S
CALL LCDCLEAR ;LIMPA LCD
RETURN
;******************************************************************************
;INICIO DO PROGRAMA
INICIO
BANK1 ;ALTERA PARA O BANCO 1
MOVLW B'00000000' ;MOVE 1 PARA W
MOVWF TRISA ;DEFINE ENTRADAS E SAIDAS DO PORTA,
;1 ENTRADA, 0 SAIDA
MOVLW B'11111000' ;MOVE 1 PARA W
MOVWF TRISB ;DEFINE ENTRADAS E SAIDAS DO PORTB,
;1 ENTRADA, 0 SAIDA
MOVLW B'10000000' ;MOVE LITERAL PARA W
MOVWF OPTION_REG ;DEFINE OPCOES DE OPERACAO
MOVLW B'00000000' ;MOVE LITERAL PARA W
MOVWF INTCON ;DEFINE OPCOES DE INTERRUPCOES
BANK0 ;RETORNA PARA O BANCO
MOVLW B'00000111' ;MOVE LITERAL PARA W
MOVWF CMCON ;DEFINE O MODO DE OPERACAO DO
;COMPARADOR ANALOGICO
;******************************************************************************
;* INICIALIZACAO DAS VARIAVEIS *
;******************************************************************************

CLRF PORTA ;DESLIGAR TODAS DA SAIDAS DO PORTA


CLRF PORTB ;DESLIGAR TODAS DA SAIDAS DO PORTB
CLRF W_TEMP ;LIMPA O REGISTRADOR W_TEMP
CLRF STATUS_TEMP ;LIMPA O REGISTRADOR STATUS_TEMP
CLRF TEMPO0 ;LIMPA O REGISTRADOR TEMPO0
CLRF TEMPO1 ;LIMPA O REGISTRADOR TEMPO1
CLRF VAR1 ;LIMPA O REGISTRADOR VAR1
CLRF VAR2 ;LIMPA O REGISTRADOR VAR2
;CALL LCDINIT ;SALTA PARA SUBROTINA DE INICIALIZACAO DO LCD
CALL TESTA_LCD
;CALL VERSAO
;******************************************************************************
;* ROTINA PRINCIPAL *
;******************************************************************************
MOVLW 0X04 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW 0X00 ;MOVE O VALOR HEXADECIMAL PARA WORK
CALL LCDLOCATE
CALL LO
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW 0X00 ;MOVE O VALOR HEXADECIMAL PARA WORK
CALL LCDLOCATE
CALL LD
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW 0X00 ;MOVE O VALOR HEXADECIMAL PARA WORK
CALL LCDLOCATE
CALL LN
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
CALL LA
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
CALL LN
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
CALL LR
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
CALL LE
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
CALL LF
CALL DELAY_1S
CALL DELAY_1S
MOVLW 0X08 ;MOVE O VALOR HEXADECIMAL PARA WORK
CALL LCDLOCATE
MOVLW 0X06 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
CALL LE
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
CALL LT
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
CALL LS
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
CALL LE
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
CALL LT
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ;MOVE O VALOR HEXADECIMAL PARA WORK
CALL LCDLOCATE
MOVLW 0X04 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
CALL LE
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
CALL LT
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
CALL LS
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
CALL LE
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
CALL LT

MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X1C ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW .250
CALL DELAY_MS ;CHAMAR ROTINA DE TEMPO DE 250m SEGUNDOS;
MOVLW 0X18 ; DESLOCA O TEXTO PARA DIREITA
CALL LCDSENDCOMMAND
MOVLW 0X20 ;MOVE O VALOR HEXADECIMAL PARA WORK
CALL LCDLOCATE
CALL LD

MAIN

GOTO MAIN

;******************************************************************************
END ;FIM DA PROGRAMACAO

Você também pode gostar