Controlando um LCD 16 x 2
usando placa Buffer II na porta LPT do MSX Introdução
Essa é uma experiência um pouco diferente das demais que fiz até agora com o conjunto "MSX Placa Adpat Placa Buffer II" e placa "Buffer II". Nesta experiência eu não usei a placa "MSX Placa Adapt Placa Buffer II". Fiz isso por conta da velocidade necessária para o controle decente do LCD. Percebi que ao serializar os controles, eu não conseguia um pulso suficiente curto e isento de "sujeira" para o pino de EN do LCD. Para essa experiência, adaptei aquela pequenina placa que usei no artigo "Introdução - Um pequeno teste com a LPT do MSX sem muitos recursos" de maneira que eu pudesse ligar a mesma diretamente a placa Buffer II. Veja a figura abaixo. O circuito é bem simples. O que fiz foi adaptar as conexões dos pinos de dados (D0 a D7) e Strob (pino 1) do conector Centronics 36 vias macho (ligado a placa) a um DB25 macho seguindo a pinagem da figura abaixo (a mesma de uma porta paralela de PC e portanto compatível com a entrada da placa Buffer II). Desta forma os pinos de Strob e dados (D0 a D7) da porta paralela do MSX são conectados diretamente a placa Buffer. Lembrando que a placa Buffer II tem um CI 74LS245 como "buffer" para a linha de dados e uma porta do CI 74LS08 também como "buffer" para o pino de Strob. Você deve estar se perguntando se poderia ligar diretamente os pinos da porta do MSX a um LCD, a resposta: "Sim!". Mas eu não faria isso. O uso de "buffers" é sempre interessante. Obs.: Estude o circuito da placa Buffer II (clique aqui para ver o projeto) e adapte, se for o caso, um buffer para um LCD de testes se desejar repetir essa experiência. Abaixo listo os pinos utilizados nesta experiência:
Abaixo mostro o vídeo dessa experiência, que permitira entender melhor o que foi feito: O conceito Um LCD tipo caracter, como o que utilizei em minha experiência, pode ser controlado de algumas maneiras. A mais simples dela é utilizando apenas os 4 bits mais significativos da linha de dados (D4 a D7), o pino RS (que permitirá escrever um dado ou comando) e o pino EN (Enable). Com apenas estes 6 pinos é possível controlar um LCD. Abaixo detalho um pouco mais a respeito (material retirado/adaptado de um dos meus artigos, também presente neste site). Os displays de LCD (Liquid Crystal Display) Um display de cristal líquido, apesar de parecer complexo, tem sua operação muito simples. A maioria dos displays encontrados no mercado possuem recursos internos para facilitar ao máximo o controle dos mesmos, proporcionando uma interface com qualquer microcontrolador, e porque não com microcomputadores. Assim não temos que nos preocupar com a operação interna de um display. Apenas com os comandos necessários para escrever um caractere, apagar uma linha, ligar o cursor, e muitos outros comandos possíveis (de acordo com cada modelo).
Na figura acima, temos alguns exemplos e tipos de LCD’s (Liquid Crystal Display) facilmente encontrados no mercado especializado (lojas de componentes eletrônicos). Estes LCD’s são do tipo “caracter” ou seja não são gráficos. Os displays gráficos têm seu controle um pouco mais complexo e feito de maneira diferente e não serão discutidos aqui. Por hora falarei apenas sobre o tipo “caracter”. Os LCD’s tipo caracter possuem algumas subdivisões importantes e que valem a pena conhece-las. Elas referem-se principalmente a quantidade de caracteres que cada um pode “mostrar”. Esta quantidade é geralmente distribuída em “linhas x colunas”. Na tabela abaixo você poderá ver alguns padrões utilizados com suas divisões em relação a linhas e colunas Tabela 1 - Padrões mais comuns dos LCDs tipo caracter
Sempre lembrando que o total de caracteres refere-se ao número total de elementos que podem ser demonstrados de uma única vez, inclusive “espaços” em branco. Também é importante salientar que existem muitos outros padrões referentes ao número total de caracteres, sendo recomendável uma consulta aos fabricantes. Assim ficamos sempre “antenados” com as novidades do mercado. OPERAÇÃO DE UM LCDA
operação de um display, como dito anteriormente, é
extremamente simples. Eles possuem comandos específicos para
cada operação desejada: leitura, escrita, configuração,
etc. Estes comandos são passados através de uma linha
de dados (pinos D0 a D7) de 8 bits
(1 byte) e
uma linha de controle
composta por mais três pinos: EN (Enable),
RD/WR
(leitura/escrita) e RS (entrada de dados ou instruções).
Na figura abaixo você pode observar um display e sua respectiva
pinagem.
Alguns display’s possuem mais que 14 pinos. Os pinos excedentes geralmente são utilizados no controle do Back Ligth que nada mais é que um conjunto de LEDs posicionados na parte de trás do display. Quando “ligado” permite a visualização dos dados mesmo no escuro. Todo aparelho celular possui Back Ligth em seu display. Na figura abaixo você tem um pequeno circuito que pode ser usado para “ligar ou desligar” o Back Ligth. A polaridade deve ser respeitada para o funcionamento adequado. Os displays com quatro ou mais linhas devem ser tratados como uma “união” de dois ou mais displays de duas linhas. Em alguns casos, estes displays possuem dois pinos de habilitação (EN) para selecionar qual conjunto de linhas será usado. Neste caso o pino 15 habilita as duas linhas superiores e o pino 16 as duas linhas inferiores. O pino “6” não é conectado. Até aqui você já deve ter percebido que um “LCD” tem internamente um pequeno microcontrolador dedicado, que fará a interpretação dos “dados” recebidos e os transformará em “comandos” internos (não entrarei em maiores detalhes sobre isso, pois foge ao propósito deste artigo). Na tabela abaixo você tem um conjunto de instruções para operação com displays. Esta tabela também apresenta qual deve ser o dado a ser enviado para o mesmo e o estado nos pinos de controle deste. Instruções de controle para um LCD
Existem
outros comandos, mas os mais importantes e mais utilizados foram
passados nesta tabela. Se você tiver interesse em conhecer
mais sobre todos os comandos possíveis de um determinado
display
recomendo uma consulta ao datasheet
do fabricante do LCD que tiver em mãos.
Observando a tabela acima você notará que para enviar um determinado comando para o display o pino RS é levado ao estado lógico “0” e para enviar um caractere a ser escrito o mesmo pino é levado ao estado lógico “1”. O pino “EN” habilita o display e deve ser colocado em “1” para habilitar e em “0” para desabilitar. O pino RD/WR deve ser colocado em “0” para escrever dados no display e em “1” para ler dados do mesmo. Obs.: Quando cito estado lógico "1" e "0", estou me referindo a +5VDC e GND, respectivamente, no circuito. O programa Para essa experiência eu desenvolvi um pequeno programa em Assembly Z80 usando a IDE zDevStudio e o compilador Pasmo v0.5.3. O que ele faz é, respeitando os comandos passados na tabela mais acima, configurar o LCD e inserir no mesmo um conjunto de caracteres. Um ponto interessante aqui é que esse conjunto de caracteres deve ser passado por um programa em BASIC que além de carregar o programa ASM na memória, também passa um conjunto de caracteres para o mesmo e que será grafado no LCD. Eu usei o caracter "/" como um "pula linha" para o LCD (ou seja, se quiser escrever na linha 2 do LCD envie um "/") e limitei o número máximo de caracteres a 32 para esta versão (usei um LCD 16x2). O programa ASM não faz qualquer tipo de "critica" com relação a quantidade e outras. Tudo isso deve ser feito pelo programa Loader! Abaixo coloco um exemplo do Loader em BASIC que poderia ser utilizado: 10 REM "PROGRAMA MSX_LCD2.BAS" 20 REM "ESCREVE NO LCD VIA LPT" 30 SCREEN 0: KEY OFF 40 CLEAR 200, &HC000 50 BLOAD"MSX_LCD2.BIN" 60 DEFUSR=&HC100 70 PRINT "PROGRAMA MSX_LCD2.BAS" 80 PRINT "BY ARNE" 90 PRINT " " 100 PRINT "ENTRE COM O TEXTO PARA O LCD" 110 INPUT A$ 120 IF LEN(A$) > 32 OR LEN(A$) <1 THEN GOTO 300 130 GOSUB 180 140 PRINT " " 150 PRINT "AGUARDE, ENVIANDO P/ O LCD";" RESPOSTA->" 160 P$=USR(A$) 170 KEY ON: END 180 PRINT " ":PRINT "HEXA->"; 190 FOR I=1 TO LEN(A$) 200 PRINT HEX$(ASC(MID$(A$,I,1)));" "; 210 NEXT I 220 PRINT " " 230 RETURN 300 PRINT "PERMITIDO APENAS 32 CARACTERES M„XIMOS" 310 GOTO 90 Se você ficou interessado em "estudar" um pouco o programa em Assembly, não sou um cara "muquirana" que esconde o "ouro". Você pode vê-lo clicando aqui (meu github). Obs.: Antes de mais nada, peço a "indulgência" dos "profissas" da linguagem Assembly Z80/MSX se o programa parecer um tanto amador. Estou retomando a programação Assembly Z80 que abandonei há anos! Sendo assim, me dá um desconto ok! Conclusão Esse foi um teste bastante interessante. E não é porque não usei a "MSX Placa Adapt Placa Buffer II" que a mesma pode ser considerada desnecessária. Sem a mesma eu não teria realizado as outras experiências que exigiram um maior número de pinos de controle na placa Buffer II. E agora para onde vamos?!?! Por hora, estou satisfeito com minhas experiências com a porta paralela do MSX e agora pretendo iniciar novas experiências com uma placa muito conhecida da comunidade MSX: a placa "Projeto Hardware da revista CPU MSX". Que venham as novas experiências!!! Sorte e sucesso em suas experiências!!! |
Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor. |