Tabela em Assembly para escrever em um display de LCD com PIC

Tabela em Assembly para escrever em um display de LCD com PIC

Após ter apanhado um monte com assembly e perturbado bastante o professor da cadeira de projetos com microcontroladores aprendi a trabalhar com tabelas em assembly, mesmo sabendo que percorrer uma tabela em assembly no microcontrolador PIC é um sacrifício (que no final recompensa o trabalho). Mas vamos deixa de conversa e ir direto aos trabalhos…

Primeiro devemos conhecer uma das diretivas de dados do assembly, a responsável de gerar series de instruções RETLW (Instrução que retorna de uma chamada CALL com o resultado de W ), uma instrução para cada termo.

DT: Definindo uma tabela de dados

Sintaxe:     dt [termo]

Descrição:  Esta diretiva vai gerar uma série de instruções RETLW, uma instrução para cada termo.

dt “Mensagem” , 0
dt primeiro, segundo, terceiro

Após saber como funciona o DT vamos escrever em um LCD com essa instrução (em um outro post irei informar como inicializar e configurar um Display LCD 16×2).

A rotina abaixo é parte de um projeto que desenvolvi, que tem a função de escrever em um LCD de 16×2 que pula para próxima linha do LCD automaticamente após o termino da escrita na primeira linha.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 ;*********************************************************
 ;* MSG *
 ;*********************************************************
 LCD_PRINCIPAL                    ;DEFINIÇÃO DE FUNÇÃO
 BANK0
 CLRF CONT_MENS                ;LIMPA VARIÁVEL
 CALL ESCREVE_LINHA1        ;INFORMA A LINHA EM QUE VAI ESCREVER
 MOVLW .16                           ;DEFINE A QUANTIDADE DE COLUNAS
 MOVWF LINHA                      ;JOGA DENTRO DE LINHA
 BCF POSICAO                       ;INFORMA A POSIÇÃO DE ESCRITA 0 = PRIMEIRA LINHA MSG_PRINCIPAL
 BANK0
 MOVF CONT_MENS,W          ;JOGA O VALOR DE CONT_MENS PARA W
 CALL STRING_LCD               ;VAI PARA ESCRITA DA MENSAGEM
 MOVWF CARACTER              ;COLOCA O RETORNO DA FUNÇÃO STRING EM CARACTER
 SUBLW .0                             ;SUBTRAI W DE ZERO
 BANK0
 BTFSC STATUS,Z                  ;O RESULTADO DEU ZERO?
 GOTO VARRE                       ;SE == 0, JÁ LEU TODA STRING E VAI PARA A ROTINA PRINCIPAL
 INCF CONT_MENS,1            ;SE =! 0, INCREMENTE 1 NA VARIÁVEL CONT_MENS
 MOVF CARACTER,W            ;JOGA A LETRA QUE ESTA EM CARACTER E JOGA PRA W
 MOVWF DADOS_LCD          ;JOGA CARACTER PARA O LCD
 CALL PULSO                        ;ROTINA DO LCD
 DECFSZ LINHA,1                 ;DECREMENTA OS 16. QUE E A QUANTIDADE MÁXIMA DE ESCRITA EM UMA LINHA
GOTO RECOMECA               ;RECOMEÇA O ENVIO DE UMA PRÓXIMA LETRA NA LINHA 1
 GOTO RECOMESA_POS2     ;RECOMEÇA O ENVIO DE UMA PRÓXIMA LETRA NA LINHA 2 STRING_LCD
 BANK0
 ADDWF PCL,1                     ;SOMA W AO DESLOCAMENTO AO PC (PROGRAM COUNT) - W + PC
 MSG_LCD DT "MENSAGEM A SER ENVIADA PRO LCD",0   ;CADA LETRA LIDA PELA POSIÇÃO DO PC E ADICIONADA EM W E RETORNA PELO COMANDO RETLW RECOMECA
 GOTO MSG_PRINCIPAL       ;RECOMEÇA O ENVIO DE UMA PRÓXIMA LETRA RECOMESA_POS2
 BANK0
 BTFSS POSICAO                  ;A ESCRITA ESTA EM QUE POSIÇÃO? SE "0" VAI PRA FUNÇÃO ESCREVE_LINHA2 E
 CALL ESCREVE_LINHA2      ;DEFINE ESCRITA NA LINHA 2 E MUDA VALOR DA VARIÁVEL POSIÇÃO PARA 1, SENÃO CONTINUA ESCREVENDO NA LINHA 1
 GOTO MSG_PRINCIPAL

Abaixo segue a logica do código:
lcd_principal

Aguarde os próximos capítulos, pois estarei disponibilizando mais algumas técnicas que aprendi com essa cadeira.

Related posts:

Sou engenheiro de Controle e Automação, técnico em processamento de dados, professor de controle industrial e eletricidade na instituição SENAI-PR, empreendedor, sócio e diretor de engenharia da empresa Mobhis Automação Urbana (www.mobhis.com.br).

Share This Post

1 Comment

  1. Walisson - 18/05/2010

    Olá amigo, tudo bom? Pretendo usar um LCD num projeto da faculdade. Estou querendo usar a diretiva “DT” para armazenar strings. Quer dizer, armazenar eu sei, mas como faço para ler cada caractere e enviar um por um a um LCD? Desde já agradeço.

Leave a reply