Estou usando um módulo LCD clone HD44780, um KS0066U. Tudo funciona bem no módulo, exceto quando eu desligo rapidamente o dispositivo (ligado-> desligado-> ligado). Por alguma razão, uma interrupção muito curta na energia faz com que o módulo de exibição seja inicializado incorretamente como um LCD de 1 linha em vez de um display de 2 linhas. O que causaria esse comportamento? Existe alguma maneira de evitá-lo em software?
EDIT: eu estou usando o controlador de vídeo no modo de 4 bits e não no modo de 8 bits.
Respostas:
Alterei meu código de inicialização para enviar a mordidela superior de 4 bits do comando function set duas vezes. Depois disso, ressinto a mordidela superior de 4 bits, seguida pela mordidela inferior de 4 bits. Isso não corresponde à folha de dados que parece indicar que você pode enviar a mordidela superior de 4 bits e, em seguida, enviar o comando de conjunto de funções superior a 4 bits, seguido pela inferior de 4 bits.
// Às vezes funciona com pseudo-código
port = 0x20;
e = 1; e = 0;
porta = 0x20;
e = 1; e = 0;
porta = 0xC0;
e = 1; e = 0;
// Funciona o tempo todo pseudo-código
port = 0x20;
e = 1; e = 0;
e = 1; e = 0;
porta = 0x20;
e = 1; e = 0;
porta = 0xC0;
e = 1; e = 0;
fonte
Meu palpite seria que você está perdendo um atraso necessário em sua sequência de inicialização. Se a exibição estiver ocupada quando você tentar enviar um comando, esse comando será ignorado. Se, quando você iniciar o procedimento, o display estiver no modo de quatro bits e "0000" cronometrar como a primeira metade de um comando, quando você digitar "0011", o display verá o comando inteiro como "00000011" , o que fará com que a tela fique ocupada por até 1,6 ms.
Aliás, é bom, se possível, conectar os fios de dados de baixa ordem do display de tal maneira que quando um comando "0011" for enviado ao display, os 8 bits inteiros vistos pelo display formarão um comando de modo definido correto para o tipo de exibição que você está usando. Isso ajudará a evitar falhas de tela ao redefinir uma tela que já está em uso (redefinir periodicamente a tela é uma boa idéia, se for possível fazê-lo sem falhas, pois garantirá que, se a tela de alguma forma entrar em um modo ruim, ela será corrigida próprio).
fonte
Encontrei uma solução alternativa para o problema:
Eu adicionei um atraso de 1000milisegundos na inicialização, antes de inicializar / configurar o controlador LCD. Funcionou muito bem para mim.
Um atraso menor (100, 200ms) não funcionou tão bem. Apenas uma observação: isso aconteceu apenas no banco de dados de 4 bits.
Boa sorte!
fonte
Inserir um atraso no seu código para que, ao ser ligado, forneça ao LCD tempo suficiente para inicializar quando ele for inicializado. Um máximo de algumas centenas de milissegundos.
Você também pode tentar conectar a energia do LCD ao microcontrolador e desligar o LCD por um segundo após a inicialização.
fonte
Não tenho certeza se isso ajuda em tudo, mas eu errei com o KS0066U em um projeto do Arduino. Aqui está o link .
fonte