Używam klonowanego modułu LCD HD44780 KS0066U. Wszystko działa dobrze na module, z wyjątkiem gdy szybko włączam i wyłączam urządzenie (on-> off-> on). Z jakiegoś powodu bardzo krótka przerwa w zasilaniu powoduje nieprawidłową inicjalizację modułu wyświetlacza jako 1-liniowy wyświetlacz LCD zamiast 2-wierszowego wyświetlacza LCD. Co spowodowałoby to zachowanie? Czy jest jakiś sposób, aby temu zapobiec w oprogramowaniu?
EDYCJA: Używam kontrolera wyświetlacza w trybie 4-bitowym, a nie 8-bitowym.
Odpowiedzi:
Zmieniłem swój kod inicjalizacyjny, tak aby dwukrotnie wysyłał górną 4-bitową końcówkę polecenia set funkcji. Po czym nie lubię górnej 4-bitowej końcówki, a następnie dolnej 4-bitowej końcówki. Nie jest to zgodne z arkuszem danych, który wydaje się wskazywać, że możesz wysłać górny 4-bitowy skrawek, a następnie wysłać polecenie ustawiania funkcji górny 4-bit, a następnie dolny 4-bit.
// Działa czasami pseudo-kod
portu = 0x20;
e = 1; e = 0;
port = 0x20;
e = 1; e = 0;
port = 0xC0;
e = 1; e = 0;
// Działa cały czas pseudo-kod
portu = 0x20;
e = 1; e = 0;
e = 1; e = 0;
port = 0x20;
e = 1; e = 0;
port = 0xC0;
e = 1; e = 0;
źródło
Domyślam się, że brakuje ci niezbędnego opóźnienia w sekwencji inicjalizacji. Jeśli wyświetlacz jest zajęty podczas próby wysłania polecenia, polecenie to zostanie zignorowane. Jeśli po rozpoczęciu procedury wyświetlacz jest w trybie czterobitowym i właśnie zapisano „0000” jako pierwszą połowę polecenia, to po uruchomieniu „0011” na wyświetlaczu będzie widoczne całe polecenie „00000011” , co spowoduje, że wyświetlacz będzie zajęty przez maksymalnie 1,6 ms.
Nawiasem mówiąc, dobrze jest, jeśli to możliwe, połączyć przewody danych niskiego rzędu z wyświetlacza w taki sposób, że gdy polecenie „0011” zostanie wysłane na wyświetlacz, całe 8 bitów widocznych na wyświetlaczu utworzy polecenie ustawione w trybie co jest właściwe dla używanego typu wyświetlacza. Pomoże to uniknąć problemów z wyświetlaniem podczas resetowania wyświetlacza, który jest już w użyciu (okresowe resetowanie wyświetlacza jest dobrym pomysłem, jeśli można to zrobić bez zakłóceń, ponieważ zapewni, że jeśli wyświetlacz przejdzie w jakiś zły tryb, naprawi to samo).
źródło
Znalazłem obejście problemu:
Dodałem opóźnienie 1000 milisekund przy uruchomieniu, przed inicjalizacją / konfiguracją kontrolera LCD. Działało mi to całkiem nieźle.
Niższe opóźnienie (100, 200 ms) nie działało tak dobrze. Tylko uwaga: stało się to tylko w 4-bitowej bazie danych.
Powodzenia!
źródło
Wstawienie opóźnienia w kodzie, więc po włączeniu daje LCD wystarczająco dużo czasu, aby zainicjować podczas uruchamiania. Maksymalnie kilkaset milisekund.
Możesz także spróbować podłączyć zasilanie LCD do mikrokontrolera i wyłączyć wyświetlacz LCD na sekundę po uruchomieniu.
źródło
Nie jestem pewien, czy to w ogóle pomaga, ale pomieszałem z KS0066U w projekcie Arduino. Oto link .
źródło