Multipleksowanie Wyświetlacza LED


Wyświetlacz siedmiosegmentowy LED jest często stosowany w układach mikroprocesorowych jednak ze względu na znaczną ilość sygnałów sterujących już przy dwóch wyświetlaczach problemem staje się brak wyprowadzeń procesora. Zawarte tutaj procedury dotyczą multipleksowania wyświetlaczy LED (w jednej chwili zaświecany jest tylko jeden na czas rzędu 4ms) dzięki której do pracy n wyświetlaczy potrzeba tylko 7 + n wyprowadzeń mikrokontrolera (8 + n gdy używamy kropki)

Język BASCOM 8051:


Poniższa procedura służy do obsługi dwóch wyświetlaczy LED. Musi być wywoływana co około 4ms:

Wyswietlanie:
  Mux = Not Mux
  If Mux = 1 Then
    Set P1.6
    Wysw10 = Wysw / 10
    Wysw10 = Lookup(wysw10 , Tabela)
    P3 = Wysw10
    Reset P1.7
  Else
    Set P1.7
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    P3 = Wysw1
    Reset P1.6
  End If
Return

Zmienna bitowa Mux po każdym wywołaniu tej procedury zmienia stan na przeciwny, przez co ustala który wyświetlacz ma aktualnie świecić. Do pinów P1.6 i P1.7 dołączone są (przez tranzystory) anody wyświetlaczy. Uruchomienie odpowiedniego wyświetlacza dokonuje się przez podanie stanu niskiego na tranzystor sterujący jego anodą. Do portu P3, przez rezystory ograniczające prąd włączone są katody dwóch wyświetlaczy połączone równolegle (segment a do segmentu a w drugim wyświetlaczu i tak dalej). Do poprawnej pracy konieczne jest jeszcze zdefiniowanie na końcu programu tabeli przeliczającej cyfry na kody wyświetlacza siedmiosegmentowego:

Tabela:
    Data 65 , 207 , 82 , 70 , 204 , 100 , 96 , 79 , 64 , 68
  'znak:  0     1        2      3       4       5       6     7      8     9    

Wartości w tabeli zależą od tego do których pinów portu podłączymy segmenty i w jakiej kolejności. Do odczytywania kodu odpowiedniej cyfry z tabeli służy funkcja Lookup. Wartość od 0 do 99 którą chcemy pokazać na wyświetlaczach wpisujemy do zmiennej Wysw. Zmienne Wysw10 i Wysw1 są pomocnicze i oznaczają cyfre dziesiątek i jednostek.




gosc's picture

Wyświetlanie

Witam.
Mam pytanie odnośnie multipleksacji. Zrobiłem sobie licznik modulo 100 w Assemblerze. Zastosowałem multipleksację ale problem polega na tym, że jedności świecą mi bardzo mocnym światłem a dziesiątki strasznie blado. Czym może to być spowodowane?
Z góry dzięki za odpowiedź.

gosc's picture

Ten problem już rozwiązałem

Ten problem już rozwiązałem :) Teraz mam inny. Otóż teraz jest tak, że podczas wyświetlania cyfry pojawia się jej poświata na drugim wyświetlaczu. Takie blade wyświetlenie cyfry z drugiego wyświetlacza. Czym to może być spowodowane bo tego już rozwikłać nie mogę :(

mirley's picture

Re: Multipleksowanie

Problem jest w kolejności wykonywania rozkazów a przynajmniej jestem tego prawie pewien. Aby uniknąć poświaty na drugim wyświetlaczu należy zadbać aby wykonywać rozkazy w następującej kolejności.

  • wyłączasz wyświetlacz 3 (żaden wyświetlacz nie jest wysterowany)
  • ustawiasz stany logiczne na segmentach (nic się narazie nie świeci bo wspólna końcówka wyświetlacza jest rozwarta)
  • włączasz wyświetlacz 1
  • czekasz ok 4ms (dla 3 - 4 wyświetlaczy jest to ok czas)
  • wyłączasz wyświetlacz 1
  • ustawiasz stany logiczne na segmentach odpowiadające drugiej cyfrze
  • włączasz wyświetlacz 2
  • czekasz 4ms
  • wyłączasz wyświetlacz 2
  • ....

i tak dalej

W taki sposób ja zawsze piszę obsługę wyświetlacza LED w Bascomie i zawsze działa, ale w dowolnym języku ten prosty algorytm też musi działać.

gosc's picture

Dzięki wielkie. można

Dzięki wielkie. można powiedzieć, że moim błędem nie było wyłączenie wyświetlaczy. Dzisiaj się tym pobawię:)
Dzięki za szybką odpowiedź :)
Jeszcze raz dzięki :)

gosc's picture

mod

Witam mam problem z kompilacja i nie wiem czy to wina programu bascom mam wersje 1,11,9,5 a dokladnie z funkcja MOD

przykład:
$regfile = "m8def.dat"
$crystal = 8000000

Dim A As Single
Dim B As Single

Do
B = 253
A = B Mod 10
Loop
End

wyskakuje mi bład:
error 31 invalid datatype [[0011] 112[10]]
jak recznie podstawie (a=253 mod 10) wszystko gra ...

mirley's picture

Re: Multipleksowanie

Problem jest w linijkach:

Dim A As Single
Dim B As Single

Czy napewno zmienne A i B muszą być zmiennoprzecinkowe, użyj zamiast Single typu: Byte (0-255) lub Word (0 - 65536). nawet jeśli przypiszesz do singla wartość 253 to dla niego to i tak będzie 253.0000000 i będzie problem z resztą z dzielenia

Ps. Nie wiem co to pytanie ma wspólnego z multipleksowaniem wyświetlacza więc następnym razem na forum takie rzeczy pisz. Wystarczy się zalogować to nic nie kosztuje a ja chętnie odpowiadam na pytania jeśli inni utrzymują porządek na stronie tak jak o to proszę

Post new comment

The content of this field is kept private and will not be shown publicly. If you have a Gravatar account, used to display your avatar.
  • You can use BBCode tags in the text. URLs will automatically be converted to links.
  • Use the special tag [adsense:format:slot] or [adsense:format:[group]:[channel][:slot]] or [adsense:block:location] to display Google AdSense ads.
  • You can enable syntax highlighting of source code with the following tags: [code], [blockcode], [c], [cpp], [java], [javascript], [php], [python], [qb].
  • Image links with 'rel="lightbox"' in the <a> tag will appear in a Lightbox when clicked on.

More information about formatting options