- Funcionamento do display LCD 16x2
- Diagrama de circuito para interface de LCD com microcontrolador STM8
- Biblioteca LCD STM8 - Arquivo de cabeçalho para STM8S103F3P6
- Programa LCD para microcontrolador STM8S
- STM8 com LCD - Funcionando
O display LCD alfanumérico 16x2 é o display mais comumente usado entre os amadores e entusiastas. A exibição é muito útil quando você deseja exibir informações básicas para o usuário e também pode ajudar no teste ou depuração de nosso código. Este módulo LCD 16x2 em particular está facilmente disponível e é popular há muito tempo. Você pode aprender mais sobre os fundamentos do módulo LCD 16x2 no artigo vinculado.
Para continuar com nossa série de tutoriais do Microcontrolador STM8, neste tutorial, aprenderemos como fazer a interface de um LCD com o Microcontrolador STM8. Anteriormente, fizemos interface com o LCD 16x2 com muitos outros microcontroladores também. Os tutoriais estão listados abaixo e você pode verificá-los se estiver interessado.
Se você for novo no STM8, consulte o artigo Introdução ao Microcontrolador STM8 para entender os fundamentos da placa controladora e do ambiente de programação. Não cobriremos o básico neste tutorial.
Funcionamento do display LCD 16x2
Como o nome sugere, um LCD 16x2 terá 16 colunas e 2 linhas. Portanto, no total, seremos capazes de exibir 32 caracteres neste display e esses caracteres podem ser alfabetos ou números ou mesmo símbolos. Uma pinagem simples de LCD 16x2 que usamos neste tutorial é mostrada abaixo-
Como você pode ver, o display tem 16 pinos e podemos dividi-lo em cinco categorias, pinos de alimentação, pino de contraste, pinos de controle, pinos de dados e pinos de luz de fundo, conforme mostrado na tabela abaixo. Entraremos em detalhes de cada pino ao discutir o diagrama de circuito deste tutorial.
Categoria | PIN NO. | Nome do Pin | Função |
Pinos de energia | 1 | VSS | Pino de aterramento, conectado ao aterramento |
2 | VDD ou Vcc | Pino de tensão + 5V | |
Pino de contraste | 3 | V0 ou VEE | Configuração de contraste, conectado ao Vcc através de um resistor variável. |
Pinos de controle | 4 | RS | Registrar Selecionar Pin, RS = 0 modo de comando, RS = 1 modo de dados |
5 | RW | Pino de leitura / gravação, RW = 0 modo de gravação, RW = 1 modo de leitura | |
6 | E | Habilitar, um pulso alto a baixo precisa habilitar o LCD | |
Pinos de dados | 7-14 | D0-D7 | Pinos de dados, armazena os dados a serem exibidos no LCD ou nas instruções de comando |
Pinos de luz de fundo | 15 | LED + ou A | Para alimentar a luz de fundo + 5V |
16 | LED- ou K | Backlight Ground |
Na parte traseira do LCD, conforme mostrado na imagem abaixo, você encontrará dois pontos pretos, dentro dos quais temos o IC do driver do LCD HD44780 (circulado em vermelho). Nosso microcontrolador deve se comunicar com este IC, que por sua vez controlará o que está sendo exibido no LCD. Se você está curioso para saber exatamente como tudo isso funciona, você deve verificar o funcionamento do display LCD 16x2 onde já discutimos em detalhes como o LCD funciona.
Neste tutorial, discutiremos o diagrama de circuito e o código para exibir caracteres alfanuméricos (alfabetos e números) em uma tela LCD 16x2 usando comandos LCD_print _char e LCD_print_string simples. Esses comandos podem ser usados diretamente no programa após incluir nosso arquivo de cabeçalho. O arquivo de cabeçalho lida com quase todas as coisas para você, então não é obrigatório saber como a tela ou o IC do driver HD44780 funciona.
Diagrama de circuito para interface de LCD com microcontrolador STM8
O circuito LCD STM8 completo pode ser encontrado na imagem abaixo. Como você pode ver, a conexão do controlador STM8S103F3P6 com LCD é muito simples, temos o display LCD conectado diretamente à nossa placa e o ST-link também é conectado para programar a placa.
Os pinos de alimentação Vss e Vcc são conectados ao pino 5V na placa STM8S, observe que a tensão operacional do LCD é 5V e está conectado para operar em 3,3V. Portanto, embora o microcontrolador STM8S103F3P6 opere em 3,3 V, é obrigatório ter uma alimentação de 5 V para o LCD, você pode evitar isso usando um controlador de carga IC, mas não discutiremos isso neste tutorial.
A seguir, temos o pino de contraste que é usado para definir o contraste do LCD, o conectamos ao potenciômetro para que possamos controlar o contraste. Nós usamos um potenciômetro de 10k, mas você também pode usar outros valores próximos, o potenciômetro atua como um divisor de potencial para fornecer 0-5 V ao pino de contraste, normalmente você também pode usar um resistor diretamente para fornecer cerca de 2,2V para um contraste razoável valor. Em seguida, temos os pinos de reset (RS), leitura / gravação (RW) e habilitação (E). O pino de leitura e gravação está aterrado porque não leremos nada do LCD, apenas realizaremos operações de gravação. Os outros dois pinos de controle Rs e E são conectados aos pinos PA1 e PA2 respectivamente.
Então temos os pinos de dados DB0 a DB7. O LCD 16x2 pode operar em dois modos, um é um modo de operação de 8 bits onde temos que usar todos os 8 pinos de dados (DB0-DB7) no LCD e o outro é o modo de operação de 4 bits onde precisamos apenas de 4 pinos de dados (DB4-DB7). O modo de 4 bits é comumente usado porque requer menos pinos GPIO do controlador, então também usamos o modo de 4 bits neste tutorial e conectamos apenas os pinos DB4, DB5, DB6 e DB7 aos pinos PD1, PD2, PD3 e PD4 respectivamente.
Os dois últimos pinos BLA e BLK são usados para alimentar o LED de luz de fundo interno, usamos um resistor de 560 ohms como um resistor limitador de corrente. O programador ST-Link está conectado como sempre, como em nosso tutorial anterior. Fiz a conexão completa na placa de ensaio e minha configuração se parece com a mostrada na imagem abaixo.
Biblioteca LCD STM8 - Arquivo de cabeçalho para STM8S103F3P6
Antes de prosseguirmos no diagrama de circuito, vamos obter o arquivo de cabeçalho STM8 LCD do GitHub usando o seguinte link-
Arquivo de cabeçalho STM8S 16x2 LCD
Você pode baixar o repo completo e obter o arquivo stm8s103_LCD_16x2.h ou simplesmente o código do link acima. Ao definir o projeto, certifique-se de incluir todos os arquivos de cabeçalho necessários no diretório inc junto com este arquivo de cabeçalho.
Se você não tiver certeza de como adicionar os arquivos de cabeçalho e compilar o programa, siga o vídeo no final desta página. E se você está curioso sobre como o código dentro do arquivo de cabeçalho funciona, você pode verificar o PIC com um tutorial de LCD. O arquivo de cabeçalho usado neste projeto é muito semelhante ao explicado ali, portanto não entraremos em detalhes sobre isso.
Programa LCD para microcontrolador STM8S
Para a demonstração, programaremos nosso controlador STM8S para exibir uma string simples como “Circuit Digest” e, em seguida, incrementaremos um valor de “Teste” para cada segundo na segunda linha. O programa completo pode ser encontrado no final desta página. A explicação é a seguinte.
Iniciamos nosso programa definindo os pinos e adicionando os arquivos de cabeçalho necessários como sempre. Em nosso diagrama de circuito discutido acima, conectamos LCD_RS a PA1, então o definimos como LCD_RS GPIOA, GPIO_PIN_1. Da mesma forma, fizemos o mesmo com os outros pinos. Se eles estiverem seguindo um circuito diferente, certifique-se de alterar esses valores de acordo.
#define LCD_RS GPIOA, GPIO_PIN_1 #define LCD_EN GPIOA, GPIO_PIN_2 #define LCD_DB4 GPIOD, GPIO_PIN_1 #define LCD_DB5 GPIOD, GPIO_PIN_2 #define LCD_DB6 GPIOD, GPIO_PIN_3 #define LCD_DB4 GPIOD, GPIO_PIN_1 #define LCD_DB5 GPIOD, GPIO_PIN_2 #define LCD_DB6 GPIOD, GPIO_PIN_3 #define LCD_DBlude4 "STinc8_9 STinc8_8_STinc8" LCD_DBlude 8 stinc8 STinc8 STinc8 STinc8 # CGlude8 "STinc8 GPIH8108 # GPIh8108 LCD_DBlude7" STinc8 STinc8 de LCD_DBlude8h8lude8108 # GPIh8lude8h8108 do LCD_DBlude8h8108 # GPIh8_9D9_1D8_9_8H8_5 LCD_GPIOD1.
Em seguida, dentro de nosso programa principal, declaramos as variáveis necessárias para este código de amostra. Temos uma variável de teste chamada test_var que é inicializada em zero, vamos incrementar a variável e exibi-la no LCD. Os caracteres d1 a d4 representam os 4 dígitos da variável de teste porque nosso LCD não pode exibir o valor interno diretamente, temos que convertê-los em caracteres.
// Declarações de variáveis int test_var = 0; char d4, d3, d2, d1;
A função LCD_Begin () é usada para inicializar o LCD. Esta função irá inicializar todos os pinos GPIO necessários e também definir o LCD no modo LCD 16x2. Então temos a função LCD_Clear () que é usada para limpar todos os valores no LCD, isso apagará tudo no LCD para que fique limpo para escrever novos valores. Então temos a função LCD_Set_Cursor (x, y) onde xey são as posições em que precisamos escrever nosso novo caractere. Por exemplo, (1,1) significa primeira linha e primeira coluna, da mesma forma (2,12) significa segunda linha 12 coluna, da mesma forma. Observe que temos 2 linhas e 16 colunas aqui, como discutimos anteriormente.
Lcd_Begin (); Lcd_Clear (); Lcd_Set_Cursor (1,1);
Agora, o LCD está definido, limpo e o cursor está no lugar. A próxima coisa é imprimir algo na tela. Podemos usar LCD_Print_String (“String de amostra”) para imprimir uma string no LCD e LCD_Print_Char (a) para imprimir um valor de caractere no LCD. Em nosso programa aqui imprimimos “STM8S103F3P3 LCD” e criamos um atraso de 5 segundos usando o código abaixo.
Lcd_Print_String ("STM8S103F3P3 LCD"); delay_ms (5000);
Após o atraso de 5 segundos, limpamos o LCD novamente e exibimos “Circuit Digest” na primeira linha e “Test:” na segunda linha.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Circuito Digest"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("Teste:");
Dentro da enquanto loop, vamos dividir o valor em variável inteira test_var em caracteres individuais para que ele possa ser exibido no LCD usando operadores de divisão e módulo simples. Também adicionamos '0' para converter o valor ASCII para o caractere.
d4 = test_var% 10 + '0'; d3 = (test_var / 10)% 10 + '0'; d2 = (test_var / 100)% 10 + '0'; d1 = (var_teste / 1000) + '0';
Então colocamos o cursor em (2,6) porque já escrevemos “Teste:” na segunda linha que tem 6 caracteres. Se substituirmos, o caractere existente será substituído por um novo caractere no LCD. Também adicionamos um atraso de 1 segundo e incrementamos a variável.
Lcd_Set_Cursor (2,6); Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); delay_ms (1000); test_var ++;
STM8 com LCD - Funcionando
Para testar nosso programa, simplesmente carregue o código em nosso controlador e ligue-o com a porta micro-USB. Observe que o LCD requer 5 V para funcionar, então é obrigatório ligar a placa a partir da porta USB. Anteriormente, o alimentamos diretamente do ST-link porque não precisávamos da fonte de 5V.
Como você pode ver, o LCD está funcionando conforme o esperado, com o valor da variável de teste sendo incrementado a cada segundo aproximadamente. Além disso, observe que não usamos temporizadores e usamos apenas a função de atraso para criar esse atraso, portanto, não espere que a duração do atraso seja precisa, usaremos temporizadores posteriormente em outro tutorial para esse propósito.
O funcionamento completo do projeto pode ser encontrado no vídeo no link abaixo. Espero que você tenha gostado do tutorial e aprendido algo útil. Se você tiver alguma dúvida, deixe-a na seção de comentários ou use nossos fóruns para outras questões técnicas.