Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
gabi.scarme

[Resolvido] Debug Display LCD 16x4 + PIC16F877A + Assembly

Recommended Posts

Caros, boa tarde.

Estou trabalhando em um mini-projeto que está me rendendo dores de cabeça, trata-se de um PIC16F877A controlando um LCD 16x4. Há inúmeros turoriais e dúvidas sanadas na internet, parece que estou fazendo uma tempestade em copo d'água, mas aí segue o meu problema:

O PIC controla um LCD para uma simples mensagem "LINHA 01, LINHA 02.". O código logo abaixo. A realidade é que era uma coisa bem mais complexa mas eu travei na parte de escrever no LCD.

Comecei tirando o que era desnecessário, deixando a simples rotina de inicializar o LCD, sobrou o seguinte:

; ARQUIVOS DE DEFINIÇÕES

#INCLUDE <P16F877A.INC>

__CONFIG _CP_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC & _CPD_OFF & _DEBUG_OFF & _WRT_OFF

; PAGINAÇÃO DE MEMÓRIA

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA

#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

; VARIÁVEIS

CBLOCK 0x20

TEMPO0

TEMPO1

TEMPO2

TEMPO3

TEMPO4

TEMPO5

ENDC

; Entradas/Saídas

#DEFINE DISPLAY PORTD

#DEFINE RS PORTE,2

#DEFINE ENABLE PORTE,1

#DEFINE LED_CONFERENTE PORTE,0

ORG 0x0000 ;ENDEREÇO INICIAL DE PROCESSAMENTO

GOTO CONFIGURA

; DEFINIÇÃO DAS ROTINAS COM A UTILIZAÇÃO DO CALL

DELAY_15MS

MOVLW .75

CALL DELAY_MS

RETURN

DELAY_10MS

MOVLW .50

CALL DELAY_MS

RETURN

DELAY_5MS

MOVLW .25

CALL DELAY_MS

RETURN

DELAY_100US

MOVLW .165

MOVWF TEMPO2

DECFSZ TEMPO2,F

GOTO $-1

RETURN

DELAY_1MS

MOVLW .5

CALL DELAY_MS

RETURN

DELAY_3MS

MOVLW .15

CALL DELAY_MS

RETURN

DELAY_1S

MOVLW .100

MOVWF TEMPO4

MANGA ; PURA FALTA DE CRIATIVIDADE

CALL DELAY_10MS

DECFSZ TEMPO4,F

GOTO MANGA

RETURN

DELAY_500MS

MOVLW .50

MOVWF TEMPO5

MANGA1

CALL DELAY_10MS

DECFSZ TEMPO5,F

GOTO MANGA1

RETURN

DELAY_100MS

MOVLW .10

MOVWF TEMPO3

MANGA2

CALL DELAY_10MS

DECFSZ TEMPO3

GOTO MANGA2

RETURN

DELAY_MS

MOVWF TEMPO1 ;COLOCA .1 NA VARIÁVEL TEMPO1

MOVLW .250 ;COLOCA .250 NA

MOVWF TEMPO0 ;VARIÁVEL TEMPO0

CLRWDT ;LIMPA O WDT PARA NÃO RESETAR.

DECFSZ TEMPO0,F ;DECREMENTA TEMPO0 E SE:

GOTO $-2 ; - TEMPO0 = 0 -> PULA 1 LINHA

; - TEMPO0 ? 0 -> VOLTA 2 LINHAS

DECFSZ TEMPO1,F ;DECREMENTA TEMPO1

GOTO $-6 ; - TEMPO1 = 0 -> PULA UMA LINHA

; - TEMPO1 ? 0 -> VOLTA 6 LINHAS

RETURN

;__________________________________________________________________

ESCREVE

MOVWF DISPLAY ;MOVE PARA 'DISPLAY' O QUE ESTAVA EM W

NOP

BSF ENABLE

CALL DELAY_100US

BCF ENABLE

;-------------------------------------

CALL DELAY_3MS ;DELAY DE 3MS

RETURN

