Wyświetlacz LCD na RS-232


Układ jest uniwersalnym wyświetlaczem LCD sterowanym za pośrednictwem portu RS-232. Dzięki zastosowaniu mikrokontrolera ATTINY2313 oraz konwertera poziomow MAX232 układ może być bezpośrednio podłączony do komputera. Sterowanie wyświetlaczem odbywa się za pomocą programu przesyłającego kody ASCI oraz specjalne instrukcje sterujące położeniem kursora i włączaniem podświetlania, na port RS-232 (zamiast specjalnego programu może być dowolny terminal). Dodatkowo układ może wspołpracować z innym mikrokontrolerem i służyć mu jako wyświetlacz sterowany tylko za pomocą jednej linii sygnałowej. Jest to przydatne szczegolnie gdy chcemy zamontować wyświetlacz kilkanaście metrow od głownego systemu mikroprocesorowego. Ponieważ układ wyświetlacza posiada dwukierunkowy interfejs szeregowy, istnieje możliwość podłączenia klawiatury i przesyłanie rozkazow sterujących pracą urządzenia (od wyświetlacza do urządzenia) za pomocą dodatkowego przewodu.

Działanie:

Schemat ideowy układu został przedstawiony na rysunku poniżej:

Sercem układu jest mikrokontroler U1 (ATTINY2313) wraz z rezonatorem kwarcowym X1 (16MHz) i dwoma kondensatorami C1 (22pF) i C2 (22pF). Potencjomatr P1 (10k) umożliwia regulację kontrastu wyświetlacza LCD W1 (16x2). Tranzystor T1 (BC556) wraz z rezystorami R1 (3,3k) i R2 (3,3k) umożliwia sterowanie podświetlaniem LCD. Rezystor R3 (47R) ogranicza prąd obwodow podświetlania wyświetlacza W1. Kondensatory C7 (100uF) i C8 (100nF) filtrują napięcie zasilania mikrokontrolera. Układ U2 (MAX232) jest konwerterem napięć, dostosowuje on stany logiczne występujące na porcie RS-232 do standardow obsługiwanych przez mikrokontroler. Kondensatory elektrolityczne C3 - C6 (1uF) są konieczne do poprawnej pracy układu U2. Złącza RxD_G oraz TxD_Vcc umożliwiają podłączenie zasilania i przewodow sygnałowych portu RS-232. Ponieważ port szeregowy jest dwukierunkowy istnieje możliwość podłączenie klawiatury i sterowania drugim mikrokontrolerem lub programem komputerowym. Do tego celu służy złącze GP1(wymaga modyfikacji programu). Do zaprogramowania mikrokontrolera służy złącze Prog a dodatkowo jego dwa piny (nie podłączone do wyświetlacza W1) mogą być wykorzystane w dowolny sposob (po zaprogramowaniu mikrokontrolera)

Budowa:


Wyświetlacz można zbudować w oparciu u płytkę drukowaną dostępną tutaj. Rysunek w odbiciu lustrzanym można pobrać tutaj. Montaż należy rozpocząć od wlutowania trzech zworek. Kondensatory elektrolityczne C3- C7 należy zamontować w pozycji leżącej, tak aby zmieściły się pod wyświetlaczem LCD, znajdującym się nad całą płytką drukowaną. Złącza Prog i GP1 mogą być w wersji "kątowej", ułatwi to podłączenie po zamontowaniu wyświetlacza. Rezonator kwarcowy musi być w wersji niskiej z tego samego powodu co leżące kondensatory. Pod mikrokontroler i układ U2 należy zastosować podstawki. Pomocą w konstrukcji może okazać się schemat montażowy dostępny tutaj

Wykaz Elementów:

2x Złącze Śrubowe ARK2(podwójne)
2x Listwa Goldpin 1x4 (GP1)

2x 3,3k
1x 47R
1x Potencjometr Montażowy 10k

2x 22pF
1x 100nF
4x 1uF Elektrolit
1x 100uF Elektrolit

1x Rezonator Kwarcowy 16MHz
1x BC556
1x Mikrokontroler ATTINY2313 + Podstawka
1x Konwerter Napięć MAX232
1x Wyświetlacz LCD 16x2

Programowanie:

