Tryb tekstowy
W tej części artykułu zajmiemy się wyświetlaniem tekstu. Ponieważ
wyświetlacze zbudowane w oparciu o kontroler KS0108 nie posiadają
generatora znaków, wyświetlanie tekstu wymaga zdefiniowania własnej
tablicy czcionek, która będzie przechowywana w pamięci programu
mikrokontrolera.
Każdy znak jest określony pięcioma bajtami danych (typowa czcionka 5x8
pikseli). Kolejność bajtów w tablicy odpowiada kolejności poszczególnych
pionowych fragmentów znaku. Wygląd litery A przedstawiony jest na
rysunku
Do projektowania własnych czcionek można wykorzystać program ze strony http://radzio.dxp.pl/font/
Wyświetlenie znaku
Wyświetlenie znaku polega na zapisie do wyświetlacza 5 kolejnych bajtów
tworzących dany znak. Ponieważ nie ma sensu marnować miejsca w pamięci
programu na znaki ‘niewyświetlane’ (czyli pierwszych 31 znaków tablicy
ASCII) pierwszy znak w tablicy (spacja) ma indeks 0, podczas gdy w
tablicy ASCII ten znak posiada kod 32. Należy więc od kodu znaku
przekazanego do funkcji jako parametr odjąć liczbę 32.
void
lcdWriteChar(char x)
{
char i;
x -= 32; // konwersja kodu znaku
for(i = 0; i < 5; i++)
lcdWriteData(pgm_read_byte(font5x7 + (5 * x) + i)); // zapis
do wyświetlacza
//5 kolejnych bajtów tworzących znak
lcdWriteData(0); // odstęp między znakami
} |
Wyświetlanie ciągu znaków
Parametrem funkcji jest wskaźnik do typowego dla języka C ciągu znaków
zakończonego zerem.
void
lcdWriteString(char * s)
{
while(*s) // dopóki znak wskazywany przez s jest różny od
zera
lcdWriteChar(*s++); // zapis znaku
} |
Wyświetlanie ciągu znaków z pamięci programu
Ponieważ przechowywanie w pamięci RAM stałych napisów powoduje znaczne
zużycie stosunkowo niewielkiej pamięci, wygodniej jest niezmienne ciągi
znaków przechowywać w pamięci programu. Ze względu na specyficzny odczyt
pamięci programu w kompilatorze avr-gcc do tego celu służy oddzielna
funkcja.
void
lcdWriteStringPgm(prog_char * s)
{
char c; // pomocnicza zmienna
while(c = pgm_read_byte(s++)) // dopóki znak wskazywany
przez s jest różny od
// zera
lcdWriteChar(c); // zapis znaku
} |
Ustawienie współrzędnych tekstowych
W trybie tekstowym wygodniej posługiwać się współrzędnymi
odpowiadającymi położeniu znaków na wyświetlaczu. Ponieważ każdy znak
składa się z sześciu pionowych "części" to zamiana współrzędnych
tekstowych na graficzne sprowadza się do pomnożenia przez 6 poziomej
współrzędnej tekstowej.
void
lcdLocate(unsigned char x, unsigned char y)
{
lcdGoTo(x * 6, y); // zapis
} |
|