;__________________________________________________________________

MOSTRA_TELA_PRINCIPAL

BCF RS

MOVLW 0X87

CALL ESCREVE

BSF RS

MOVLW 'L'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'N'

CALL ESCREVE

MOVLW 'H'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW '1'

CALL ESCREVE

MOVLW ','

CALL ESCREVE

BCF RS

MOVLW 0XC7

CALL ESCREVE

BSF RS

MOVLW 'L'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'N'

CALL ESCREVE

MOVLW 'H'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW '2'

CALL ESCREVE

MOVLW '.'

CALL ESCREVE

; TRANSFORMADO EM 16X2 PARA TESTE EM OUTROS LCD'S

; BCF RS

; MOVLW 0X9D

; CALL ESCREVE

; BSF RS

; MOVLW '3'

; CALL ESCREVE

; MOVLW ','

; CALL ESCREVE

; BCF RS

; MOVLW 0XDD

; CALL ESCREVE

; BSF RS

; MOVLW '4'

; CALL ESCREVE

; MOVLW '.'

; CALL ESCREVE

RETURN

;* CONFIGURAÇÕES PRINCIPAL

CONFIGURA

BANK1

MOVLW B'11111111'

MOVWF TRISA

MOVLW B'11111111'

MOVWF TRISB

MOVLW B'11111111'

MOVWF TRISC

MOVLW B'00000000'

MOVWF TRISD

MOVLW B'00000000'

MOVWF TRISE

MOVLW B'11011111'

MOVWF OPTION_REG

MOVLW B'00000000'

MOVWF INTCON

MOVLW B'00000111'

MOVWF ADCON1

BANK0

MOVLW B'11111111'

MOVWF PORTA

MOVLW B'11111111'

MOVWF PORTB

MOVLW B'11111111'

MOVWF PORTC

CLRF PORTD

CLRF PORTE

; INICIALIZAÇÃO DAS VARIÁVEIS

;_______________________

MOVLW 0X20

MOVWF FSR

LIMPA_RAM ;ROTINA ACONSELHADA PELO LIVRO PRA LIMPAR A RAM DO BANK0

CLRF INDF

INCF FSR,F

MOVF FSR,W

XORLW 0X80

BTFSS STATUS,Z

GOTO LIMPA_RAM

;_______________________

INICIALIZACAO_DISPLAY

CALL DELAY_100MS

BCF RS

MOVLW 0X30

CALL ESCREVE

CALL DELAY_5MS

MOVLW 0X30 ; ENVIA 3 VEZES 0X30: EXIGIDO PELO DISPLAY

CALL ESCREVE

MOVLW 0X30

CALL ESCREVE

MOVLW B'00111000'

CALL ESCREVE

MOVLW B'00000001'

CALL ESCREVE

CALL DELAY_1MS

MOVLW B'00001100'

CALL ESCREVE

MOVLW B'00000110'

CALL ESCREVE

BSF RS

; PROGRAMA PRINCIPAL

MAIN

CALL MOSTRA_TELA_PRINCIPAL

CALL DELAY_1S

BCF LED_CONFERENTE

CALL DELAY_1S

CALL DELAY_1S

BSF LED_CONFERENTE

CALL DELAY_1S

CALL DELAY_1S

GOTO MAIN

END

Aí tem o esquema elétrico, nada muito exagerado.

Agora,a minha dúvida é:

Na prática, eu testei os sinais de RS e Enable no osciloscópio, conferi se havia algo invertido, testei de chegava alguma coisa no barramento de dados (DB0 ~ DB7) e na hora de ligar, adivinha só: não funcionou. Tudo o que apareceu foram duas linhas de pixels no LCD 16x4 e absolutamente nada no 16x2.

Tentei de tudo o que eu pude imaginar, busquei outras formas de inicialização, outra rotina de escrita, simulei tudo no MPLAB, Proteus, mas nada funcionou.