Mikrokontroler został zaprogramowany w wersji demo programu BASCOM AVR firmy MCS Electronics (http://www.mcselec.com/). Program przedstawiony jest poniżej:

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "attiny2313.dat"
$crystal = 16000000
$baud = 9600
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B10111111
 
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5       'mirley test board
Config Lcd = 16 * 2
Cls
Cursor On Blink
 
'Typ wyswietlacza LCD Kmax*Wmax
Const Kmax = 16
Const Wmax = 2
 
'********** Konfiguracja uC Koniec  ************
 
'******************  Zmienne *******************
'***********************************************
Dim Znak As Byte
Dim S As String * 1
Dim K As Byte , W As Byte
'*************  Zmienne Koniec  ****************
 
'************ Warunki Poczatkowe ***************
'***********************************************
K = 1
W = 1
'*******  Warunki Poczatkowe Koniec  ***********
 
'**************  Petla glowna ******************
'***********************************************
Do
 
Inputbin Znak
If Znak <> 0 Then
  Select Case Znak
 
    Case 1:
    '****************************  podswietlanie
    Toggle Portd.6
    '****************************
 
   'Case 2....7 
 
    Case 8:
    '**************************** kasowanie ostatniego (backspace)
      Decr K
      If K = 0 Then
        K = Kmax
        Decr W
        If W = 0 Then W = Wmax
      End If
      Locate W , K
      Lcd " "
      Locate W , K
    '**************************** kasowanie ostatniego (backspace)
 
    'Case 9....12
 
    Case 13:
    '**************************** enter
      Incr W
      If W > Wmax Then W = 1
      K = 1
      Locate W , K
    '**************************** enter
 
   'Case 14....26
 
    Case 27:
    '**************************** kasowanie calosci(ESC)
      Cls
      K = 1
      W = 1
      Locate W , K
    '**************************** kasowanie calosci
 
   'Case 28....31
 
    Case 32 To 126:
    '**************************** znaki standardowe
      S = String(1 , Znak)
      Locate W , K
      Lcd S
 
      Incr K
      If K > Kmax Then
        K = 1
        Incr W
        If W > Wmax Then W = 1
      End If
    '**************************** znaki standardowe
 
    'Case 127....160
 
    Case 161 To 244:
    '**************************** locate
    K = Znak And &B00011111
    W = Znak And &B01100000
    Shift W , Right , 5
    If K <= Kmax And W <= Wmax Then
      Locate W , K
    End If
    '**************************** locate
    'locate -> Wysylamy wartosc 1kkwwwww (kk-numer kolumny, wwwww-numer wiersza)
            'gdzie kk = (01....11)  wwwww = (00001.....10100)
 
    'Case 245....255
 
  End Select
End If
Loop
End
'************ Petla glowna Koniec **************

Obsługa:

Do osługi wyświetlacza konieczny jest komputer z programem typu terminal, lub własnym programem sterującym. Można także wykorzystać drugi mikrokontroler i wysyłać odpowiednie informacje za jego pomocą.

Kody sterujące (wysyłane wartości liczbowe):
1 - Zmiana stanu podświetlania
2...7 - nieużywane
8 - Backspace (kasuje ostatnio wpisany znak)
9...12 - nieużywane
13 - enter (przejście do następnej linii)
14...26 - nieużywane
27 - kasowanie całego tekstu
28...31 - nieużywane
32...126 - standardowe znaki według kodu ASCI
127...160 - nieużywane
161...244 - pozycja, wartość binarna 1kkwwwww (gdzie kk = (01...11) - numer kolumny, wwwww = (00001...10100) - numer wiersza)
245...255 - nieużywane

Zdjęcia Projektu:

AttachmentSize
Schemat58.2 KB
Płytka13.07 KB
Płytka (odbicie lustrzane)13.21 KB
Płytka (6 na stronie)65.58 KB
Montowanie17.25 KB
Kod Źródłowy2.77 KB
Program po kompilacji (BIN)970 bytes
Program po kompilacji (HEX)2.68 KB



gosc's picture

Witam, mam pytanie. Co

Witam, mam pytanie. Co można wyświetlać na LCD. Czy dane z winampa np nazwa wykonawcy i tytuł tworu, prędkość download'u i upload'u itp?

mirley's picture

Re: Sterowanie

Wyświetlacz pokazuje wszystko co przyjdzie po porcie RS232 + dodatkowe komendy sterujące jednobajtowe. Analizując kod można się wiele dowiedzieć o zakresie liczbowym jaki jest obsługiwany. Opis projektu nie jest jeszcze skończony ze względu na ograniczony czas ale wszystko to zostanie opisane. Skoro mowa o winampie to w wolnej chwili sprawdze czy da się wyswietlić odpowiedni napis

gosc's picture

Polskie znaki na LCD ?

Witam

Czy wysyłając polskie znaki z Windowsa (kodowanie Win1250) na port szeregowy poprawnie są na LCD wyświetlane ?

Z poważaniem
Silos

mirley's picture

Re: Polskie Znaki

Wyświetlacze nie obsługują polskich znakow, ale jest mozliwość zdefiniowania swoich 8 dowolnych znakow w programie mikrokontrolera. Należało by napisać w kodzie możliwość definiowania swoich znakow, będzie to jednak z pewnością kłopotliwe bo żeby wyświetlacz nauczył się nowego znaku konieczne jest wykonanie ponownej inicjalizacji wyświetlacza (w bascomie jest to polecenie Cls) ktora wyczyści jego zawartość i trzeba będzie tekst na nowo wprowadzić

gosc's picture

Matryca LED 10x50

Witam!

A jakbyśmy chcieli zamiast LCD dać matrycę LED 10x50... To jakby to wyglądało? Trzeba by było łączyć kilka procków i jakby wyglądało sterowanie za pomocą programu?

Pozdrawiam!

mirley's picture

Re: Matryca LED

Kiedys zastanawiałem się nad tym jak mozna by było sterowac taką matrycą (cos podobnego do takiej jak w autobusie:) ). Tak zwykle to raczej nie będzie się dało bo nawet ATMEGA64 nie ma tylu wyprowadzeń. Można spróbować użyć układu FPGA ale nie jest to tanie rozwiązanie a zamontowanie takiego chipa na płytce jest w domowych warunkach niemożliwe i trzeba by było korzystać z jakiejś fabrycznej płytki.

