LinkedIn YouTube Facebook
Szukaj

Wstecz
SoM / SBC

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]
Inżynier elektronik, absolwent Wydziału Elektroniki i Technik Informacyjnych Politechniki Warszawskiej. Swoje życie zawodowe i hobby związał z elektroniką i mechatroniką. Specjalizuje się w projektowaniu i utrzymywaniu systemów testowania produkcyjnego w firmie SoMLabs, jest autorem artykułów poświęconych elektronice, programowaniu i systemom wbudowanym (embedded).