Talvez uma das telas mais populares do mercado. Construído no popular controlador HD44780U. Do nome do modelo conclui-se que a tela é composta por duas linhas de 16 caracteres. Não há suporte para o idioma russo neste modelo específico.
O barramento de dados sh2s permite conectar até 127 dispositivos através de dois fios, simultaneamente. Este I2C é implementado no chip PCF8574T.
Coisa azul - resistência variável, permite ajustar o contraste da tela.
O jumper à esquerda é responsável pela iluminação de fundo da tela.
Um bloco de 4 contatos está conectado ao Arduino assim:
GND - GND
VCC - 5V
SDA - A4 (se Arduino MEGA, então para D20)
SCL - A5 (se Arduino MEGA, então para D21)
O display pode ter um endereço IIC diferente, em vez de 0x27 pode ser 0x3F. Para determinar o endereço com precisão, você pode usar um scanner de dispositivo i2c.
#incluir
Talvez uma das telas mais populares do mercado. Construído no popular controlador HD44780U. Do nome do modelo conclui-se que a tela é composta por duas linhas de 16 caracteres. Não há suporte para o idioma russo neste modelo específico.
O barramento de dados sh2s permite conectar até 127 dispositivos através de dois fios, simultaneamente. Este I2C é implementado no chip PCF8574T.
lcd.print("www.site"); ) loop vazio () ( )
O jumper à esquerda é responsável pela iluminação de fundo da tela.
Um bloco de 4 contatos está conectado ao Arduino assim:
GND - GND
VCC - 5V
SDA - A4 (se Arduino MEGA, então para D20)
SCL - A5 (se Arduino MEGA, então para D21)
O display pode ter um endereço IIC diferente, em vez de 0x27 pode ser 0x3F. Para determinar o endereço com precisão, você pode usar um scanner de dispositivo i2c.
#incluir
//define o endereço da tela LCD 0x27, 16 caracteres, 2 linhas Neste artigo vou contar como usar o módulo de interface I2C para controlar um display LCD (2x16 / 20x4) com usando Arduino
Parâmetros Técnicos
Suporte de exibição: LCD 16×02 / 20×04
Opcional: ajuste de contraste
Tensão de alimentação. 5V
Interface: I2C
Informações gerais sobre o módulo de interface I2C Como o número de pinos nos controladores Arduino é limitado e muitas vezes quando usado vários sensores
Agora um pouco sobre o módulo em si; ele é construído no chip PCF8574T. Os resistores R8 (4,7 kOhm) e R9 (4,7 kOhm) são necessários para puxar as linhas SDA e SCL. Idealmente, ao conectar dois ou mais dispositivos através do barramento I2C, você precisa usar um pull-up em apenas um dispositivo, I. Vou escrever o porquê mais tarde. Existem três jumpers na placa (o diagrama mostra que as linhas A0, A1, A2 estão conectadas à fonte de alimentação através dos resistores R4, R5, R6), eles são necessários para alterar o endereçamento do dispositivo, são 8 opções no total . Alterar o endereçamento nos dá a capacidade de conectar até oito dispositivos através do barramento IC2 com o chip PCF8574T; as opções de endereço são mostradas na figura (o endereço padrão do dispositivo é 0x27). O módulo também é equipado com um potenciômetro R11, com sua ajuda você pode alterar o contraste do display LCD.
Existem três grupos de contatos no módulo para conexão:
Primeiro grupo:
SCL: Relógio serial
SDA: linha de dados (Serial Dфta)
VCC: potência "+"
GND: fonte de alimentação "-"
Segundo grupo:
VSS: "-" potência
VDD: potência “+”
VO: Pino de controle de contraste
RS: Cadastre-se Selecione
RW: Leitura/Escrita (modo de gravação quando conectado ao terra)
E: Habilitar (estroboscópio de queda)
DB0-DB3: Interface com bits baixos
DB4-DB7: Interface de bits altos
A: fonte de alimentação de luz de fundo "+"
K: "-" potência da luz de fundo
Terceiro grupo: (jumper definido por padrão)
VCC:
A do LCD:
Peças necessárias:
Arduino UNO R3 x 1 unid.
Visor LCD 1602A (2×16, 5V, Azul) x 1 unid.
Módulo de interface I2C, IIC, TWI para LCD x 1 unid.
Fio DuPont, 2,54 mm, 20 cm, FM (fêmea - macho) x 1 unid.
Cabo USB 2,0 AB x 1 unid.
Conexão:
Primeiro de tudo, solde o módulo I2C ao Visor LCD, então você precisa conectar o display ao Arduino UNO. Para fazer isso, usaremos a fiação DuPont que conectamos conforme a tabela abaixo.
Para maior clareza, darei outro diagrama.
Para este experimento, você precisa baixar e instalar a biblioteca “LiquidCrystal_I2C”. Em seguida, copie e cole este código de exemplo na janela do programa Arduino IDE e carregue-o no controlador.
/* Testado em IDE do Arduino 1.6.11 Data do teste 15/09/2016 */ #incluir
Se você fez tudo corretamente, mas não há símbolos no display, tente aumentar o contraste com o potenciômetro.
Ligações
Baixar biblioteca
Documentação para o chip
Documentação para
Compre no Aliexpress
A placa é roteada de forma que possa ser conectada imediatamente ao display LCD. A entrada fornece energia e linhas I2C. A placa é imediatamente equipada com resistores pull-up nas linhas SCL e SDA, potenciômetro para ajuste de contraste e fonte de alimentação para o próprio display.
O jumper à direita liga/desliga a luz de fundo. Então, armado com um testador, a tabela a seguir foi compilada. Depois de estudar o módulo, foi revelado que P3 controla a luz de fundo. Se o jumper estiver instalado, 1 liga a luz de fundo e 0 desliga. Quando o jumper é removido, a luz de fundo fica sempre desligada. Em seguida, decidiu-se complementar a biblioteca axlib com funções para trabalhar com o barramento I2C (implementação de software) e funções para controlar o chip PCF8574. Resumindo, como funciona o módulo. Para gerar um byte em paralelo, você precisa enviar o endereço do microcircuito para o barramento I2C (por padrão é 0x4E. Você também pode alterar o endereço soldando jumpers na placa e alterando o valor dos três menos significativos bits do endereço), então após receber o ACK, um byte de dados é enviado. Depois que o chip responde com um ACK, o byte aparece na porta paralela do chip. Para controlar o display LCD, peguei funções da biblioteca axlib e modifiquei-as ligeiramente para funcionar com o barramento I2C. #incluir
BYTE pcf8574_test(BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); i2c_stop(); return ask; ) A primeira função foi escrita para verificar se um dispositivo está no barramento. Em princípio, pode ser utilizado para pesquisar qualquer dispositivo localizado no barramento. A função pega o endereço do dispositivo desejado e se responder retorna zero. Se um dispositivo com esse endereço não estiver no barramento, ele retornará um.
BYTE pcf8574_byte_out (dados BYTE, BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); if(!ask) ask = i2c_send_byte(data); i2c_stop(); return perguntar; ) Esta função já foi adaptada exclusivamente para este chip. Como argumentos é fornecido um byte a ser transferido para o barramento e o endereço do chip. A função primeiro consultará o chip por endereço e depois enviará o byte. Se o chip recebeu um byte e respondeu com ACK, a função terminará de funcionar com o chip e retornará zero como envio bem-sucedido do byte. E neste momento o microcircuito enviará este byte para sua porta paralela. Caso contrário, receberemos NACK e retornaremos um, a transmissão falhou.
BYTE pcf8574_str_out(BYTE *dados, BYTE col, BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); for(BYTE i=0; i
void com(BYTE com) ( com |= 0x08; //P3 para um para que a luz de fundo fique acesa pcf8574_byte_out(com, ADICIONAR); // Dados de saída com |= 0x04; // E por unidade pcf8574_byte_out(com, ADICIONAR); // Dados de saída com &= 0xFB; //E para zero pcf8574_byte_out(com, ADICIONAR); // Dados de saída
}
Esta função apenas envia comandos para o display. Foi aqui que apareceu a primeira linha com a adição lógica do comando de 0x08. Este bug é necessário porque transmitimos o byte não diretamente para a porta do display LCD, mas através do nosso repetidor. Ou seja, se fornecemos um byte e precisamos gerar apenas um bit, atribua o bit necessário ao byte anterior e envie-o novamente para a porta. Isso é um incômodo. A adição com 0x08 é necessária para manter constantemente um no terceiro dígito. Lembra da luz de fundo? É essa adição que liga a luz de fundo. Então chamamos a função de transferência de byte para o barramento. Está escrito acima. Em seguida, transferimos o byte através do barramento para o chip. Em seguida, você deve definir E como um, que é o que a adição lógica do byte de 0x04 realmente faz. Após redefinir E. Assim, você pode enviar qualquer comando para o display apenas passando o próprio comando como argumento. void init(void) ( _delay_ms(30); //Pausa após ligar com(0x30); //Muda para modo 4 bits _atraso_us(40); //Atraso para execução do comando com(0x30); //Muda para modo 4 bits _atraso_us(40); //Atraso para execução do comando com(0x30); //Muda para modo 4 bits _atraso_us(40); //Atraso para execução do comando com(0x20); //Muda para modo 4 bits _atraso_us(40); //Atraso para execução do comando com(0x20); //Definindo parâmetros com(0x80); //Definindo parâmetros com(0x00); //Desliga a exibição com(0x80); //Desliga a exibição com(0x00); //Limpa a tela com(0x10); //Limpa a tela com(0x00); // Define o modo de entrada de dados com(0x60); // Define o modo de entrada de dados com(0x00); //Ativa o display com o cursor selecionado com(0xC0); //Ativa o display com o cursor selecionado
}
Esta função apenas inicializa o display. A sequência de comandos é retirada da ficha técnica do display LCD. void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Transfere os 4 bits mais significativos de data_h |= 0x04; pcf8574_byte_out(data_h, ADD); //Transfere os 4 bits mais significativos dados_h &= 0xF9; //Transfere os 4 bits mais significativos pcf8574_byte_out(dados_h, ADICIONAR); // Transfere 4 bits baixos pcf8574_byte_out(dados_l, ADICIONAR); // Transfere 4 bits baixos dados_l |= 0x04; // Transfere 4 bits baixos
}
pcf8574_byte_out(dados_l, ADICIONAR); dados_l &= 0xF9; pcf8574_byte_out(dados_l, ADICIONAR);
Esta função transmite dados para o display LCD. Ele é executado da mesma forma que os comandos, exceto que o byte é transmitido primeiro com o nibble mais significativo e depois com o byte mais baixo. E o resto é o mesmo.
Bem, esta função serve apenas para passar uma string para o display. Na verdade, não tem nada a ver com o nosso tópico.
Devido à falta da vírgula, a exibição não será afetada. Este dispositivo foi projetado especificamente para monitores com este controlador ou similar. Mas este microcircuito é um expansor de porta realmente simples. Concordo com E. Variáveis adicionais são necessárias. Se você passar um argumento para uma função e executar certas ações com lógica, poderão ocorrer falhas. Eu já encontrei isso. A inicialização é realizada sem violação de tempo. A documentação diz que há uma pausa de 40 µs entre os comandos. Pelo fato da transferência ocorrer pelo barramento i2c, que por sua vez é software e lento, os períodos são completados com juros. Se você ainda não tem preguiça, escreva sua versão e envie para mim. Vou publicá-lo. Afinal, este site é destinado ao público amador e quem quiser pode expressar sua opinião e visão sobre a vida do MK.
Adicionados tempos ao inicializar a tela, conforme observado pelo respeitado “Alfabetizado”
Olá Alexey. Você pode adicionar uma biblioteca ao gerador de código para funcionar com PCF8574.
Vou pensar.))
Oh sim. Principalmente o código em ASMA. Os especialistas em Arduino irão apreciar isso ao máximo)))
Py.sy.
Mesmo que você não olhe para o ASM, o programa foi escrito para um controlador PIC. Esta informação é “muito” útil para especialistas em AVR? especialmente para iniciantes))) Não tenho nada contra o PIC, mas até o ASM do PIC e do AVR é diferente. Quanto aos detalhes de funcionamento do display LCD, você pode dar uma olhada))) É verdade, também escrevi em CVAVR, mas todos os comandos são desmontados e classificados em prateleiras. Mas em qualquer caso, decida onde está escrito com mais clareza))) O autor escreve, o leitor escolhe.
"Endereço I2C do chip (por padrão é 0x4E"
Os 4 bits mais significativos do endereço são fixos,
O prefixo para PCF8574 é 0100 e para PCF8574A é 0111
Os 3 bits inferiores dependem do estado das entradas A2-A0 do chip. Por padrão, todos os 3 jumpers estão abertos, respectivamente, o endereço do chip assume o valor 0111111.
//A2 A1 A0 PCF8574 PCF8574A
//1 1 1 0x20 0x38
//1 1 0 0x21 0x39
//1 0 1 0x22 0x3A
//1 0 0 0x23 0x3B
//0 1 1 0x24 0x3C
//0 1 0 0x25 0x3D
//0 0 1 0x26 0x3E
//0 0 0 0x27 0x3F
Você confundiu alguma coisa.
Extraído da documentação do microcircuito
0b01001110 é 0x4E
Então está tudo correto aqui. E se precisar alterar o endereço, basta alterá-lo em Definir.
Bom dia! E você também pode usar o código de função lcdgotoxy e lcdclear para trabalhar com o adaptador para PCF8574.
Bom dia! Como você produz texto em russo?
Este é um display doméstico da MELT. O alfabeto cirílico está gravado em sua memória.
Bom dia! Escrevo como você faz no Projeto para AtmelStudio 6.2 "ЁPҐBET MҐP!" ele sai normalmente
e se você escrever "OLÁ MUNDO!" traz à tona todo tipo de bobagem. eu tenho dois
Uma das opções de exibição possui alfabeto cirílico. o segundo é chinês.
Eu primeiro escreveria um programa de teste. Itera por toda a memória e exibe símbolos e seus endereços. E então descubra qual é o problema. Muito provavelmente a tabela de caracteres não corresponde à tabela ASCII.
Bom dia!
Você pode fornecer um diagrama de circuito para o Proteus?
Ou ninguém verificou no Proteuse?
Descobri main_init
Uma coisa curiosa, o endereço do display é 0x4E, e se o mesmo display estiver conectado ao Arduino, então o endereço é 0x27
Muito obrigado pelo seu trabalho! Vasculhei toda a Internet e nenhum dos exemplos dados, exceto o seu, funcionou. A única coisa é que no arquivo do projeto os atrasos _delay_ não são especificados na função de inicialização do display e, portanto, não funciona
Bem, este é mais um projeto de demonstração. Por um bom motivo, a biblioteca axlib precisa ser reescrita, mas dado o fato de que STM32 e STM8 estão se movendo aos trancos e barrancos, não há sentido no AVR.
STM não possui pacotes DIP, é mais difícil fazer placas de circuito impresso. Para meus projetos, as capacidades do AVR são muitas, você pode colocar muita coisa em um Atmega 8
Sim, mas quanto custa Atmega8 e stm8s003)))
Olá, Alexei.
Por favor, diga-me como ler o status da porta do pcf8574?
Quero fazer uma unidade externa, 8 GPIO no barramento i2c - é isso.
eu vou me responder
A função retorna um byte - o estado das portas do microcircuito
uint8_t pcf8574_byte_rcv(uint8_t endereço)
{
uint8_t perguntar = ACK;
endereço |= 0b01; //LER
dados uint8_t=0;
i2c_start();
perguntar = i2c_send_byte(endereço);
if(!ask) dados = i2c_read_byte(NACK);
i2c_stop();
Dados de retorno;
}
Quanto custa, 150 rublos, pelo preço de um relé em geral) e como você conecta placas para STM? LUT não é confiável, o roteador CNC não tem certeza do que será necessário (não tentei)
Neste artigo vou contar como usar um módulo de interface I2C para controlar um display LCD (2x16/20x4) usando Arduino. Este módulo permite reduzir o número de pinos do controlador utilizados em vez de uma conexão de 8 ou 4 bits, são necessários apenas 2 pinos (SDA e SCL).
Parâmetros Técnicos
Suporte de exibição: LCD 16×02 / 20×04
Opcional: ajuste de contraste
Tensão de alimentação. 5V
Interface: I2C
Como o número de contatos nos controladores Arduino é limitado e muitas vezes eles se esgotam ao utilizar diversos sensores e módulos, há necessidade de salvá-los. Para esses casos, este módulo foi desenvolvido, com sua ajuda você pode implementar a transmissão em dois contatos (. SDA e SCL).
Agora um pouco sobre o módulo em si; ele é construído no chip PCF8574T. Os resistores R8 (4,7 kOhm) e R9 (4,7 kOhm) são necessários para puxar as linhas SDA e SCL. Idealmente, ao conectar dois ou mais dispositivos através do barramento I2C, você precisa usar um pull-up em apenas um dispositivo, I. Vou escrever o porquê mais tarde. Existem três jumpers na placa (o diagrama mostra que as linhas A0, A1, A2 estão conectadas à fonte de alimentação através dos resistores R4, R5, R6), eles são necessários para alterar o endereçamento do dispositivo, são 8 opções no total . Alterar o endereçamento nos dá a capacidade de conectar até oito dispositivos através do barramento IC2 com o chip PCF8574T; as opções de endereço são mostradas na figura (o endereço padrão do dispositivo é 0x27). O módulo também é equipado com um potenciômetro R11, com sua ajuda você pode alterar o contraste do display LCD.
Existem três grupos de contatos no módulo para conexão:
Primeiro grupo:
SCL: Relógio serial
SDA: linha de dados (Serial Dфta)
VCC: potência "+"
GND: fonte de alimentação "-"
Segundo grupo:
VSS: "-" potência
VDD: potência “+”
VO: Pino de controle de contraste
RS: Cadastre-se Selecione
RW: Leitura/Escrita (modo de gravação quando conectado ao terra)
E: Habilitar (estroboscópio de queda)
DB0-DB3: Interface com bits baixos
DB4-DB7: Interface de bits altos
A: fonte de alimentação de luz de fundo "+"
K: "-" potência da luz de fundo
Terceiro grupo: (jumper definido por padrão)
VCC:
A do LCD:
Peças necessárias:
Arduino UNO R3 x 1 unidade.
Visor LCD 1602A (2×16, 5V, Azul) x 1 unid.
Módulo de interface I2C, IIC, TWI para LCD x 1 unid.
Fio DuPont, 2,54 mm, 20 cm, FM (fêmea - macho) x 1 unid.
Cabo USB 2.0 AB x 1 unidade.
Conexão:
Primeiramente soldamos o módulo I2C ao display LCD, depois é necessário conectar o display ao Arduino UNO. Para fazer isso, usaremos a fiação DuPont que conectamos conforme a tabela abaixo.
Para maior clareza, darei outro diagrama.
Para este experimento, você precisa baixar e instalar a biblioteca “LiquidCrystal_I2C”. Em seguida, copie e cole este código de exemplo na janela do programa Arduino IDE e carregue-o no controlador.
/* Testado no Arduino IDE 1.6.11 Data do teste 15/09/2016 */ #incluir
Baixe o programa
Se você fez tudo corretamente, mas não há símbolos no display, tente aumentar o contraste com o potenciômetro.
Ligações
Baixe a biblioteca LiquidCrystal_I2C
Documentação para o chip PCF8574T
Documentação para LCD1602A
Compre no Aliexpress