Rozwiązaniem najbardziej optymalnym jest zastosowanie expenderów działających na magistrali I2C. jeden posiada pełny port 8- bitowy. kilka takich powino dać radę ale nie wiem jak z szybkością multipleksowania. Mozna by podzielić ewentualnie na kilka sekcji, ale to jeszcze zwiększy ilość wyprowadzeń.

Ostatnią możliwościa jest, tak jak wspomniałeś, więcej mikrokontrolerów. Problemem bedzie komunikacja między nimi

Ogólnie całe zagadnienie nie wydaje się proste, ale może tylko tak strasznie wygląda na pierwszy rzut oka :)

gosc's picture

Re: Matryca LED

Witam
Może błądzę ale wydaje mi się, że możnaby było to zrealizować na jednym uC łącząc w rzędy i kolumny anody i katody diod. Wtedy dla matrycy 5x10 wystarczyłoby 15 wyprowadzeń (wraz z małymi tranzystorkami na tych 5) a multipleksowaniem zająłby sie mikrokontroler. Zrealizowałem coś podobnego ale z 6 wyswietlaczami 7-segmentowymi na uC atmega8. Tutaj również jest macierz LEDów 6x7, tyle, że inaczej ułożonych ;)
Pozdrawiam

PS. Świetna strona! Będę tu często zaglądał.

gosc's picture

Re: Matryca LED

Ups...

Źle spojrzałem - 10x50 ;)
To faktycznie problem. W tej chwili na myśl przychodzi mi tylko podzielenie tego na 2 sekcje i traktowanie jako macierzy 20x25. 45 wyprowadzeń chyba bałoby się uzyskać stosując 40-nożkowy uC i jakiś dekoder. Co sądzicie o tym?

mirley's picture

Re: Matryca

jak już mówiłem 10x50 to jest problem. Przydał by sie expender 16-bitowy na I2C to by nie było takiego problemu. Narazie nie wiem jakby to zrobić ale bedę się zastanawiał :))

gosc's picture

Re: Matryca LED

Wyżej pisałeś, że nie wiesz jak by to wyglądało z szybkością multipleksowania. Myślę, że z powodzeniem możnaby zastosować demultipleksery/dekodery 74LS154. Zamieniają 4-bitowy kod NKB na "1 z 16". Używając trzy dla 48 linii (lub cztery dla 64), łącząc ich wejścia adresowe równolegle do 4 linii portu a ich wejścia informacyjne przez kolejny, mniejszy (NKB na "1 z 4" - 1/2 74LS155), demultiplekser. Coś na kształt połączenia kaskadowego. Jego wejścia adresowe należałoby podłączyć do kolejnych dwóch pinów uC a wejscie danych do +5V. Wtedy wystarczy 6 bitów do sterowania a liczba wystawiona na porcie będzie numerem linii, jeśli użyje się bitów 0-5. Na sterowanie diodami w linni kolejne 10 pinów, co daje 16, czyli dwa pełne porty 8-bitowe. Mam nadzieję, że się komuś do czegoś przyda ten elaborat ;)

gosc's picture

Re: Matryca

