Programowanie AVR cz. 10: Modyfikacja mikroprocesorowego sterownika wyświetlacza alfanumerycznego LCD (układ HD44780 lub odpowiednik) z dostępem przez łącze szeregowe (i błędy!)
Błędy zdarzają się nawet w najprostszym kodzie, niestety. Program sterownika do wyświetlacza szeregowego, o którym pisałem jakiś czas temu, też się błędów nie ustrzegł. Przy okazji zmodyfikowałem ten program w celu poprawnej obsługi wyświetlacza 16*2. Dotychczas wykorzystywałem dwa odzyskane ze złomu wyświetlacze jednowierszowe o fizycznej organizacji 16*1, ale logicznie każdy z nich składał się z dwóch wierszy po osiem znaków - stąd konieczność wprowadzenia udziwnionego polecenia mapowanego na bascomowskiego Locate'a i stąd błędy, które się przemknęły podczas testów. Być może wzięło się to z rzadko wykorzystywanego w jednowierszowym wyświetlaczu pozycjonowania tekstu.
W każdym razie, po zmianie wyświetlacza na model o bardziej popularnym formacie prezentacji tekstu, program wymagał kilku przeróbek, dlatego też i błędy zostały wyłapane i poprawione.
Oto poprawiony i zmodyfikowany program (BASCOM):
Warto przetestować ten zmodyfikowany wyświetlacz - szczególnie funkcjonalność, która dotychczas sprawiała problemy, czyli Locate. Poniżej prezentuję listing "latającej małpy" w implementacji na Arduino Leonardo (opis podłączeń w komentarzach). Warto zwrócić uwagę na prostą funkcję locate_xy, która ukrywa przed nami wyliczanie formatu odpowiedniej komendy wysyłanej do sterownika wyświetlacza (opis formatu w prezentowanym wcześniej listingu).
Myślę, że nie od rzeczy będzie, gdy napiszę jakąś prostą bibliotekę (dla Arduino i BASCOM-a) do obsługi wyświetlacza, żeby nie zmuszać użytkownika do niskopoziomowych operacji na łączu szeregowym. Najpierw zadbam o Arduino :-)
(nalepka pochodzi z zestawu dostarczonego w oryginalnym pudełku razem z moim Arduino, nie została tu umieszczona w żadnym konkretnym celu oprócz ozdobnego - zresztą jest to mój prywatny elektroniczny klocek, nie na sprzedaż ;-))
---------------------
Szczegóły na temat projektu szeregowego sterownika wyświetlacza alfanumerycznego dostępne w artykule:
Programowanie AVR cz. 7: Mikroprocesorowy sterownik wyświetlacza alfanumerycznego LCD (układ HD44780 lub odpowiednik) z dostępem przez łącze szeregowe.
W każdym razie, po zmianie wyświetlacza na model o bardziej popularnym formacie prezentacji tekstu, program wymagał kilku przeróbek, dlatego też i błędy zostały wyłapane i poprawione.
Oto poprawiony i zmodyfikowany program (BASCOM):
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
' Stałe używane przez sterownik | |
Const Clean = 255 | |
Const Cleft = 254 | |
Const Cright = 253 | |
Const Con = 252 | |
Const Coff = 251 | |
Const Cblink = 250 | |
Const Cnoblink = 249 | |
Const Cupline = 248 | |
Const Cdownline = 247 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
' Mikroprocesorowy sterownik wyświetlacza alfanumerycznego typu 16*2 | |
' (dwa wiersze po szesnaście znaków; układ zgodny z HD44780). | |
' Właściwości: | |
' - komunikacja (wysyłanie danych do wyświetlenia i sterowanie LCD) poprzez UART | |
' - prędkość transmisji: 9600b/s (parametry: 8n1 - domyślne dla ATtiny2313 i innych) | |
' - podstawowe funkcjonalności: | |
' * wyświetlanie tekstu w podstawowym kodzie ASCII (kody od 32 do 126) | |
' * sterowanie wyświetlacza (czyszczenie, sterowanie kursorem) | |
' * ustalenie początku wyświetlania (Locate): | |
' należy wysłać do sterownika informacjępostaci: | |
' &B110xxxxy, gdzie xxxx to pozycja-w-wierszu - 1, a y to wiersz - 1, | |
' np. &B11000111 - wiersz 2, pozycja 4 | |
$regfile = "attiny2313.dat" | |
$crystal = 4000000 | |
$hwstack = 40 | |
$swstack = 16 | |
$framesize = 32 | |
$baud = 9600 | |
$lib "LCD4.LBX" | |
$include "slcddrv.bas" | |
' Konfiguracja LCD zgodnie z wymogiem biblioteki LCD4 | |
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 | |
Config Lcd = 16 * 2 | |
' Buforowanie danych wejściowych - bez tego sterownik gubi znaki | |
Config Serialin = Buffered , Size = 32 | |
Enable Interrupts | |
Dim Znak As Byte | |
Dim Ile_znakow As Byte | |
Dim Poz_y As Byte | |
Dim Poz_x As Byte | |
Dim Linia As Bit | |
Dim Locate_odebrany As Bit | |
Cls | |
Do | |
Znak = Inkey() | |
If Znak = Clean Then | |
Cls | |
Ile_znakow = 0 | |
Linia = 0 | |
Elseif Znak = Cleft Then | |
Shiftcursor Left | |
Elseif Znak = Cright Then | |
Shiftcursor Right | |
Elseif Znak = Con Then | |
Cursor On | |
Elseif Znak = Coff Then | |
Cursor Off | |
Elseif Znak = Cblink Then | |
Cursor Blink | |
Elseif Znak = Cnoblink Then | |
Cursor Noblink | |
Elseif Znak = Cupline Then | |
If Linia = 1 Then | |
Upperline | |
Linia = 0 | |
End If | |
Elseif Znak = Cdownline Then | |
If Linia = 0 Then | |
Lowerline | |
Linia = 1 | |
End If | |
Elseif Znak >= 192 And Znak <= 223 Then | |
' Locate na podstawie przekazanych parametrów | |
Locate_odebrany = 1 | |
Poz_x = Znak And &B00011110 | |
Shift Poz_x , Right | |
Linia = Znak.0 | |
Ile_znakow = Poz_x | |
Poz_x = Poz_x + 1 | |
Poz_y = Znak.0 + 1 | |
Elseif Znak > 31 And Znak < 127 Then | |
If Ile_znakow > 15 Then | |
If Linia = 0 Then | |
Linia = 1 | |
Else | |
Linia = 0 | |
End If | |
Ile_znakow = 0 | |
End If | |
Incr Ile_znakow | |
If Locate_odebrany = 1 Then | |
Locate Poz_y , Poz_x | |
Locate_odebrany = 0 | |
Else | |
Poz_y = Linia + 1 | |
Locate Poz_y , Ile_znakow | |
End If | |
Lcd Chr(znak) | |
End If | |
Loop | |
End |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Latająca małpa ;-) | |
Klasyka... | |
(http://wileczeknet.blogspot.com/2012/04/programowanie-mikrokontrolerow-avr-cz-1.html) | |
Programik do testowania modułu wyświetlacza szeregowego 16*2. | |
Dodatkowy sprzęt: | |
- moduł szeregowego wyświetlacza alfanumerycznego (http://wileczeknet.blogspot.com/2013/01/programowanie-avr-cz-7-mikroprocesorowy.html) | |
Podłączenie modułu: | |
- piny zasilania (+5V, GND) modułu do odpowiednich gniazd Arduino; | |
- RxD i TxD modułu do Tx1 i Rx1 (Digital1 i Digital0) Arduino. | |
Prędkość transmisji: | |
- 9600b/s | |
Pozostałe parametry portu UART - wartości domyślne. | |
*/ | |
// Stałe używane przez mikroprocesorowy szeregowy sterownik wyświetlacza LCD | |
#define Clean 255 | |
#define Cleft 254 | |
#define Cright 253 | |
#define Con 252 | |
#define Coff 251 | |
#define Cblink 250 | |
#define Cnoblink 249 | |
#define Cupline 248 | |
#define Cdownline 247 | |
// LED pin 13 (na płytce) | |
#define Led 13 | |
// Locate w sposób przyjazny | |
// -- x przyjmuje wartości od 1 do 16 | |
// -- y przyjmuje wartości od 1 do 2 | |
void locate_xy(byte x = 1, byte y = 1) { | |
if ((x <= 16) && (y <= 2)) { | |
byte pos = 192 + (x - 1) * 2 + (y - 1); | |
Serial1.write(pos); | |
} | |
else { | |
Serial1.write(192); | |
} | |
} | |
void show_monkey(byte x, byte y, byte time) { | |
locate_xy(x,y); | |
Serial1.print("@"); | |
delay(time); | |
locate_xy(x,y); | |
Serial1.print(" "); | |
} | |
void setup() { | |
// Inicjalizacja sprzętowego portu UART ATmegi | |
Serial1.begin(9600); | |
// Pin 13 jako wyjście | |
pinMode(Led, OUTPUT); | |
// Czyszczenie wyświetlacza, wyłączenie kursora i wyświetlenie nagłówka | |
Serial1.write(Clean); | |
Serial1.write(Coff); | |
delay(100); | |
locate_xy(1,1); | |
Serial1.print("Latajaca"); | |
locate_xy(9,2); | |
Serial1.print("malpa!!!"); | |
delay(2000); | |
} | |
void loop() { | |
// zapalenie LED | |
digitalWrite(Led, HIGH); | |
for (byte i = 1; i <= 16; i++) { | |
show_monkey(i,1,170); | |
} | |
// zgaszenie LED | |
digitalWrite(Led, LOW); | |
for (byte i = 16; i >= 1; i--) { | |
show_monkey(i,2,170); | |
} | |
} |
(nalepka pochodzi z zestawu dostarczonego w oryginalnym pudełku razem z moim Arduino, nie została tu umieszczona w żadnym konkretnym celu oprócz ozdobnego - zresztą jest to mój prywatny elektroniczny klocek, nie na sprzedaż ;-))
---------------------
Szczegóły na temat projektu szeregowego sterownika wyświetlacza alfanumerycznego dostępne w artykule:
Programowanie AVR cz. 7: Mikroprocesorowy sterownik wyświetlacza alfanumerycznego LCD (układ HD44780 lub odpowiednik) z dostępem przez łącze szeregowe.
Komentarze
Prześlij komentarz