Tentei mudar o 16x4 pra 16x2 mas não consegui tambem. Tentei mudar o valor do pot na alimentação do LCD, nada tambem. Tudo o que eu consegui foi queimar um PIC de forma que não imagino qual.

Alguem me sugere alguma coisa mais?

Alguém já viu isso?

Informações:

PIC16f877a

LCD16x4 não sei que marca, é algum produto chinês que compraram pra mim na empresa, mas a pinagem é sequencial de 1a16

cristal 20MHz.

post-1049552-13884965983493_thumb.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, vamos pensar, afinal LCD 16x2 só parece um problema.

Primeiro, ná prática, uma coisa que costumo fazer é pegar o pino VEE e aterrar, para ter certeza que não é o contraste do LCD que está a me tapear.

Sua rotina não me parece estar errada, a unica coisa que sugiro no seu código é que faça todas as operações dentro da subrotina...por exemplo:



;Rotina para escrever o dado

escreve:

bsf RS ;sobe linha RS
bcf EN ;desce linha enable

movwf PORTD; coloca dado no BUS
bsf EN ; levanta Enble

nop
nop
nop

bcf EN ; levanta pino de enable

bsf TRISD,7; transforma RD7 em entrada para ler o busy flag
bsf PORTD,7; deixa ele elvantado


bcf RS ; desce pino RS para modo comando
BSF RW ; sim nos vamos ler


BSF EN ;habilita o display

btfsc PORTD,7 ; le o bit
goto $-1 ; ($ - 2 se for PIC18)

;opa, terminou de ler
BCF EN; desliga display
BCF RS; desliga RS

BCF TRISD,7; RD7 é saida de novo

RETURN; encerra funcao


Veja, faco tudo dentro da subrotina, nem de delay preciso pois leio o busy flag do LCD que é mais preciso e da menos trabalho.

Assim para eu chamar minhas subrotinas faço:



.
.
.
MOVLW 'C' ; Move o caracter C para W
CALL ESCREVE ; Escreve no LCD sem se preocupar com delay pinos
;nem nada

.
.

A sub de escrita de comandos é igualzinha apenas atente se que para isso o RS permanece o tempo todo em ´0´.

Duvidas estamos ai, pergunte!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

?ui=2&ik=c51e6f59c7&view=att&th=13f19a55876467f0&attid=0.1&disp=inline&safe=1&zw&saduie=AG9B_P87z7TgxmIjM4EvsTjqcfil&sadet=1370525332691&sads=KgTGQ2KnT3mizOOGhNa4Nag6hmY&sadssc=1

