Olá pessoal,
Este já é o segundo programa que estou tentando escrever no LCD 2 x 16
e não escreve.
O exemplo eu peguei no site abaixo:
http://igortg.cjb.net/
O programa foi escrito para o PIC 16F84 e eu estou usando o 16F84A na simulação com o Proteus.
Segue abaixo o código fonte e agradeço se puderem avaliar.
;***************************************************************************
;
; PROGRAMA PARA ESCRITA EM LCD
;
; DATA: 22/03/2001
;
; DESENVOLVIDO POR ÍGOR TSCHOEPKE GOEDEL - ESTAS ROTINAS PODEM SER
; USADAS LIVREMENTE, DESDE QUE SEMPRE SEJA CITADO O AUTOR.
;
; PROCESSADOR: PIC16F84
;
; COMUNICAÇÃO EM 4 BITS, SEM O USO DE DELAYS VIA SOFTWARE (PORTANTO,
; O CLOCK PODE SER ALTERADO SEM PROBLEMAS), POIS TODAS ROTINAS DE
; ENVIO DE DADOS, ENDEREÇOS OU COMANDOS SÓ RETORNAM QUANDO O BUSY FLAG
; DO LCD INDICAR QUE ESTE ESTÁ LIVRE.
;
; ESQUEMAS DE LIGAÇÃO:
;
; RB0: ESTE PINO É CONFIGURADO COMO ENTRADA (PODENDO TRABALHAR
; NORMALMENTE COM INTERRUPÇÕES), MAS PODE SER USADO COMO SAÍDA
; DESDE QUE SEJAM FEITAS AS DEVIDAS ALTERAÇÕES NO CÓDIGO
; RB1: SAÍDA, LIGADO AO PINO Nº 4 (RS) DO LCD
; RB2: SAÍDA, LIGADO AO PINO Nº 5 (RW) DO LCD
; RB3: SAÍDA, LIGADO AO PINO Nº 6 (E) DO LCD
; RB4: BIDIRECIONAL, LIGADO AO PINO Nº 11 (D4) DO LCD
; RB5: BIDIRECIONAL, LIGADO AO PINO Nº 12 (D5) DO LCD
; RB6: BIDIRECIONAL, LIGADO AO PINO Nº 13 (D6) DO LCD
; RB7: BIDIRECIONAL, LIGADO AO PINO Nº 14 (D7) DO LCD
;
;***************************************************************************
LIST P=16F84A ;INFORMA O PIC UTILIZADO
INCLUDE <P16F84A.INC>
__CONFIG _XT_OSC & _CP_OFF & _WDT_OFF & _PWRTE_ON
;DESLIGA A MENSAGEM DE AVISO Nº 302:
;"Register in operand not in bank 0. Ensure that bank bits are correct"
ERRORLEVEL -302
RS EQU 0X01 ;REGISTER SELECT 1 = DADO, 0 = INSTRUÇÃO
RW EQU 0X02 ;READ/WRITE 1 = LEITURA 0 = ESCRITA
E EQU 0X03 ;ENABLE
BF EQU 0X07 ;BUSY FLAG 1 = OCUPADO 0 = LIVRE
CBLOCK 0Ch
AUX1 ;AUX1 E AUX2 SÃO VARIÁVEIS AUXILIARES USADAS NAS
AUX2 ;SEGUINTES ROTINAS: 'EL' (ENVIA LINHA) E 'DELAY'
DADO ;VARIÁVEL QUE ARMAZENA O BYTE A SER TRANSMITIDO
ENDC
ORG 00H ;VETOR DE RESET
INICIO
BSF STATUS,RP0 ;VAI PARA O BANCO 1
MOVLW 0X00
MOVWF TRISA ;CONFIGURA O PORTA TODO COMO SAÍDA
MOVLW 0X01 ;CONFIGURA O PORTB: 0 = ENTRADA
MOVWF TRISB ;1, 2, 3, 4, 5, 6 E 7 COMO SAÍDAS
BCF STATUS,RP0 ;VOLTA PARA O BANCO 0
MOVLW 0X28 ;INÍCIO DA CONFIGURAÇÃO DO LCD
CALL EC ;CONFIGURA PARA:
MOVLW 0X28 ;DUAS LINHAS
CALL EC ;5 X 7 PONTOS
MOVLW 0X06 ;16 X 2 CARACTERES
CALL EC ;4 BITS
MOVLW 0X0C
CALL EC
MOVLW 0X01
CALL EC ;FIM DA CONFIGURAÇÃO DO LCD
MOVLW 0X40 ;COLOCA 'Í' NA CGRAM
CALL EC
MOVLW 0X02
CALL ED
MOVLW 0X04
CALL ED
MOVLW 0X1F
CALL ED
MOVLW 0X04
CALL ED
MOVLW 0X04
CALL ED
MOVLW 0X04
CALL ED
MOVLW 0X1F
CALL ED
MOVLW 0X00
CALL ED
ESCREVE
MOVLW 0X80 ;ENDEREÇA A DDRAM DO LCD PARA O
CALL EE ;1º CARACTER DA 1ª LINHA
MOVLW ' ' ;ENVIA UMA LINHA INTEIRA ATRAVÉS DA
CALL ED ;ROTINA 'ED' QUE ENVIA SÓ UM CARACTER
MOVLW ' '
CALL ED
MOVLW 'T'
CALL ED
MOVLW 'e'
CALL ED
MOVLW 's'
CALL ED
MOVLW 't'
CALL ED
MOVLW 'e'
CALL ED
MOVLW ' '
CALL ED
MOVLW 'd'
CALL ED
MOVLW 'e'
CALL ED
MOVLW ' '
CALL ED
MOVLW 'L'
CALL ED
MOVLW 'C'
CALL ED
MOVLW 'D'
CALL ED
MOVLW ' '
CALL ED
MOVLW ' '
CALL ED
MOVLW 0XC0 ;ENDEREÇA A DDRAM DO LCD PARA O
CALL EE ;1º CARACTER DA 2ª LINHA
MOVLW LINHA1 ;PÕE EM 'W' A POSIÇÃO DA TABELA 'LINHA1'
;QUE DEVE ESTAR NA 1ª PÁGINA DE MEMÓRIA
;E CONTÉM 16 CARACTERES (UMA LINHA)
CALL EL ;ESCREVE UMA LINHA INTEIRA ATRAVÉS DA
;ROTINA 'EL', QUE ENVIA TODA UMA LINHA
CALL DELAY ;DELAY DE 1,75 SEGUNDOS
MOVLW 0X80 ;ENDEREÇA A DDRAM
CALL EE
MOVLW LINHA2
CALL EL
MOVLW 0XC0
CALL EE
MOVLW LINHA3
CALL EL
CALL DELAY
GOTO ESCREVE
;******************************
;*** ROTINAS DO LCD ***
;******************************
ED ;ESCREVE DADO QUE ESTÁ EM 'W' NA DDRAM DO LCD
BSF PORTB,RS
BCF PORTB,RW
ENVIABYTE ;ROTINA PARA O ENVIO DE UM BYTE QUALQUER
BSF PORTB,E
MOVWF DADO
MOVLW 0X0F
ANDWF PORTB,F
MOVLW 0XF0
ANDWF DADO,W
IORWF PORTB,F
BCF PORTB,E
BSF PORTB,E
SWAPF DADO,F
MOVLW 0X0F
ANDWF PORTB,F
MOVLW 0XF0
ANDWF DADO,W
IORWF PORTB,F
BCF PORTB,E
CALL CHECABF
RETURN
EC ;ENVIA O COMANDO QUE ESTÁ EM 'W' PARA O LCD
BCF PORTB,RS
BCF PORTB,RW
CALL ENVIABYTE
RETURN
EE ;ESCREVE O ENDEREÇO QUE ESTÁ EM 'W' NO LCD
BCF PORTB,RS
BCF PORTB,RW
CALL ENVIABYTE
RETURN
CHECABF ;ROTINA QUE SÓ RETORNA QUANDO BF = 0
BSF STATUS,RP0 ;VAI PARA O BANCO 1
MOVLW 0XF1
MOVWF TRISB ;CONFIGURA O TRISB
BCF STATUS,RP0 ;VOLTA PARA O BANCO 0
BCF PORTB,RS
BSF PORTB,RW
BSF PORTB,E
BTFSS PORTB,BF ;TESTA BUSY FLAG
GOTO RETORNO ;SE BF = 0 VAI PARA A ROTINA DE RETORNO
BCF PORTB,E
BSF PORTB,E
BCF PORTB,E
GOTO $ - 6 ;LOOP PARA NOVO TESTE DO BUSY FLAG
RETORNO ;ROTINA PARA RETORNAR DE CHECABF
BCF PORTB,E
BSF PORTB,E
BCF PORTB,E
BSF STATUS,RP0 ;VAI PARA O BANCO 1
MOVLW 0X01
MOVWF TRISB ;CONFIGURA O TRISB
BCF STATUS,RP0 ;VOLTA PARA O BANCO 0
RETURN
EL ;ROTINA QUE ENVIA UMA LINHA INTEIRA PARA O LCD
;(SÓ FUNCIONA ADEQUADAMENTE PARA LCD's 16 X 2)
MOVWF AUX2 ;ESTA OTINA PODE SER EXCLUÍDA SEM ALTERAR AS
CLRF AUX1 ;OUTRAS ROTINAS DO LCD
DECF AUX1,F
EL1
INCF AUX1,F
BTFSC AUX1,4
RETURN
MOVF AUX2,W
ADDWF AUX1,W
CALL MSGS
CALL ED
GOTO EL1
MSGS MOVWF PCL ;'CABEÇALHO' DAS TABELAS DE CARACTERES
LINHA1 RETLW 'd' ;PRIMEIRA TABELA DE CARACTERES
RETLW 'e' ;PODEM SER FEITAS NOVAS TABELAS E
RETLW 's' ;ESTAS PODEM TER O SEU 'LABEL'
RETLW 'e' ;COM O NOME QUE SE QUISER
RETLW 'n'
RETLW 'v'
RETLW 'o'
RETLW 'l'
RETLW 'v'
RETLW 'i'
RETLW 'd'
RETLW 'o'
RETLW ' '
RETLW 'p'
RETLW 'o'
RETLW 'r'
;******************************
;*** FIM DAS ROTINAS DO LCD ***
;******************************
;ESTAS TABELAS SÃO SOMENTE EXEMPLOS, PODENDO SER
;EXCLUÍDAS SEM AFETARAS ROTINAS DE COMUNICAÇÃO
LINHA2 RETLW ' '
RETLW 0X00 ;CÓDIGO DO 'Í' PREVIAMENTE GRAVADO NA CGRAM
RETLW 'g'
RETLW 'o'
RETLW 'r'
RETLW ' '
RETLW 'T'
RETLW 's'
RETLW 'c'
RETLW 'h'
RETLW 'o'
RETLW 'e'
RETLW 'p'
RETLW 'k'
RETLW 'e'
RETLW ' '
LINHA3 RETLW ' '
RETLW ' '
RETLW ' '
RETLW ' '
RETLW ' '
RETLW 'G'
RETLW 'o'
RETLW 'e'
RETLW 'd'
RETLW 'e'
RETLW 'l'
RETLW ' '
RETLW ' '
RETLW ' '
RETLW ' '
RETLW ' '
DELAY ;DELAY DE APROXIMADAMENTE 1,75 SEGUNDOS
CLRF DADO ;ESTA ROTINA É USADA PARA PERDER TEMPO
DELAY1 ;ENTRE O ENVIO DAS TELAS, PODENDO SER
INCF DADO,F ;EXCLUÍDA SEM PREJUDICAR AS ROTINAS DE
BTFSC DADO,3 ;COMUNICAÇÃO COM O MÓDULO LCD
RETURN
MOVLW 0XFA
MOVWF AUX1
REPETE1
MOVLW 0XF9
MOVWF AUX2
REPETE2
NOP
DECFSZ AUX2,F
GOTO REPETE2
DECFSZ AUX1,F
GOTO REPETE1
GOTO DELAY1
END ;FIM DO PROGRAMA
Renato