Może na razie nie zaprzątaj sobie tym głowy :)
Z tymi expanderami to tak wcześniej myślałem... Ale szybko mi to umknęło... A to źle. Bo to niezła opcja :)
Pokombinuję troszkę w przyszłym tygodniu z 2 expanderkami 8 bitowymi (bo takie mi najłatwiej zdobyć na tą chwile) i jak coś fajnego wyjdzie to poszerzę swoją matrycę bo w sumie jeden szereg będe mógł połączyć z już istniejącym a do drugiego podłączę 16 bitowy expander i pójdą 4 dodatkowe szyny do uC :)

Jak będę miał jakieś problemy to rozumiem że mogę liczyć na radę... A mogą być małe problemy z oprogramowaniem do uC ;)
Niemniej jednak jak już projekt będę to będe namawiał na zamieszczenie na stronce ze względu na uniwersalność i prostotę bo schemacik mam już rozrysowany dla matrycy 16x16 (256 diod). Oczywiście diody to nic strasznego bo w sklepach elektronicznych byśmy zostawili majątek ale od czego jest allegro... Ja znalazłem fajne LEDy SMD po 16gr/szt... No ale starczy tego gadania - trzeba się brać do pracy ;)

Pozdrawiam!

P.S.
Jakby ktoś uważał że to jest nie na temat to nic mylnego bo matryca będzie wykorzystana do wyświetlania znaków zadanych przez port RS232 a więc cząstkowo związane z projektem :)

gosc's picture

Re: Matryca

Jeszcze wspomnę że jakby coś migało czy też za wolno chodziło to można zastosować Atmege48... Ona może śmigać na kwarcu 24MHz :)

mirley's picture

Re: Matryca LED

W sumie to matryca bardziej pasuje do artykułu o Wyświetlaczu LED na RS-232 niż do tego ale faktycznie luźno jest związana z projektem :)

Jak możecie to piszcie pod wyświetlaczem LED na RS232

Odnośnie dekoderów typu "kod binarny -> 1 z 10" to jest to dobry pomysł do sterowania wierszy a ponadto upraszcza program.

Przy programowaniu w miarę możliwości pomogę

gosc's picture

Matryca lcd

Witam, projekt bardzo ciekawy lecz moje pytanie dotyczy czy można inny wyświetlacz alfanumeryczny wykorzystać?
Jeśli tak to jaki?

mirley's picture

Re: LCD

Można wykorzystać dowolny wyswietlacz LCD, jego wymiary podaje sie na początku w kodzie programu. Należy zmodyfikować linie:

'Typ wyswietlacza LCD Kmax*Wmax
Const Kmax = 16  'liczba kolumn
Const Wmax = 2   'liczba wierszy

gosc's picture

locate

Witam

Mogłbyś krok po kroku napisać jak działa polecenie locate ?

    Case 161 To 244:
    '**************************** locate
    K = Znak And &B00011111
    W = Znak And &B01100000
    Shift W , Right , 5
    If K <= Kmax And W <= Wmax Then
      Locate W , K
    End If
    '**************************** locate
    'locate -> Wysylamy wartosc 1kkwwwww (kk-numer kolumny, wwwww-numer wiersza)
            'gdzie kk = (01....11)  wwwww = (00001.....10100)

co daje napisanie K = Znak And &B00011111 ?

Pozdrawiam

mirley's picture

Re: Locate

Nie ma tu nic skomplikowanego a tylko kilka operacji logicznych na bitach:

Linia:

 K = Znak And &B00011111

to zwykłe maskowanie bitów za pomocą operacji iloczynu logicznego (AND). Każdy bit zmiennej 8-bitowej Znak jest porównywany z odpowiadającym mu bitem w masce &B00011111 . W efekcie tam gdzie jest 0 w masce odpowiadające bity zmiennej Znak zostaną wyzerowane. Tam gzie jest 1 w masce, odpowiadający bit zostanie bez zmian (Zgodnie z tabelą prawdy bramki AND: 1 and 1 = 1, pozostałe przypadki 0)

Pozwala to z jednej zmiennej wyciąć dwie informacje, o kolumnie i wierszu. W pierwszym przypadku wycinamy 3 najstarsze bity a w drugim, w linijce:

 W = Znak And &B01100000
 Shift W , Right , 5

zostawiamy tylko bit numer 6 i 5, pozostałe zerując. Ponieważ w drugim przypadku, uzyskana wartość nie jest z przedziału 0-4, przesuwamy bity poleceniem Shift, tak aby potrzebne wartości znalazły się na bitach 0 i 1.

W dalszej części kodu sprawdzamy czy wartości odczytane są z dobrego przedziału i ustawiamy kursor w odpowiednim miejscu.

