Znaki ASCII dla modułu wyświetlacza LED 5x7

W większości urządzeń wyświetlacz jest niezbędnym elementem interfejsu użytkownika. Współcześnie większość urządzeń jest wyposażanych w wyświetlacze LCD, jednak w pewnych aplikacjach nadal świetnie sprawdzają się wyświetlacze LED, które są niedrogie, łatwe do sterowania, działają prawidłowo w niskiej temperaturze i są czytelne również w kiepskich warunkach oświetlenia.

Jakiś czas temu opracowałem moduł składający się z 4 wyświetlaczy alfanumerycznych 5×7 pikseli, którego używałem w różnych urządzeniach. Projekt tego modułu jest opublikowany na tej stronie pod adresem http://www.easy-soft.net.pl/artykuly/rozne-przydatne-urzadzenia/modul-4-znakowego-wyswietlacza-alfanumerycznego-led. Dzięki zastosowaniu rejestrów szeregowych mających programowane źródła prądowe na wyjściach (Prema Semiconductor PR4010, dostępne np. w ofercie TME) uniknięto konieczności stosowania rezystorów ograniczających prąd segmentów i dzięki temu zmniejszono liczbę komponentów oraz uproszczono montaż modułu.
Moduły wyświetlaczy można łączyć szeregowo i sterować za pomocą 3 linii: danych, zegara rejestru szeregowego, zegara przepisującego dane z rejestrów wewnętrznych na wyjścia równoległe. Oprócz tego jasność świecenia można regulować za pomocą przebiegu PWM doprowadzonego do wejścia CTRL, natomiast wyświetlacz można wyłączyć za pomocą wejścia BLANK. Zainteresowanych zasadą działania odsyłam do wspomnianego artykułu oraz do opisu przykładowego projektu zegara http://www.easy-soft.net.pl/artykuly/jezyk-c/przyklad-uzycia-modulu-wyswietlacza-do-budowy-zegarka. Aby ułatwić sobie pracę, można nabyć płytkę drukowaną modułu w sklepie firmy AVT (http://sklep.avt.pl/). Numer zestawu to AVT2505.
W związku z planowanym użyciem wyświetlacza do pokazywania komunikatów (dotychczas głównie służył mi do wyświetlania liczb i pojedynczych znaków alfanumerycznych), musiałem wykonać odpowiedni driver programowy oraz wzorce znaków. Mimo iż początkowo myślałem o wykonaniu jedynie definicji dużych liter, to ostatecznie zdecydowałem się na podstawowy zestaw znaków ASCII, na razie bez polskich znaków diakretycznych. Definicje znaków, bit po bicie, zawiera tablica unsigned char ascii_table[]. Rozpoczyna je znak odstępu (kod 0x20), natomiast kończy nawias potocznie zwany „wąsami”. Umieszczone za nim definicje strzałek w prawo, w lewo oraz symbol stopnia są dodane dodatkowo i wykraczają poza zestaw ASCII. Logiczna jedynka oznacza piksel zgaszony, natomiast zero - zaświecony. W związku ze sposobem wyprowadzania liczby do wyświetlacza, definicje są wykonane w odbiciu lustrzanym. Bity najmniej znaczące (pozycje 0...2) nie są wykorzystywane (nadałem im wartość logicznej jedynki). W obrębie definicji danego znaku, bajt o niższej pozycji jest wyświetlany w pierwszym wierszu wyświetlacza (licząc od góry), natomiast bajt o wyższej - w ostatnim (na samym dole). Podczas multipleksowania są wyprowadzane i zaświecane/gaszone wszystkie piksele danej linii.
Driver programowy napisano w języku C korzystając z Atmel Studio 6, które jest za darmo dostępne w Internecie na stronie producenta. Przykład wykonałem dla mikrokontrolera ATmega8 taktowanego za pomocą wewnętrznego oscylatora RC (ustawienia fusebit-ów pokazano na rysunku 1; okno z Khazma AVR Programmer), jednak łatwo może on być przystosowany dla dowolnego AVR lub innego mikrokontrolera. Podobnie jak w przykładzie z zegarem, procedurę wysyłającą dane do wyświetlacza umieszczono w obsłudze przerwania Timera 0 wywoływanej z częstotliwością około 300 Hz. Dane do wyświetlenia są pobierane z pamięci RAM, z tablicy unsigned char display [8], w której to pętla główna (lub dowolne procedury pomocnicze) może umieszczać kody znaków do wyświetlenia. W moim przykładzie pobieram dane dla dwóch modułów tj. 8 znaków alfanumerycznych.
Jak łatwo zauważyć, definicje znaków ASCII w tym przykładzie rozpoczynają się od pozycji 0 w tablicy, natomiast kod znaku odstępu to 0x20 (32 dziesiętnie). Dlatego chcąc w prosty sposób wyświetlić znak należy przed umieszczeniem go w tablicy display od jego kodu odjąć kod odstępu. Na przykład,

display[0] = ‘a’ - 0x20;

spowoduje umieszczenie małej litery „a” na pierwszej pozycji wyświetlanego łańcucha znaków. Można również ułatwić sobie zadanie wykonując prostą funkcję konwersji, przez którą trzeba będzie „przepuścić” każdy łańcuch przed wyświetleniem, jednak moim zdaniem znacznie bardziej „oszczędne” jest zwykłe odejmowanie.
Program dołączony na końcu demonstruje zdefiniowane znaki oraz przykładowy sposób wyświetlenia przesuwającego się komunikatu, znak po znaku. Pisząc podobny sterownik wyświetlacza dla 8051 używałem mechanizmu języka C wykorzystujacego fakt przesunięcia bitu do flagi przeniesienia oraz własności rdzenia 8051, w którym istniał rozkaz przypisujący tę flagę wyjściu. W mikrokontrolerze AVR rozwiązałem to inaczej, bardziej uniwersalnie, chociaż na pewno zwiększając przy tym liczbę rozkazów do wykonania:

            if (zalacz & 0x80) SET_DIN; else CLR_DIN;
            zalacz <<= 1;

Iloczyn sprawdza stan najstarszego bitu i zależnie od jego poziomu ustawia lub zeruje wyjście danych. Następnie liczba jest przesuwana w lewo o 1 bit i operacja jest powtarzana 8 razy, dla każdego bitu danych.

Jacek Bogusz
j.bogusz@easy-soft.net.pl

 

Rysunek 1. Ustawienia fusebit-ów mikrokontrolera ATmega8

 

Film demonstrujący działanie wyświetlacza (dostepny również na YouTube pod adresem https://www.youtube.com/watch?v=ShH0QzgB_3Q).

 

http://www.tomaszbogusz.blox.pl/

 

ZałącznikWielkość
testowy_dla_atmega8.7z160.9 KB

Dodaj nowy komentarz

Zawartość pola nie będzie udostępniana publicznie.