Ćwiczenie 2 Siedmiosegmentowy wyświetlacz LED
2-1. Cel ćwiczenia Celem ćwiczenia jest zapoznanie się studentów ze sposobem obsługi wielopozycyjnego 7-segmentowego wyświetlacza LED multipleksowanego programowo oraz, w efekcie końcowym, napisanie procedury wyświetlającej na wyświetlaczu stabilny obraz składający się z różnych znaków. Przemiatanie wyświetlacza powinno być zrealizowane z wykorzystaniem przerwania od licznika T0, z którym studenci zetknęli się już na poprzednich zajęciach laboratoryjnych. 2. Wyświetlacz Wyświetlacz siedmiosegmentowy oprogramowywany w trakcie ćwiczenia składa się z pięciu pozycji. Szóstą stanowią różnokolorowe diody LED (D1 D8), których obsługa była tematem poprzedniego ćwiczenia. Jedną z pozycji wyświetlacza 7-segmentowego przedstawiono schematycznie na rys.1. a f e g d b c h Rys.1. Oznaczenie segmentów w wyświetlaczu 7-segmentowym LED Segmenty są oznaczane literami od a do h (kropka dziesiętna) rys.1. Anody wszystkich segmentów danej pozycji są ze sobą połączone (wspólna anoda) i sterowane z kolejnych linii portu P2 (od P2.0 do P2.5) rys.2. Katody (segmenty) natomiast z wyjść portu P7 pośrednio poprzez rejestr U4, wzmacniacz prądowy U5 oraz rezystory o wartości 60Ω i 130 Ω ograniczające wartość natężenia prądu płynącego przez diody (segmenty). Aby wyświetlić znak (cyfrę) na jednej z pozycji należy w pierwszej kolejności wysterować żądaną pozycję poprzez wystawienie na odpowiadającej jej lini portu P2 stanu niskiego. Spowoduje to właczenie tranzystora PMOS (T2 T7) i tym samym podłącznie anody danej pozycji do potencjału +5V. Następnie należy na porcie P7 wystawić wartość określającą wyświetlany znak i zatrzasnąć ją w rejestrze U4 poprzez zmianę stanu lini CK_D (P5.6) z niskiego na wysoki (układ zatrzaskuje wartość wraz z pojawieniem się zbocza narastającego na lini CK_D). Jeżeli dany bit na wyjściu układu U4 ma wartość 1, odpowiadający mu segment wybranej wcześniej pozycji świeci się. W Tabeli 1 zebrano wartości (w kodzie binarnym i heksadecymalnym) odpowiadające poszczególnym cyfrom dziesiętnym.
3- Rys.2. Schemat poglądowy podłaczenia wyświetlaczy 7-segmentowych do mikrokontrolera. Tabela 1: Bajty sterujące wyświetlaczem 7-segmentowym h g f e d c b a h g f e d c b a 0 0 1 1 1 1 1 1 (3FH) "0" 0 0 0 0 0 1 1 0 (06H) "1" 0 1 0 1 1 0 1 1 (5BH) "2" 0 1 0 0 1 1 1 1 (4FH) "3" 0 1 1 0 0 1 1 0 (66H) "4" 0 1 1 0 1 1 0 1 (6DH) "5" 0 1 1 1 1 1 0 1 (7DH) "6" 0 0 0 0 0 1 1 1 (07H) "7" 0 1 1 1 1 1 1 1 (7FH) "8" 0 1 1 0 1 1 1 1 (6FH) "9" 0 1 1 1 0 1 1 1 (77H) "A" 0 0 1 1 1 0 0 1 (39H) "C" 0 1 1 1 1 0 0 1 (79H) "E" 0 1 1 1 0 0 0 1 (71H) "F" 0 1 1 1 0 1 1 0 (76H) "H" 0 0 0 0 1 1 1 0 (0EH) "J" 0 0 1 1 1 0 0 0 (38H) "L" 0 1 1 1 0 0 1 1 (73H) "P" 0 0 1 1 1 1 1 0 (3EH) "U" 0 1 0 1 1 0 0 0 (58H) "c" 0 1 0 1 1 1 1 0 (5EH) "d" 0 1 1 1 0 1 0 0 (74H) "h" 0 1 0 1 0 1 0 0 (54H) "n" 0 1 0 1 1 1 0 0 (5CH) "o" 0 1 0 1 0 0 0 0 (50H) "r" 0 0 0 1 1 1 0 0 (1CH) "u" 0 1 0 0 0 0 0 0 (40H) "-" Aby wyświetlić dany znak z kropką należy na najstarszym bicie portu P7 (P7.7) wystawić 1. Sterowanie pozycjami wyświetlacza ma charakter dynamiczny, tzn. w danej chwili aktywna jest tylko jedna pozycja wyświetlacza, ale "przemiatanie" poszczególnych pozycji można uczynić na tyle szybkim, aby ludzkie oko odbierało stabilny obraz.
4-3. Algorytm i struktura danych programu obsługi Obsługa wyświetlacza znajdzie się w procedurze obsługi przerwania od licznika T0. Można ją zrealizować dwoma algorytmami przedstawionymi w Tabeli 2. Tabela 6. Algorytmy obsługi wyświetlacza Algorytm 1 Algorytm 2 1. Wygaszenie wszystkich segmentów Wyłączenie wszystkich pozycji 2. Włączenie nowej pozycji Podanie wartości określającej znak wyświetlany na nowej pozycji 3. Podanie wartości określającej znak wyświetlany na nowej pozycji Włączenie nowej pozycji Potrzebna jest również odpowiednia struktura danych - 5 bajtów, w których zapamiętane będą znaki wyświetlane na kolejnych pozycjach wyświetlacza. 4. Zadanie do wykonania: a) na ocenę w zakresie 0 4 punktów: Uzyskać stabilny obraz na wszystkich pozycjach wyświetlacza, przy czym na każdej pozycji ma być wyświetlony inny znak. Do multipleksowania wyświetlacza wykorzystać przerwanie czasowe Timera T0. Dane do wyświetlania mają być pobierane z bufora wyświetlacza umieszczonego w wewnętrznej pamięci RAM mikrokontrolera. Zawartość bufora wyświetlacza ma być inicjowana przepisaniem zdefiniowanego tekstu z pamięci programu. Wskazówki: Ciąg instrukcji przedstawiony poniżej realizuje fragment algorytmu nr 1 (Tabela 2) DIGIT0 equ P2.0 DIGIT1 equ P2.1 DIGIT2 equ P2.2 DIGIT3 equ P2.3 DIGIT4 equ P2.4 LEDS equ P2.5 CK_D equ P5.6... mov P2, #0ffh ; wylaczenie wszystkich pozycji wyswietlacza... mov P7, #00h ; wystawienie wartości powodującej ; wylaczenie wszystkich segmentow clr CK_D setb CK_D ; zatrzasniecie bajtu sterujacego w zatrzasku U4 clr DIGIT2 ; wybranie nowej pozycji mov P7, #7Dh ; wlaczenie segmentow odpowiadajacych nowej pozycji clr CK_D setb CK_D ; zatrzasniecie bajtu sterujacego w zatrzasku U4... Aby wyświetlany obraz był stabilny częstotliwość odświeżania powinna wynosić minimum 60Hz (zalecane 100Hz). Zmiana pozycji powinna następować co 2ms.
5- W celu uzyskania takiego czasu pomiędzy kolejnymi przerwaniami licznika T0, powinien być on przeładowany każdorazowo wartością T0Reload = 65536 500. Napis, który pojawi się na wyświetlaczu, można umieścić w pamięci programu. Załóżmy, że na wyświetlaczu chcemy wyświetlić kolejne cyfry: 0, 1, 2, 3, 4, 5. W programie tworzymy tablicę: display: ; adres bazowy tablicy znaków db 3FH ; 0 db 06H ; 1 db 5BH ; 2 db 4FH ; 3 db 66H ; 4 db 6DH ; 5 można też użyć db tylko jeden raz w następujący sposób: display: db 3FH, 06H, 5BH, 4FH, 66H, 6DH Dyrektywa db (define byte) inicjalizuje bajt/y w pamięci programu. Pierwszy zdefiniowany bajt jest umieszczony pod adresem display, następny pod adresem o 1 większym, itd. Dostęp do tablicy danych umieszczonych w pamięci programu jest możliwy za pomocą instrukcji: movc A, @A+DPTR W wyniku wykonania tej instrukcji do akumulatora zostaje przesłana zawartość komórki pamięci programu o adresie równym sumie początkowej zawartości akumulatora oraz zawartości wskaźnika danych DPTR. Aby odwołać się do uprzednio zdefiniowanej tablicy znaków, trzeba nadać wartość początkową wskaźnikowi danych (adres początku tablicy): mov DPTR, #display Jeżeli teraz chcemy pobrać do akumulatora, ze zdefiniowanej tablicy, kod (bajt) odpowiedniej cyfry, to do akumulatora musimy wpisać numer elementu tablicy do pobrania (elementy liczone są od zera) i wykonać instrukcję: movc A, @A+DPTR Jeżeli przykładowo chcemy pobrać kod cyfry 2, to odpowiedni program będzie wyglądał nastepująco: mov DPTR, #display mov A, #2 movc A, @A+DPTR Pobranie innych elementów tablicy wymaga odpowiedniej modyfikacji zawartości akumulatora lub wskaźnika danych (za pomocą instrukcji inc DPTR). UWAGA: tablicę znaków trzeba umieścić w takim miejscu programu, aby licznik rozkazów nie mógł przyjąć wartości odpowiadających adresom w obszarze tablicy znaków, gdyż oznaczałoby to, że pewien fragment tablicy zostanie potraktowany jako kolejna instrukcja do wykonania. Tablica może być umieszczona np. bezpośrednio po instrukcji bezwzględnego skoku (jmp) albo po instrukcji ret czy reti.
6- b) na ocenę w zakresie 0 6 punktów: Napisać procedurę obsługi przerwania czasowego Timera T0 obsługującą wyświetlacz (multipleksowanie czasowe pozycji) oraz realizującą efekt płynącego tekstu. Tekst wsuwa się do wyświetlacza z prawej. Długość tekstu ma być dowolna w granicach rozsądku (tj. od 15 do 40 znaków). Ostatnie pięć znaków wyświetlanego tekstu ma być ciemne na wyświetlaczu. Dane do wyświetlania mają być pobierane z bufora wyświetlacza umieszczonego w wewnętrzniej pamięci RAM mikrokontrolera. Zawartość bufora ma być inicjowana przepisaniem zdefiniowanego tekstu z pamięci programu. Po zakończeniu wyświetlania rozpoczyna się wyświetlanie tekstu od początku od pierwszego znaku. Szybkość przesuwu programowana (stałą) w rozsądnych granicach. Wskazówki: Do uzyskania efektu pływającego tekstu można wykorzystać również licznik T0, który spowoduje przesunięcie tekstu o jedną pozycje co n-te swoje przerwanie. Timer_Interrupt: push ACC mov SFRPAGE, #TIMER01_PAGE mov TH0, #0dfh mov TL0, #0ffh mov SFRPAGE, #CONFIG_PAGE djnz VALUE2, Label_1 mov VALUE2, #0ffh ; flaga READY1 ustawiana co 255 przerwan setb READY1 Label_1: pop reti ACC c) na ocenę w zakresie 0 8 punktów: Zadanie z punktu b) oraz napisać program główny przełączający wyświetlanie pomiędzy tekstami po dwukrotnym wyświetleniu (przesunięciu) każdego z nich. UWAGA: Wyświetlacz jest przystosowany do pracy w trybie multipleksowanym w związku z tym próba wyświetlenia na wszystkich sześciu pozycjach (także na diodach LED), tej samej wartości (np. 0ffh) spowoduje nieoczekiwane dziwne efekty. UWAGA!!!! Przed przystąpieniem do realizacji ćwiczenia przeprowadzony zostanie krótki (ok. 10 min.) sprawdzian za 2 p. Zakres materiału: posługiwanie się asemblerem (dopuszcza się korzystanie z listy instrukcji); przeznaczenie rejestrów specjalnych wykorzystywanych w ramach ćwiczenia.
7-