gosc's picture

rs-232 i podnośnik

a jeżeli w podnośniku koszowym ruthmann mam port rs232 do obsługi drugiego wyświetlacza to będzie on chodzi a i czy mogę podłączyć wyświetlacz lcd 4x20

mirley's picture

Rs: Wyswietlacz LCD

Wyświetlacz 4x20 będzie chodził z moim urządzeniem ale nie zanaczy to że możesz podłączyć całość do RS-232 w swoim podnośniku. To że jest tam też port Rs232 to nic nie znaczy, ważne jest to co układ po nim wysyła. Co trzeba wysyłać aby moje urządzenie działało podałem wyżej w opisie. Musisz mieć jakąś specyfikacje albo coś podobnego odnośnie twojego podnośnika aby dowiedzieć sie na jakiej zasadzie odbywa się transmisja (co jest wysyłane a co odbierane)

gosc's picture

wykonałem ale nie chodzi

cześć wykonałem ten układ ale niestety nie chodzi na lcd miga kursor ale nie mam komunikacji z pc port mam sprawny bo zrobiłem zworkę pomiędzy rxd a txd co może być nie tak na płytce jak zewrze rx i tx przed max to tech widzę w terminalu co wysyłam a jak zewrze za maxem to już nic nie widzę

mirley's picture

Re: MAX

Sprawdź jakie napięcia panują na pinach 2 i 6 układu MAX232. Powinno byc około +8V i -8V, a nawet troszkę więcej (zależy od układu)

gosc's picture

max

na 2 pinie jest 9 v a na 6 -8,5 v

----

już hula miałem źle ustawiony ckdiv 8

Mirley: posty scaliłem proszę nie pisać kilku swoich wypowiedzi jedna pod drugą, zaloguj się aby uzyskać możliwość edycji wpisów

gosc's picture

LCD via RS-232

Witam ! Trudno znaleźć stronę na której opisane jest wszystko tak dokładnie - co z kolei pomaga zrozumieć i wiele się nauczyć (np.takim jak ja)początkującym GRATULUJĘ !!!!!!.
OD powstania powyższego projektu minęło już sporo czasu i nie wiem czy ktoś mi pomoże.Mam dwa pytania : w projekcie zastosowano ATTINY2313 a czy można zastosować AT89S2313( mam ich kilka w swoich zbiorach), oraz czy trudno byłoby wykonać komunikację dwukierunkową ( np. kilka przycisków na wolnych portach uP)

mirley's picture

Re: Wyświetlacz LCD na RS232

Chyba koledze chodzi o AT90S2313 a nie AT89.... ale tak czy innaczej nie mam na czym zrobić testów czy to będzie działać, więc mimo że ATTINY 2313 to nowsza wersja AT90S2313 nie jestem do końca pewien czy to zadziała. Polecam raczej kupic Tiny2313 a te starsze wykorzystać w innych układach.

Co do komunikacji dwustronnej to myślę że nie powinno być problemu. Specjalnie przewidziałem dodatkowy goldpin GP1 do tego celu (w opisie jest napisane). Należy tylko skonfigurować timer w układzie na przerwania co 4ms i za jego pomocą zająć się obsługą klawiatury. Prawdopodobnie polecenie input będzie trzeba zastąpić inkey() aby nie wstrzymywało programu w pętli głównej.

gosc's picture

Witam!!! Jak wysyłam jakieś

Witam!!!

Jak wysyłam jakieś dane przez terminal to jakieś dziwne znaki mi na wyświetlaczu wychodzą.
Korzystam z programu Terminal.
Jak dam 27 i send to nic się nie dzieje a powinno skasować wyświetlacz.
Co robie nie tak??

----

Mam pytanie, aby sterować drugim procesorem i aby wyświetlić (tak jak to jest standardowo w bascom np locate1,1) to trzeba dać printbin 161??

mirley's picture

Re: Wyświetlacz

locate 1,1 to binarnie 10100001 czyli 161, zgodnie z opisem wyżej. wysłanie za pomocą printbin 161 powinno dać efekt jaki oczekujesz. W basomie trzeba dać:

x = 161
printbin x

bezpośrednio printbin 161 może nie działać więc trzeba dać zmienną x typu byte

gosc's picture

Testowałem i normalnie działa

Testowałem i normalnie działa jak wpiszę bezpośrednio printbin xxx.

W twoim programie dodałem bufor, a w drugim procku przy częsty pisaniu na wyświetlaczu trzeba czasami dodać waitms.

Config Serialin = Buffered , Size = 20
Enable Interrupts

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