Multipleksowany wyświetlacz 7-segmentowy

Multipleksowany wyświetlacz 7-segmentowy
Furia 824
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:8
0

Witam.
Korzystam z oprogramowania MCU 8051 IDE. Mam problem z multipleksowanym wyświetlaczem 7-segmentowym. Nie wiem w jaki sposób mogę go wyzerować, tak aby zniknęły wcześniej wypisane cyfry
Mam taki kod, który nie wiem czy jest poprawny.

Kopiuj
org 0000h
ljmp start

org 0100h
start: mov P2, #11110111b
       mov P3, #00001101b
       mov P3, #11111111b
       mov P2, #11111011b
       mov P3, #00100101b
       mov P3, #11111111b
       mov P2, #11111101b
       mov P3, #10011111b
       mov P3, #11111111b
       mov P2, #11111110b
       mov P3, #00000011b
       mov P3, #11111111b
       sjmp $

Wynik jego działania jest następujący:
title
Chciałbym po wypełnieniu całego wyświetlacza zapisywać go od nowa, ale nie wiem w jaki sposób usunąć już wypisane cyfry.

JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
2

port P2 aktywuje poszczególne wyświetlacze dlatego podaje się tam sekwencje 0111 1011 1101 1110, czyli zero powoduje, że jeden z 4 tranzystorów (po lewej stronie) zostaje włączony dzięki czemu podane zostaje zasilanie do wybranego wyświetlacza. Port P3 uaktywnia wybrane segmenty w tym kropkę, czyli bit wyzerowany spowoduje, że dioda będzie się świecić, a 1 że zgaśnie.

Kopiuj
            tysiace
                 |  jednosci
                 |  |
    mov P2, #11111110b  // wybor wyswietlacza, 0-aktywny
    mov P3, #00000011b  // wybor segmentu, 0-swieci, 1-nie swieci
             |      |
             A      |
                    kropka

wystarczy więc wpisać 0 do portu P3, żeby zgasić dany segment.

Furia 824
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 5 lat
  • Postów:8
0

@jvoytech Dzięki, a wiedziałbyś może, co zrobić, aby już wpisany znak w danym segmencie został tam dopóki samemu się go nie usunie? Chodzi mi o to, aby można było wpisać cztery liczby - po jednej w każdy segment i żeby pozostały tam one dopóki, wszystkie segmenty nie będą wypełnione, bo w tym momencie dzieje się tak, że wpiszę liczbę w pierwszy segment, w drugi, liczba z pierwszego segmentu znika, potem w trzeci, liczba z drugiego segmentu znika, itd. A zależałoby mi na tym, żeby te liczby tam zostały. (Oczywiście nie znikają od razu, bo zanim wpiszę liczbę w kolejny segment to mija trochę czasu, bo wykonuję też inne operacje pomiędzy tym. Więc wpisuję liczbę w drugi segment, ta w pierwszym chwilę jeszcze jest i zaraz znika)

edytowany 1x, ostatnio: Furia 824
JV
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:242
0

Idea multipleksingu polega właśnie na tym, że w danym momencie tylko jeden wyświetlacz świeci, ale jak zmiana odbywa się co ~20ms to oko tego nie zauważy. Najlepiej by było przełączanie władować do funkcji obsługi przerwań wywoływanej jakimś timerem co np. 25ms.

Jeszcze jedna rzecz której nie zauważyłem wcześniej. W programie jest jeszcze jeden błąd, który może spowodować poświatę na sąsiednich wyświetlaczach:

Kopiuj
mov P2, #wyswietlacz3
mov P3, #xxxxxxxx         ; x - 0 albo 1
mov P2, #wyswietlacz2
mov P3, #xxxxxxxx

jak przełączasz na kolejny wyświetlacz, to wyświetlana wartość dla poprzedniego ciągle jest na porcie P3, i pojawi się ona na chwilę na sąsiednim wyświetlaczu. To czy będzie widoczna zależy od pozostałego kodu i mam na myśli fizyczne urządzenie a nie symulacje. Prawidłowa sekwencja byłaby taka:

Kopiuj
mov P2, #xxxx1111  ; wyłącz wyświetlacze
mov P3, #xxxxxxxx ; ustaw segmenty
mov P2, #xxxx0111 ; włącz pierwszy wyświetlacz
delay(20ms)
mov P2, #xxxx1111 ; wyłącz wyświetlacze
mov P3, #xxxxxxxx ; ustaw segmenty
mov P2, #xxxx1011 ; włącz następny wyświetlacz
delay(20ms)
...

Jeżeli piszesz program i używasz jedynie symulatora to sprawdź czy w symulatorze wyświetlacza można ustawić czas podtrzymania świecenia segmentów przez jakiś ustalony czas, wtedy można by było osiągnąć to chcesz i było zbliżone do działającego urządzenia w naturze.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.