Wykorzystanie modułu wyświetlacza matrycowego 8×8 z układem MAX7219 i Arduino UNO R3
Zadaniem układu jest wyświetlanie przewijanego napisu „KAMAMI”. Układ oparty jest na module Arduino UNO R3 oraz module wyświetlacza matrycowego. Program sterujący pracą mikrokontrolera Atmega328P (zawartego w module Arduino) został napisany w języku Bascom-AVR.
Układ wykorzystuje moduł wyświetlacza matrycowego 8×8 ze sterownikiem MAX7219, do którego dane przesyłane są szeregowo. Wysłane przez mikrokontroler dane (linia DIN) trafiają do rejestrów i są przesuwane wraz z narastającym zboczem na linii zegarowej CLK. Stan niski na linii CS pozwala na załadowanie danych do rejestrów; zmiana stanu tej linii na wysoki powoduje zatrzaśnięcie danych w rejestrach (ostatnie dwa bajty).
Program sterujący mikrokontrolera napisany został w języku Bascom (do jego skompilowania można użyć wersji demonstracyjnej kompilatora). Program zaczyna się deklaracją typu procesora oraz częstotliwości taktowania. Deklarowane są także 3 wyjściowe linie mikrokontrolera (linie komunikacji z układem MAX7219) oraz przypisane są im nazwy. Na listingu 1 przedstawiono fragment kodu programu zawierający deklaracje.
Listing 1. Fragment programu zawierający deklaracje
[bascomavr] $regfile = "m328pdef.dat" $crystal = 16000000 Config Pinc.0 = Output Config Pinc.1 = Output Config Pinc.2 = Output Din Alias Portc.0 Cs Alias Portc.1 Clk Alias Portc.2 [/bascomavr]
Komunikacja z mikrokontrolerem nie jest objęta żadnym standardem – dane wystawiane są na linie asynchronicznie, w takt linii CLK. Do obsługi wysyłania zmiennych stworzono procedurę Wyslij , której wywołanie powoduje wysłanie do układu MAX7219 wartości zmiennych Dane i Adres.
Dwa bajty danych wysyłane są przy użyciu instrukcji For…Next, wykonywanej dla każdego bajtu po 8 razy. Procedurę Wyslij przedstawiono na listingu 2.
Listing 2. Procedura Wyslij
[bascomavr] Sub Wyslij Reset Cs Waitus 50 For Licz = 7 To 0 Step -1 Din = Adres.licz Set Clk Waitus 100 Reset Clk Waitus 100 Next Licz For Licz = 7 To 0 Step -1 Din = Dane.licz Set Clk Waitus 100 Reset Clk Waitus 100 Next Licz Set Cs End Sub [/bascomavr]
Do poprawnej pracy układu MAX7219 wymagane jest ustawienie jego parametrów początkowych poprzez wpisanie wartości do odpowiednich rejestrów. Po włączeniu układu do zasilania, mikrokontroler wywołuje procedurę Ustawienia , w której ustawianie są parametry pracy – tryb pracy, jasność matrycy, typ dekodowania, limit dświeżania oraz tryb testowy. Ustawiane są wartości adresu i danych, po czym wykonany zostaje skok do procedury wysyłania. Procedura ustawiania parametrów układu jest wykonywana tylko raz (listing 3).
Listing 3. Podprogram ustawiania parametrów układu
[bascomavr] Sub Ustawienia Set Cs Reset Din Reset Clk Adres = &HC 'shutdown mode Dane = &H1 'normal op Call Wyslij Waitms 10 Adres = &HA 'intensity Dane = &H03 'wartosc Call Wyslij Waitms 10 Adres = &H9 'decode mode Dane = &H0 'no decoding Call Wyslij Waitms 10 Adres = &HB 'scan limit Dane = &H7 'wszystkie Call Wyslij Waitms 10 Adres = &H0F 'test mode Dane = &H00 'normal op Call Wyslij Waitms 10 Call Czysc End Sub [/bascomavr]
Po włączeniu zasilania, lub w wyniku zakłóceń na liniach mikrokontrolera mogą pojawić się błędy na wyświetlaczu (np. wynikające ze źle zaadresowanych rejestrów). Całość ekranu czyszczona jest w podprogramie Czysc (listing 4), którego wywołanie spowoduje wpisanie zer do rejestrów odpowiedzialnych za wyświetlanie wierszy.
Listing 4. Podprogram Czysc
[bascomavr] Sub Czysc 'czyszczenie całości For Licz2 = 1 To 8 Adres = Licz2 'wiersz HEX:1-8 Dane = &H0 'kolumny HEX: wszystkie 0 Call Wyslij Waitus 100 Next Licz2 End Sub [/bascomavr]
Procedura czyszczenia wyświetlacza wykonywana jest także po zakończeniu wyświetlania napisu. Napis wyświetlany zapisany jest w tablicy danych, w postaciach serii wartości heksadecymalnych. Każda litera tekstu „KAMAMI” zajmuje po 8 bajtów.
Pętla główna programu odczytuje dane z tablicy, czytając je od końca – w pierwszej chwili po uruchomieniu zasilania dane odczytywane są od komórki 55, zaś po wykonaniu pełnego przesunięcia napisu, punkt początkowy odczytu z tablicy przesuwany jest na komórkę 63 (działanie programu tuż po uruchomieniu układu powoduje wyświetlenie pierwszej litery przy lewej krawędzi wyświetlacza, zaś po wykonaniu przesunięcia całego napisu pojawia się on od prawej strony).
Przesuwanie napisu polega na przesunięciu punktu odczytywania tablicy, każdorazowo zmniejszając go o jeden (po ośmiokrotnym wykonaniu pętli for…next zmniejszającej o 1 wykonywane jest dodanie liczby 7 do wartości zmiennej wskazującej na początek odczytu tabeli (zmienna Wartosc ).
Rozwiązanie to pozwala na łatwe przesuwanie napisu, jednak z tego względu napis musi być w całości umieszczony w tablicy, mimo powtarzania się liter, zaś po obu stronach napisu znajduje się po 8 bajtów pustych (wartości 0).
Pętlę główną oraz tablicę znaków przedstawiono na listingu 5.
Listing 5. Pętla główna oraz tablica znaków
[bascomavr] Do For Licz3 = 0 To 7 Waitms 1 Adres = Licz4 Dane = Lookup(wartosc , Tablica) Call Wyslij Decr Wartosc Incr Licz4 If Licz4 > 8 Then Licz4 = 1 End If Next Licz3 Wartosc = Wartosc + 7 Waitms 25 If Wartosc = 8 Then Call Czysc Wartosc = 63 Waitms 500 End If Loop . . . Tablica: Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ' Data &H00 , &H00 , &H00 , &H00 , &H00 , &HFD , &HFD , &H00 'i Data &H00 , &HFF , &HFF , &H0E , &H1C , &H0E , &HFF , &HFF 'm Data &H00 , &H00 , &HF8 , &HFF , &H13 , &H13 , &HFF , &HF8 'a Data &H00 , &HFF , &HFF , &H0E , &H1C , &H0E , &HFF , &HFF 'm Data &H00 , &H00 , &HF8 , &HFF , &H13 , &H13 , &HFF , &HF8 'a Data &H00 , &H00 , &H81 , &HC3 , &H66 , &H3C , &HFF , &HFF 'k Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 [/bascomavr]
Na listingu 6 pokazano kompletny program.
Listing 6. Kompletny program w jęzku Bascom AVR
[bascomavr] $regfile = "m328pdef.dat" $crystal = 16000000 Config Pinc.0 = Output Config Pinc.1 = Output Config Pinc.2 = Output Din Alias Portc.0 Cs Alias Portc.1 Clk Alias Portc.2 Declare Sub Wyslij Declare Sub Ustawienia Declare Sub Czysc Dim Licz As Byte Dim Adres As Byte Dim Dane As Byte Dim Licz2 As Byte Dim Licz3 As Byte Dim Licz4 As Byte Dim Wartosc As Byte Call Ustawienia Licz4 = 1 Wartosc = 55 Do For Licz3 = 0 To 7 Waitms 1 Adres = Licz4 Dane = Lookup(wartosc , Tablica) Call Wyslij Decr Wartosc Incr Licz4 If Licz4 > 8 Then Licz4 = 1 End If Next Licz3 Wartosc = Wartosc + 7 Waitms 25 If Wartosc = 8 Then Call Czysc Wartosc = 63 Waitms 500 End If Loop Sub Ustawienia Set Cs Reset Din Reset Clk Adres = &HC 'shutdown mode Dane = &H1 'normal op Call Wyslij Waitms 10 Adres = &HA 'intensity Dane = &H03 'wartosc Call Wyslij Waitms 10 Adres = &H9 'decode mode Dane = &H0 'no decoding Call Wyslij Waitms 10 Adres = &HB 'scan limit Dane = &H7 'wszystkie Call Wyslij Waitms 10 Adres = &H0F 'test mode Dane = &H00 'normal op Call Wyslij Waitms 10 Call Czysc End Sub Sub Czysc 'czyszczenie całości For Licz2 = 1 To 8 Adres = Licz2 'wiersz HEX:1-8 Dane = &H0 'kolumny HEX:wszystkie 0 Call Wyslij Waitus 100 Next Licz2 End Sub Sub Wyslij Reset Cs Waitus 50 For Licz = 7 To 0 Step -1 Din = Adres.licz Set Clk Waitus 100 Reset Clk Waitus 100 Next Licz For Licz = 7 To 0 Step -1 Din = Dane.licz Set Clk Waitus 100 Reset Clk Waitus 100 Next Licz Set Cs End Sub Tablica: Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ' Data &H00 , &H00 , &H00 , &H00 , &H00 , &HFD , &HFD , &H00 'i Data &H00 , &HFF , &HFF , &H0E , &H1C , &H0E , &HFF , &HFF 'm Data &H00 , &H00 , &HF8 , &HFF , &H13 , &H13 , &HFF , &HF8 'a Data &H00 , &HFF , &HFF , &H0E , &H1C , &H0E , &HFF , &HFF 'm Data &H00 , &H00 , &HF8 , &HFF , &H13 , &H13 , &HFF , &HF8 'a Data &H00 , &H00 , &H81 , &HC3 , &H66 , &H3C , &HFF , &HFF 'k Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 ' [/bascomavr]