Essa foto eu tirei inclusive depois de fazer as alterações indicadas pelo Felipe_Eletronic :(

ainda não funcionou, vou conferir as ligações novamente.

Você saberia me dizer se a rotina de inicialização tambem pode ser feita com a leitura do Busy Flag?

E vtrx, essa é a imagem do Display gêmeo do que está no protoboard?ui=2&ik=c51e6f59c7&view=att&th=13f19b041ca678e1&attid=0.1&disp=inline&safe=1&zw&saduie=AG9B_P87z7TgxmIjM4EvsTjqcfil&sadet=1370525586545&sads=78h1n-8QapCn9CU51SuU5RE6OOY

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, é o mesmo, se formos pensar em camadas,

A rotina de inicialização é uma camada superior pois ela depende da função de comando do LCD.

Eu tenho um driver em Assembly para PIC16, para o mesmo display que funciona perfeitamente mas so poderei postar a noite pois não esta nesse micro.

Ja verificou com um osciloscopio se as linhas RS e EN estão mudando de estado, pode ser que seu PIC sequer tenha partido e oLCD levando a culpa.

Abs.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

E vtrx, essa é a imagem do Display gêmeo do que está no protoboard

A foto 'real' pois tem modelos que os pinos não estão na mesma ordem que está no proteus no Proteus.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você mudou o código para verificar o Busy Flag? Se sim, poste o novo código.

No código que você postou inicialmente, o delay depois da instrução para limpar o display é de 1 ms, mas, o display costuma demorar 1,5 ms para executar essa instrução.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Felipe, no simulador ele não funciona com esse trecho que você me passou, mas com o que eu estava usando foi mais ou menos como na imagem. Eu já tinha conferido na prática, funciona o RS e o EN sim..aí quando eu tento simular no proteus a dica que você me passou aparecem essas mensagens que não entendi como aconteceram.

Então vtrx, sei que ficam diferentes, já usei display que começa no 16, vai até o 15, começa o 1 e vai até o 14...é estranho sim, mas eu verifiquei bem isso...duvido um pouco que seja pinagem o problema.

post-1049552-1388496598653_thumb.jpg

post-1049552-1388496598677_thumb.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mulder_Fox,

Seguindo seu conselho, alterei o delay para limpar o display,

aí segue o código com delay e teste de busy flag.

;* PAGINAÇÃO DE MEMÓRIA *

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA

#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* VARIÁVEIS *

CBLOCK 0x20

TEMPO0

TEMPO1

TEMPO2

TEMPO3

TEMPO4

TEMPO5

ENDC

;* SAÍDAS *

#DEFINE DISPLAY PORTD

#DEFINE RS PORTE,2

#DEFINE ENABLE PORTE,1

#DEFINE RW PORTE,0

#DEFINE LED_CONFERENTE PORTC,5

;* VETOR DE RESET *

ORG 0x0000 ;ENDEREÇO INICIAL DE PROCESSAMENTO

GOTO CONFIGURA

;* DEFINIÇÃO DAS ROTINAS COM A UTILIZAÇÃO DO CALL *

DELAY_15MS

MOVLW .75

CALL DELAY_MS

RETURN

DELAY_10MS

MOVLW .50

CALL DELAY_MS

RETURN

DELAY_5MS

MOVLW .25

CALL DELAY_MS

RETURN

DELAY_100US

MOVLW .165

MOVWF TEMPO2

DECFSZ TEMPO2,F

GOTO $-1

RETURN

DELAY_1MS

MOVLW .5

CALL DELAY_MS

RETURN

DELAY_2MS

MOVLW .10

CALL DELAY_MS

RETURN

DELAY_3MS

MOVLW .15

CALL DELAY_MS

RETURN

DELAY_1S

MOVLW .100

MOVWF TEMPO4

MANGA

CALL DELAY_10MS

DECFSZ TEMPO4,F

GOTO MANGA

RETURN

DELAY_500US

MOVLW .50

MOVWF TEMPO5

MANGA1

CALL DELAY_10MS

DECFSZ TEMPO5,F

GOTO MANGA1

RETURN

DELAY_100MS

MOVLW .10

MOVWF TEMPO3

MANGA2

CALL DELAY_10MS

DECFSZ TEMPO3

GOTO MANGA2

RETURN

DELAY_MS

MOVWF TEMPO1 ;COLOCA .1 NA VARIÁVEL TEMPO1

MOVLW .250 ;COLOCA .250 NA

MOVWF TEMPO0 ;VARIÁVEL TEMPO0

CLRWDT ;LIMPA O WDT PARA NÃO RESETAR.

DECFSZ TEMPO0,F ;DECREMENTA TEMPO0 E SE:

GOTO $-2 ; - TEMPO0 = 0 -> PULA 1 LINHA

; - TEMPO0 ? 0 -> VOLTA 2 LINHAS

DECFSZ TEMPO1,F ;DECREMENTA TEMPO1

GOTO $-6 ; - TEMPO1 = 0 -> PULA UMA LINHA

; - TEMPO1 ? 0 -> VOLTA 6 LINHAS

RETURN

;__________________________________________________________________

ESCREVE

; MOVWF DISPLAY ;MOVE PARA 'DISPLAY' O QUE ESTAVA EM W

; NOP

; BSF ENABLE

; CALL DELAY_100US

; BCF ENABLE

;-------------------------------------

; CALL DELAY_3MS ;DELAY DE 3MS

; RETURN

;Rotina para escrever o dado

BSF RS ;sobe linha RS

BCF ENABLE ;desce linha enable

MOVWF PORTD ; coloca dado no BUS

BSF ENABLE ; levanta Enble

NOP

NOP

NOP

BCF ENABLE ; levanta pino de enable

BSF TRISD,7 ; transforma RD7 em entrada para ler o busy flag

BSF PORTD,7 ; deixa ele elvantado

; ALTERAR O TRISD,7 ANTES DE UM DELAY BÁSICO NÃO VAI INTERFERIR NOS DADOS QUE O DISPLAY ESTÁ RECEBENDO?

BCF RS ; desce pino RS para modo comando

BSF RW ; sim nos vamos ler

BSF ENABLE ;habilita o display

BTFSC PORTD,7 ; le o bit

GOTO $-1 ; ($ - 2 se for PIC18)

;opa, terminou de ler

BCF ENABLE ; desliga display

BCF RS ; desliga RS

; NÃO PRECISA DO BCF RW?

BCF TRISD,7 ; RD7 é saida de novo

RETURN ; encerra funcao

;__________________________________________________________________

MOSTRA_TELA_PRINCIPAL

BCF RS

MOVLW 0X87

CALL ESCREVE

BSF RS

MOVLW 'L'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'N'

CALL ESCREVE

MOVLW 'H'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW '1'

CALL ESCREVE

MOVLW ','

CALL ESCREVE

BCF RS

MOVLW 0XC7

CALL ESCREVE

BSF RS

MOVLW 'L'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'N'

CALL ESCREVE

MOVLW 'H'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW '2'

CALL ESCREVE

MOVLW '.'

CALL ESCREVE

BCF RS

MOVLW 0X9D

CALL ESCREVE

BSF RS

MOVLW '3'

CALL ESCREVE

MOVLW ','

CALL ESCREVE

BCF RS

MOVLW 0XDD

CALL ESCREVE

BSF RS

MOVLW '4'

CALL ESCREVE

MOVLW '.'

CALL ESCREVE

RETURN

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

;* CONFIGURAÇÕES PRINCIPAL *

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

CONFIGURA

BANK1

MOVLW B'00000000'

MOVWF TRISA

MOVLW B'00000000'

MOVWF TRISB

MOVLW B'00000000'

MOVWF TRISC

MOVLW B'00000000'

MOVWF TRISD

MOVLW B'00000000'

MOVWF TRISE

MOVLW B'11011111'

MOVWF OPTION_REG

MOVLW B'00000000'

MOVWF INTCON

MOVLW B'00000111'

MOVWF ADCON1

BANK0

CLRF PORTA

CLRF PORTB

CLRF PORTC

CLRF PORTD

CLRF PORTE

MOVLW 0X20

MOVWF FSR

LIMPA_RAM ;ROTINA INDICADA PELO LIVRO PRA LIMPAR A RAM DO BANK0

CLRF INDF

INCF FSR,F

MOVF FSR,W

XORLW 0X80

BTFSS STATUS,Z

GOTO LIMPA_RAM

;_______________________

INICIALIZACAO_DISPLAY

CALL DELAY_100MS

CALL DELAY_100MS

BCF RS

MOVLW 0X30

CALL ESCREVE

CALL DELAY_5MS

MOVLW 0X30

CALL ESCREVE

MOVLW 0X30

CALL ESCREVE

MOVLW B'00111000'

CALL ESCREVE

MOVLW B'00000001'

CALL ESCREVE

CALL DELAY_2MS

MOVLW B'00001100'

CALL ESCREVE

MOVLW B'00000110'

CALL ESCREVE

BSF RS

;* PROGRAMA PRINCIPAL *

MAIN

CALL MOSTRA_TELA_PRINCIPAL

CALL DELAY_1S

GOTO MAIN

END ;FIM DO PROGRAMA

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, o problema não é o Proteus, é a placa mesmo...por algum motivo o LCD não inicializa e, se inicializa, não aparecem as letras.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo resolvido! O segredo estava no RW.

Provavelmente o display que eu tenho tem alguma particularidade em alguma inicialização e por isso eu não conseguia fazê-lo inicializar. Criei uma rotina/chamada (em destaque) que repeti diversas vezes (sempre que enviava algum comando ao LCD) alterando o TRIS do BUS e o RW pra saber se o LCD já tinha terminado de executar a instrução.

A chamada de escrita estava ok, mantive ela como estava antes alterando apenas o delay, como aconselhado.

;* ARQUIVOS DE DEFINIÇÕES *

#INCLUDE <P16F877A.INC>

__CONFIG _CP_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC & _CPD_OFF & _DEBUG_OFF & _WRT_OFF

;* PAGINAÇÃO DE MEMÓRIA *

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA

#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* VARIÁVEIS *

CBLOCK 0x20

TEMPO0

TEMPO1

TEMPO2

TEMPO3

TEMPO4

TEMPO5

ENDC

;* SAÍDAS *

#DEFINE DISPLAY PORTD

#DEFINE RS PORTE,2

#DEFINE ENABLE PORTE,1

#DEFINE RW PORTE,0

#DEFINE LED_CONFERENTE PORTC,5

#DEFINE LED_CONFERENTE2 PORTC,4

;* VETOR DE RESET *

ORG 0x0000 ;ENDEREÇO INICIAL DE PROCESSAMENTO

GOTO CONFIGURA

;* DEFINIÇÃO DAS ROTINAS COM A UTILIZAÇÃO DO CALL *

DELAY_15MS

MOVLW .75

CALL DELAY_MS

RETURN

DELAY_10MS

MOVLW .50

CALL DELAY_MS

RETURN

DELAY_5MS

MOVLW .25

CALL DELAY_MS

RETURN

DELAY_100US

MOVLW .165

MOVWF TEMPO2

DECFSZ TEMPO2,F

GOTO $-1

RETURN

DELAY_1MS

MOVLW .5

CALL DELAY_MS

RETURN

DELAY_2MS

MOVLW .10

CALL DELAY_MS

RETURN

DELAY_3MS

MOVLW .15

CALL DELAY_MS

RETURN

DELAY_1S

MOVLW .100

MOVWF TEMPO4

MANGA

CALL DELAY_10MS

DECFSZ TEMPO4,F

GOTO MANGA

RETURN

DELAY_500US

MOVLW .50

MOVWF TEMPO5

MANGA1

CALL DELAY_10MS

DECFSZ TEMPO5,F

GOTO MANGA1

RETURN

DELAY_100MS

MOVLW .10

MOVWF TEMPO3

MANGA2

CALL DELAY_10MS

DECFSZ TEMPO3

GOTO MANGA2

RETURN

DELAY_MS

MOVWF TEMPO1 ;COLOCA .1 NA VARIÁVEL TEMPO1

MOVLW .250 ;COLOCA .250 NA

MOVWF TEMPO0 ;VARIÁVEL TEMPO0

CLRWDT ;LIMPA O WDT PARA NÃO RESETAR.

DECFSZ TEMPO0,F ;DECREMENTA TEMPO0 E SE:

GOTO $-2 ; - TEMPO0 = 0 -> PULA 1 LINHA

; - TEMPO0 ? 0 -> VOLTA 2 LINHAS

DECFSZ TEMPO1,F ;DECREMENTA TEMPO1

GOTO $-6 ; - TEMPO1 = 0 -> PULA UMA LINHA

; - TEMPO1 ? 0 -> VOLTA 6 LINHAS

RETURN

;__________________________________________________________________

PERGUNTA

BSF RW ; AJUSTA PRA LEITURA

BANK1 ;

MOVLW B'11111111' ; ALTERA O TRISD PARA ENTRADA

MOVWF TRISD ;

BANK0 ;

LOOP

BTFSC DISPLAY,7

GOTO LOOP1

GOTO VOLTA_TRIS

LOOP1

BSF LED_CONFERENTE

GOTO LOOP

VOLTA_TRIS

BANK1

MOVLW 0x00

MOVWF TRISD

BANK0

BCF RW

RETURN

;__________________________________________________________________

ESCREVE

MOVWF DISPLAY ;MOVE PARA 'DISPLAY' O QUE ESTAVA EM W

NOP

BSF ENABLE

CALL DELAY_100US

BCF ENABLE

;-------------------------------------

CALL DELAY_3MS ;DELAY DE 3MS

RETURN

;__________________________________________________________________

MOSTRA_TELA_PRINCIPAL

BCF RS

MOVLW 0X87

CALL ESCREVE

BSF RS

MOVLW 'L'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'N'

CALL ESCREVE

MOVLW 'H'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW '1'

CALL ESCREVE

MOVLW ','

CALL ESCREVE

BCF RS

MOVLW 0XC7

CALL ESCREVE

BSF RS

MOVLW 'L'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'N'

CALL ESCREVE

MOVLW 'H'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW '2'

CALL ESCREVE

MOVLW '.'

CALL ESCREVE

BCF RS

MOVLW 0X97

CALL ESCREVE

BSF RS

MOVLW 'L'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'N'

CALL ESCREVE

MOVLW 'H'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW '3'

CALL ESCREVE

MOVLW ','

CALL ESCREVE

BCF RS

MOVLW 0XD7

CALL ESCREVE

BSF RS

MOVLW 'L'

CALL ESCREVE

MOVLW 'I'

CALL ESCREVE

MOVLW 'N'

CALL ESCREVE

MOVLW 'H'

CALL ESCREVE

MOVLW 'A'

CALL ESCREVE

MOVLW ' '

CALL ESCREVE

MOVLW '4'

CALL ESCREVE

MOVLW '.'

CALL ESCREVE

RETURN

;* CONFIGURAÇÕES PRINCIPAIS *

CONFIGURA

BANK1

MOVLW B'00000000'

MOVWF TRISA

MOVLW B'00000000'

MOVWF TRISB

MOVLW B'00000000'

MOVWF TRISC

MOVLW B'00000000'

MOVWF TRISD

MOVLW B'00000000'

MOVWF TRISE

MOVLW B'11011111'

MOVWF OPTION_REG

MOVLW B'00000000'

MOVWF INTCON

MOVLW B'00000111'

MOVWF ADCON1

BANK0

CLRF PORTA

CLRF PORTB

CLRF PORTC

CLRF PORTD

CLRF PORTE

;_______________________

MOVLW 0X20

MOVWF FSR

LIMPA_RAM ;ROTINA INDICADA PELO LIVRO PRA LIMPAR A RAM DO BANK0

CLRF INDF

INCF FSR,F

MOVF FSR,W

XORLW 0X80

BTFSS STATUS,Z

GOTO LIMPA_RAM

;_______________________

INICIALIZACAO_DISPLAY

BSF LED_CONFERENTE

CALL DELAY_100MS

CALL DELAY_100MS

BCF RS

MOVLW 0X30

CALL ESCREVE

CALL DELAY_5MS

MOVLW 0X30

CALL ESCREVE

MOVLW 0X30

CALL ESCREVE

CALL PERGUNTA

MOVLW B'00111000'

CALL ESCREVE

CALL PERGUNTA

MOVLW B'00000001'

CALL ESCREVE

CALL DELAY_2MS

CALL PERGUNTA

MOVLW B'00001100'

CALL ESCREVE

CALL PERGUNTA

MOVLW B'00000110'

CALL ESCREVE

CALL PERGUNTA

BSF RS

CALL DELAY_1S

BCF LED_CONFERENTE ; APAGA LED.

;* PROGRAMA PRINCIPAL *

MAIN

CALL MOSTRA_TELA_PRINCIPAL

BCF LED_CONFERENTE2

CALL DELAY_1S

BSF LED_CONFERENTE2

CALL DELAY_1S

GOTO MAIN

;* FIM DO PROGRAMA *

END ;FIM DO PROGRAMA

Muito Obrigada a todos, foram de muita ajuda mesmo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×