logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak działa 74HC595 w projekcie matrycy LED z attiny.com?

pawel129 05 Wrz 2005 21:29 6224 47
Najlepsze odpowiedzi

Jak w projekcie matrycy LED z 74HC595 działa przesyłanie danych i multipleksowanie wierszy?

74HC595 działa tu jako szeregowy rejestr przesuwny z zatrzaskiem: kolejne bity podajesz na DS, każdy impuls SH_CP przesuwa je o 1 bit w środku układu, a dopiero impuls ST_CP przepisuje cały załadowany bajt na wyjścia [#1797504][#1795577] W tym projekcie ładuje się 40 bitów odpowiadających jednemu wierszowi matrycy, potem na chwilę załącza ten wiersz, po czym ładuje się 40 bitów dla następnego wiersza i tak dalej — to właśnie daje multipleksowanie od wiersza do wiersza [#1794893] Nie trzeba cykać ST_CP po każdym bicie ani „wybierać” nim pojedynczego wyjścia; wystarczy załadować cały zestaw bitów i raz zaktualizować wyjścia [#1797504] Jeśli na wyświetlaczu pojawiają się „duszk i” albo świecą prawie wszystkie LED-y, to przy przełączaniu wierszy trzeba na chwilę wygasić wyjścia albo sterować linią /OE, bo inaczej stary stan wyjść nakłada się na nowy [#1851929][#1851981]
Wygenerowane przez model językowy.
REKLAMA
  • #1 1794336
    pawel129
    Poziom 16  
    Posty: 246
    Pomógł: 2
    Ocena: 4
    Jakiś czas temu znalazłem na forum link do ciekawego projektu: http://www.attiny.com/scroll5.htm dlatego napewno dużo osób go zna ;) Teraz jakoś natchnęło mnie aby go zrealizować.... tylko mam problem: siedze już pare godzin wpatrony na schemat oraz datasheety użytych scalaczków i wciąż nie mogę pojąć zasady działania tego projektu :? Niby jest opis ale jakoś go nie kumam.... A bardzo chciałbym go wykonać (a żeby to zrobić musze napisać program).

    W jaki sposób działa tutaj 74HC595 ? Jak wprowadzać dane na wyjścia PD0-PD5 aby to działało? Jak jest załatwione przemiatanie (z góry na dół czy z lewej do prawej czy wogóle na odwrót) ?

    Spróbuje mi to ktoś wyjaśnić.... ? Dzięki serdeczne.
  • REKLAMA
  • #2 1794539
    zorg
    Poziom 11  
    Posty: 6
    W tym przypadku dane (5 bajtów) poprzez rejestry przesówne przychodzą na kolumny natomiast omiatanie jest rzędami.Spróbuj poczytać manualki.A jeżeli chcesz to wyślę Ci na maila kod w bascomie pod mój projekt który przesówa tekst ale tylko na jednej matrycy.
    Moderowany przez Light-I:

    Załączniki usunięto, opisy układów są dostępne w sieci np. :
    http://www.semiconductors.philips.com/acrobat/datasheets/74HC_HCT595_4.pdf
    http://www.standardics.philips.com/products/hc/pdf/74hc259.pdf

  • #3 1794701
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    Całkiem prosto, to są rejestry przesuwne do których ładuje się informacje szeregowo a one zamieniają ją na dane równoległe. Do tego trzeba połączyć tą technike z wyświetlaniem multipleksowanym.
  • #4 1794734
    pawel129
    Poziom 16  
    Posty: 246
    Pomógł: 2
    Ocena: 4
    Ehh.. w sumie to tyle wiedziałem (jak nazwać te rzeczy po imieniu) ale chodzi mi o opis, zasade działania tego wyświetlacza. Na stronie jest po angielsku, ale jakoś niedokładnie (albo ja słaby jest z angielskiego) więc nie czaje w jaki sposób ładować dane aby je wyświetlać.
    Pozatym czy na tych wyświetlaczach nie wyświetla się to samo w tej samej chwili? Bo jakoś to mi przychodzi do głowy :?
  • Pomocny post
    #5 1794893
    Jarema
    Użytkownik obserwowany
    Posty: 1179
    Pomógł: 86
    Ocena: 32
    Witam,
    Układ jest bardzo prosty:
    Do rejestrów ładujesz szeregowo 40 bitów odpowiadające pierwszemu wierszowi.
    Następnie załączasz na chwilę sterowanie 1 wiersza.
    Po wyłączeniu 1 wiersza ładujesz następne 40 bitów odpowiadające drugiemu wierszowi i załaczasz jego sterowanie.
    Dalej ładujesz dane i załączasz sterowanie kolejnych wierszy.
    Po zakończeniu wyświetlania 7 wiersza cykl zaczyna się od początku.
    To czy matryce będą wyswietlały to samo czy też nie zależy tylko od danych jakie będziesz wprowadzał do rejestrów.
  • REKLAMA
  • #6 1795473
    pawel129
    Poziom 16  
    Posty: 246
    Pomógł: 2
    Ocena: 4
    dzięki Jarema, już dużo mi się wyjaśniło. Tylko jeszcze małe pytanko na jakiej zasadzie działa wejście ST_CP? Bo DS to wejście szeregowe danych, SH_CP zegar.... Ale jak się posługiwać ST_CP i do czego ono służy?

    W moim modelu zamierzam sterować zwykłymi LEDami 12mm .. czy trzeba dawać jeszcze tranzystory? Czy raczej się obędzie?
  • REKLAMA
  • Pomocny post
    #7 1795577
    warth
    Poziom 13  
    Posty: 50
    Pomógł: 5
    Ocena: 3
    ST_CP przepisuje dane z wewnętrznego rejestru do rejestru odpowiadającego za wyjścia (czyli jeśli jescze /OE jest aktywne (poziom niski) to na wyjściach pojawiają się dane)
  • REKLAMA
  • #8 1796093
    pawel129
    Poziom 16  
    Posty: 246
    Pomógł: 2
    Ocena: 4
    czyli po każdym bicie danych z DS musze dać tyle cykli ST_CP aby "wybrać sobie" wyjście na którym ten bit ma się pojawić ?
    Np: wysyłam bit na DS, pozniej 4 cykle ST_CP i na 4 wyjściu mam wprowadzony bit?
  • Pomocny post
    #9 1797504
    warth
    Poziom 13  
    Posty: 50
    Pomógł: 5
    Ocena: 3
    nie, nie musisz za każdym razem... możesz przesłać wszystko (wtedy w wewnętrznych rejestrach zostanie zapisana informacja) i wtedy raz sygnał na ST_CP i to zostaje przepisane na wyjścia...
    ST_CP - przepisuje na wyjścia
    SH_CP - przesuwa dane o jeden bit

    czyli (dla przykładu z jednym 74hc595 - czyli bez tych dalszych, ale to jest analogiczne, bo przy takim podłączeniu ostatni bit z poprzedniego 595 po sygnale zegara przepisywany jest jako pierwszy do następnego):
    ustawiasz sobie jakiś bit na wejście DS, "cykasz" zegarem (SH_CP), ustawiasz następny bit na DS i znowu SH_CP i tak osiem razy... i masz już cały bajt załadowany do 595 ale na wyjściach dalej nie masz nic i wtedy "cykasz" ST_CP i dane zostają przepisane na wyjścia (czyli wyświetlone - oczywiście przy założeniu że /OE na to zezwala)...

    w tamtym projekcie masz ST_CP połączone razem, dlatego możesz po prostu za pomocą DS i ST_SH przesłać wszystkie 40 bitów a potem raz tyknąć ST_CP i po kłopocie... chociaż możesz oczywiście też tykać ST_CP częściej - nic to nie przeszkadza. mam nadzieje że cosik wyjaśniłem. pozdrawiam
  • #10 1814665
    pawel129
    Poziom 16  
    Posty: 246
    Pomógł: 2
    Ocena: 4
    dzięki wielkie, o takie wyjaśnienie mi chodziło !

    teraz się zastanawiam jak tu łatwo zrobić tablicę znaków do takeigo cuda, aby gdy procek dostanie znak ASCII (np.z uartu) wyświetlił odpowiedni znak na wyświetlaczu..
  • #11 1814775
    Jarema
    Użytkownik obserwowany
    Posty: 1179
    Pomógł: 86
    Ocena: 32
    Tablicę znaków chyba najlepiej jest umieścić w pamięci EPROM, przynajmniej ja tak zrobiłem a na dodatek stworzyłem sobie arkusz który oblicza wartości poszczególnych bajtów jak również napisałem program (w QBasic'u :P) który dane z excela konwertuje na plik binarny potrzebny do zaprogramowania epromu :D.
  • #12 1816101
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Ja natomiast generatory znaków umieszczam w pamięci programu bo tam może ich być więcej. Do pisania i przenoszenia czcionek z Windowsa używam programu "Edytor Czcionek PXL". Kiedyś znalazłem to w sieci.
  • #13 1817050
    Jarema
    Użytkownik obserwowany
    Posty: 1179
    Pomógł: 86
    Ocena: 32
    GienekS napisał:
    [...] bo tam może ich być więcej. [...]

    Jeśli możesz to wytłumacz jakim sposobem wiecej czcionek wejdzie do pamięci 89C4051 niż do 27C512...
  • #14 1817818
    pawel129
    Poziom 16  
    Posty: 246
    Pomógł: 2
    Ocena: 4
    wykonałem układ, jako program testowy zrobiłem aby zapalały się co druga kolumna. Tylko dlaczego tak ciemno te diody świecą? Używam LEDów 12mm podpiętych tak samo jak na schemacie ze strony..
  • #15 1818518
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Zmniejsz wartość rezystancji ograniczających prąd LED. Jakie mają, te LED-y zastosowane przez ciebie, parametry (średni prąd świecenia) ?
  • #16 1818693
    pawel129
    Poziom 16  
    Posty: 246
    Pomógł: 2
    Ocena: 4
    dałem 100R/LEDa, prąd koło 20-25mA (standardowa dyfuzyjna led 12mm). Ale to chyba nie była wina diodek (znalazłem prawdopodobne źródło problemu). Jutro sprawdze układ i dam znać.
  • #17 1818694
    Jarema
    Użytkownik obserwowany
    Posty: 1179
    Pomógł: 86
    Ocena: 32
    :arrow: Light-I
    Problem był związany z polaryzacją diod w matrycach w źródłowym projekcie i w układzie który wykonał Pawel129 (były odwrotne).
  • #18 1818920
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Jarema napisał:
    GienekS napisał:
    [...] bo tam może ich być więcej. [...]

    Jeśli możesz to wytłumacz jakim sposobem więcej czcionek wejdzie do pamięci 89C4051 niż do 27C512...
    Ja miałem na myśli procesory AVR (ATmega32 i większy) albo 89C51. A z innej beczki, jak podłączyłeś do 89C4051 27C512 ?
  • #19 1819539
    Jarema
    Użytkownik obserwowany
    Posty: 1179
    Pomógł: 86
    Ocena: 32
    Witam,
    Aby połączyć ze sobą AT89C4051 (PIC16F628A) i 27C512 nie trzeba być filozofem.
    Linie adresowe pamięci albo pod licznik rewersyjny albo rejestr przesuwający
    bądź też bufor typu Latch a linie danych przez 74165.
  • #20 1820096
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    To pobranie jednego znaku z tak podpiętym GZ będzie trwało wieczność a znak załóżmy trzeba jeszcze w między czasie skrolować, procek będzie jeszcze musiał obskoczyć parę przerwań. To ten biedny Atmelek musiał by chodzić kilkanaście razy szybciej żeby to wszystko przyjęło realne szybkości.
  • #21 1820102
    Jarema
    Użytkownik obserwowany
    Posty: 1179
    Pomógł: 86
    Ocena: 32
    Dlatego również szybkość atmelków była głównym powodem który spowodował, że przesiadłem sie na PIC'e :D i układ o którym pisałem wcześniej działa bez jakichkolwiek zastrzeżeń..
  • #22 1840661
    pawel129
    Poziom 16  
    Posty: 246
    Pomógł: 2
    Ocena: 4
    Napisałem program testowy, który zapala napierw parzyste kolumny, a chwilę pózniej gasi i zapala parzyste (czyli wpisuje do rejestrów 010101... a później 101010101) i tak na zmiane bez końca. Program działa i wygłada tak:
    
    $mod51
    
    A0 EQU P1.0
    A1 EQU P1.1
    A2 EQU P1.2
    SHCP EQU P1.3
    STCP EQU P1.4
    DANE EQU P1.5
    
    	LJMP START
    	ORG 10H
    
    START:
    	CLR SHCP
    	CLR STCP
    	MOV R2,#00h
    	
    PETLA1:
    	SETB DANE
    	ACALL POTRAKTUJ_SHCP
    	CLR DANE
    	ACALL POTRAKTUJ_SHCP
    	INC R2
    	CJNE R2,#28H,PETLA1
    	
    	ACALL POTRAKTUJ_STCP
    	MOV R2,#00h
    	ACALL PRZEMIATANIE
    	ACALL DELAY_50MS
    		
    PETLA2:
    	CLR DANE
    	ACALL POTRAKTUJ_SHCP
    	SETB DANE
    	ACALL POTRAKTUJ_SHCP
    	INC R2
    	CJNE R2,#28H,PETLA2
    	
    	ACALL POTRAKTUJ_STCP
    	MOV R2,#00h
    	ACALL PRZEMIATANIE
    
    	ACALL DELAY_50MS
    	
    
    SJMP PETLA1
    
    DELAY_50MS:
           	MOV TMOD,#01H
           	MOV TH0,#61
           	MOV TL0,#0
    	SETB TR0
    
    TIME_N50:
    	JNB TF0,$
    
    	MOV TH0,#61
    	CLR TF0
         	DJNZ ACC,TIME_N50
    	RET
    
    PRZEMIATANIE:
    	ACALL WIERSZ1	
    	ACALL WIERSZ2
    	ACALL WIERSZ3
    	ACALL WIERSZ4
    	ACALL WIERSZ5
    	ACALL WIERSZ6
    	ACALL WIERSZ7
    	INC R2
    	CJNE R2,#1EH,PRZEMIATANIE
    	MOV R2,#00h
    	RET
    
    
    POTRAKTUJ_SHCP:
    	SETB SHCP
    	NOP
    	CLR SHCP
    	NOP
    	RET
    
    POTRAKTUJ_STCP:
    	SETB STCP
    	NOP
    	CLR STCP
    	NOP
    	RET
    
    
    ;tablica kodów BCD na numer wiersza (demultiplexowanie)
    
    WIERSZ1:
    	CLR A0
    	NOP
    	NOP
    	CLR A1
    	NOP
    	NOP
    	CLR A2
    	NOP
    	NOP
    	RET
    
    WIERSZ2:
    	SETB A0
    	NOP
    	NOP
    	CLR A1
    	NOP
    	NOP
    	CLR A2
    	NOP
    	NOP
    	RET
    
    WIERSZ3:
    	CLR A0
    	NOP
    	NOP
    	SETB A1
    	NOP
    	NOP
    	CLR A2
    	NOP
    	NOP
    	RET
    
    WIERSZ4:
    	SETB A0
    	NOP
    	NOP
    	SETB A1
    	NOP
    	NOP
    	CLR A2
    	NOP
    	NOP
    	RET
    
    WIERSZ5:
    	CLR A0
    	NOP
    	NOP
    	CLR A1
    	NOP
    	NOP
    	SETB A2
    	NOP
    	NOP
    	RET
    
    WIERSZ6:
    	SETB A0
    	NOP
    	NOP
    	CLR A1
    	NOP
    	NOP
    	SETB A2
    	NOP
    	NOP
    	RET
    
    WIERSZ7:
    	CLR A0
    	NOP
    	NOP
    	SETB A1
    	NOP
    	NOP
    	SETB A2
    	NOP
    	NOP
    	RET
    
    END

    Teraz chciałem coś konkretnego wyświetlić, mianowicie 0123456789ABCDEF. Napisałem taki programik (poniżej) ale on nie działa :/ Zasada jest taka: wpisuje do 16 kolejnych komórek pamięci kody znaków ASCII (adresowanie przez R0, ASCI dlatego gdyż później będzie komunikacja z klawiaturą PC). W programie jest tabela kodowa znaków, która różni się od tej ASCII gdyż nie ma wszystkich znaków aby zaoszczędzić na pamięci.
    Po odebraniu 16 znaków (w tym przykładzie po wpisaniu ich na początku programu do RAMU) program dekoduje je na adresy znaków we własnej tabeli. Po czym trafia na pętle linii 1. Wysyła pierwszy bajt znaku (tylko 5 bitów) na linię DANE (nóżka Ds układu 595). I tak po każdym pierwszym bajcie (w zasadzie 5 bitach z pierwszych bajtów) każdego z 16 znaków. Po każdym bicie oczywiście zegar SHCP. Po nadaniu ciągu 40 bitów odpalam raz STCP.Pętla wykonuje się 32 razy aby nie LEDy nie migały. Analogicznie z drugą linią, trzecią itd... tylko że tutaj oczywiście biorę 5 bitów z 2, 3... bajta znaku z tablicy umieszczonej w DPTR. Po zakończeniu pętli linii 7 program wraca do linii 1 i robi wszystrko od początku.
    Teoretycznie powinno działać, ale po odpaleniu ciągle mam matrix :( Wyśweitlacz albo "pływa", albo palą się prawie wszystkie LEDy bez przesuwania... Nie wiem dlaczego :( Zapewnie jakiś błąd w programie, może nie zrozumiałem zasady działania 595? Ja już nie mam sił :( Może komuś uda się rozwiązać problem...
    
    $mod51
    
    A0 EQU P1.0
    A1 EQU P1.1
    A2 EQU P1.2
    SHCP EQU P1.3
    STCP EQU P1.4
    DANE EQU P1.5
    
    ZNAK EQU 30H	;początek bufora na znaki do wyświetlania
    
    	LJMP START
    	ORG 100H
    
    START:
    	CLR SHCP
    	CLR STCP
    	MOV DPTR,#TABLICA_ASCII	;ładuj tablice ASCII do DPTR
    	MOV R0,#ZNAK	;adresowanie rejestrowe buforu znaków
    
    	
    	MOV A,#31H	;zapisuje ciąg znaków 1234567890ABCDEF
    	ACALL WPISZ_DO_R0 ;do kolejnych komórek pamięci spod adresu R0
    	MOV A,#32H
    	ACALL WPISZ_DO_R0
    	MOV A,#33H
    	ACALL WPISZ_DO_R0
    	MOV A,#34H
    	ACALL WPISZ_DO_R0
    	MOV A,#35H
    	ACALL WPISZ_DO_R0
    	MOV A,#36H
    	ACALL WPISZ_DO_R0
    	MOV A,#37H
    	ACALL WPISZ_DO_R0
    	MOV A,#38H
    	ACALL WPISZ_DO_R0
    	MOV A,#39H
    	ACALL WPISZ_DO_R0
    	MOV A,#30H
    	ACALL WPISZ_DO_R0
    	MOV A,#41H
    	ACALL WPISZ_DO_R0
    	MOV A,#42H
    	ACALL WPISZ_DO_R0
    	MOV A,#43H
    	ACALL WPISZ_DO_R0
    	MOV A,#44H
    	ACALL WPISZ_DO_R0
    	MOV A,#45H
    	ACALL WPISZ_DO_R0
    	MOV A,#46H
    	ACALL WPISZ_DO_R0
    
    	MOV R4,#1EH
    	
    LINIA_1:			;przemiatanie wiersza 1
    	MOV R0,#3FH		;ustaw R0 od 16stego znaku
    	MOV R3,#00H		;który wiersz zacząć
    	ACALL WYSWIETLANIE	;pobierz 5 bitów znaku
    	
    	ACALL POTRAKTUJ_STCP
    	ACALL WIERSZ1		;zapal wiersz 1
    	DJNZ R4,LINIA_1
    	MOV R4,#1EH
    
    LINIA_2:			;przemiatanie wiersza 2
    	MOV R0,#3FH		;ustaw R0 od 16stego znaku
    	MOV R3,#01H		;który wiersz zacząć
    	ACALL WYSWIETLANIE	;pobierz 5 bitów znaku
    	
    	ACALL POTRAKTUJ_STCP
    	ACALL WIERSZ2		;zapal wiersz 2
    	DJNZ R4,LINIA_2
    	MOV R4,#1EH
    
    LINIA_3:			;przemiatanie wiersza 3
    	MOV R0,#3FH		;ustaw R0 od 16stego znaku
    	MOV R3,#02H		;który wiersz zacząć
    	ACALL WYSWIETLANIE	;pobierz 5 bitów znaku
    	
    	ACALL POTRAKTUJ_STCP
    	ACALL WIERSZ3		;zapal wiersz 3
    	DJNZ R4,LINIA_3
    	MOV R4,#1EH
    
    LINIA_4:			;przemiatanie wiersza 4
    	MOV R0,#3FH		;ustaw R0 od 16stego znaku
    	MOV R3,#03H		;który wiersz zacząć
    	ACALL WYSWIETLANIE	;pobierz 5 bitów znaku
    	
    	ACALL POTRAKTUJ_STCP
    	ACALL WIERSZ4		;zapal wiersz 4
    	DJNZ R4,LINIA_4
    	MOV R4,#1EH
    
    LINIA_5:			;przemiatanie wiersza 5
    	MOV R0,#3FH		;ustaw R0 od 16stego znaku
    	MOV R3,#04H		;który wiersz zacząć
    	ACALL WYSWIETLANIE	;pobierz 5 bitów znaku
    	
    	ACALL POTRAKTUJ_STCP
    	ACALL WIERSZ5		;zapal wiersz 5
    	DJNZ R4,LINIA_5
    	MOV R4,#1EH
    
    LINIA_6:			;przemiatanie wiersza 6
    	MOV R0,#3FH		;ustaw R0 od 16stego znaku
    	MOV R3,#05H		;który wiersz zacząć
    	ACALL WYSWIETLANIE	;pobierz 5 bitów znaku
    	
    	ACALL POTRAKTUJ_STCP
    	ACALL WIERSZ6		;zapal wiersz 6
    	DJNZ R4,LINIA_6
    	MOV R4,#1EH
    
    LINIA_7:			;przemiatanie wiersza 7
    	MOV R0,#3FH		;ustaw R0 od 16stego znaku
    	MOV R3,#06H		;który wiersz zacząć
    	ACALL WYSWIETLANIE	;pobierz 5 bitów znaku
    	
    	ACALL POTRAKTUJ_STCP
    	ACALL WIERSZ7		;zapal wiersz 7
    	DJNZ R4,LINIA_7
    	MOV R4,#1EH
    
    	LJMP LINIA_1
    
    WYSWIETLANIE:	
    	LCALL PRZEKODOWANIE 	;pobierz znak z pamięci (czyta od ostatniej komórki w dół)
    	ADD A,R3		;które bity pobrać
    	MOVC A,@A+DPTR		;pobranie bajta
    	MOV R2,#05H 
    	ACALL W_PRAWO_PRZEZ_C
    	DEC R0
    	CJNE R0,#30H,WYSWIETLANIE
    	RET
    
    W_PRAWO_PRZEZ_C:
    	RRC A		;kopiuj po 1 bicie i wysyłaj
    	MOV DANE,C	;do zatrzasków rejestrów.
    	ACALL POTRAKTUJ_SHCP
    	DJNZ R2,W_PRAWO_PRZEZ_C
    	RET
    
    POTRAKTUJ_SHCP:
    	CLR SHCP
    	NOP
    	SETB SHCP
    	NOP
    	CLR SHCP
    	RET
    
    POTRAKTUJ_STCP:
    	SETB STCP
    	NOP
    	CLR STCP
    	NOP
    	RET
    
    ;tablica kodów BCD na numer wiersza (demultiplexowanie)
    
    WIERSZ1:
    	CLR A0
    	NOP
    	CLR A1
    	NOP
    	CLR A2
    	RET
    
    WIERSZ2:
    	SETB A0
    	NOP
    	CLR A1
    	NOP
    	CLR A2
    	RET
    
    WIERSZ3:
    	CLR A0
    	NOP
    	SETB A1
    	NOP
    	CLR A2
    	RET
    
    WIERSZ4:
    	SETB A0
    	NOP
    	SETB A1
    	NOP
    	CLR A2
    	RET
    
    WIERSZ5:
    	CLR A0
    	NOP
    	CLR A1
    	NOP
    	SETB A2
    	RET
    
    WIERSZ6:
    	SETB A0
    	NOP
    	CLR A1
    	NOP
    	SETB A2
    	RET
    
    WIERSZ7:
    	CLR A0
    	NOP
    	SETB A1
    	NOP
    	SETB A2
    	RET
    
    WPISZ_DO_R0:
    	MOV @R0,A
    	INC R0
    	RET
    
    PRZEKODOWANIE:		;przekodowuje znak ASCII na odpowiednią wartość hex
    			;dzięki temu program wie, który znak ma pobierać
    	MOV A,@R0
    	
    ZNAK_0:
    	CJNE A,#30H,ZNAK_1
    	MOV A,#01H
    	RET
    ZNAK_1:
    	CJNE A,#31H,ZNAK_2
    	MOV A,#09H
    	RET
    
    ZNAK_2:
    	CJNE A,#32H,ZNAK_3
    	MOV A,#11H
    	RET
    
    ZNAK_3:
    	CJNE A,#33H,ZNAK_4
    	MOV A,#19H
    	RET
    
    ZNAK_4:
    	CJNE A,#34H,ZNAK_5
    	MOV A,#21H
    	RET
    
    ZNAK_5:
    	CJNE A,#35H,ZNAK_6
    	MOV A,#29H
    	RET
    
    ZNAK_6:
    	CJNE A,#36H,ZNAK_7
    	MOV A,#31H
    	RET
    
    ZNAK_7:
    	CJNE A,#37H,ZNAK_8
    	MOV A,#39H
    	RET
    
    ZNAK_8:
    	CJNE A,#38H,ZNAK_9
    	MOV A,#41H
    	RET
    
    ZNAK_9:
    	CJNE A,#39H,ZNAK_A
    	MOV A,#49H
    	RET
    
    ZNAK_A:
    	CJNE A,#41H,ZNAK_B
    	MOV A,#51H
    	RET
    
    ZNAK_B:
    	CJNE A,#42H,ZNAK_C
    	MOV A,#59H
    	RET
    
    ZNAK_C:
    	CJNE A,#43H,ZNAK_D
    	MOV A,#61H
    	RET
    
    ZNAK_D:
    	CJNE A,#44H,ZNAK_E
    	MOV A,#69H
    	RET
    
    ZNAK_E:
    	CJNE A,#45H,ZNAK_F
    	MOV A,#71H
    	RET
    
    ZNAK_F:
    	CJNE A,#46H,ZADEN_ZNAK
    	MOV A,#79H
    	RET
    
    ZADEN_ZNAK:
    	CLR A
    	RET
    
    TABLICA_ASCII:		;tablica znaków ASCII
    
    	DB 11110001B
    	DB 11101110B
    	DB 11101100B
    	DB 11101010B
    	DB 11100110B
    	DB 11101110B
    	DB 11110001B
    	DB 11111111B
    
    	DB 11110111B
    	DB 11100111B
    	DB 11110111B
    	DB 11110111B
    	DB 11110111B
    	DB 11110111B
    	DB 11100011B
    	DB 11111111B
    
    	DB 11110001B
    	DB 11101110B
    	DB 11111110B
    	DB 11111101B
    	DB 11111011B
    	DB 11110111B
    	DB 11100000B
    	DB 11111111B
    
    	DB 11100000B
    	DB 11111101B
    	DB 11111011B
    	DB 11111101B
    	DB 11111110B
    	DB 11101110B
    	DB 11110001B
    	DB 11111111B
    
    	DB 11111101B
    	DB 11111001B
    	DB 11110101B
    	DB 11101101B
    	DB 11100000B
    	DB 11111101B
    	DB 11111101B
    	DB 11111111B
    
    	DB 11100000B
    	DB 11101111B
    	DB 11100001B
    	DB 11111110B
    	DB 11111110B
    	DB 11101110B
    	DB 11110001B
    	DB 11111111B
    
    	DB 11111001B
    	DB 11110111B
    	DB 11101111B
    	DB 11100001B
    	DB 11101110B
    	DB 11101110B
    	DB 11110001B
    	DB 11111111B
    
    	DB 11100000B
    	DB 11111110B
    	DB 11111101B
    	DB 11111011B
    	DB 11110111B
    	DB 11110111B
    	DB 11110111B
    	DB 11111111B
    
    	DB 11110001B
    	DB 11101110B
    	DB 11101110B
    	DB 11110001B
    	DB 11101110B
    	DB 11101110B
    	DB 11110001B
    	DB 11111111B
    
    	DB 11110001B
    	DB 11101110B
    	DB 11101110B
    	DB 11110000B
    	DB 11111110B
    	DB 11111101B
    	DB 11110011B
    	DB 11111111B
    
    	DB 11110001B
    	DB 11101110B
    	DB 11101110B
    	DB 11101110B
    	DB 11100000B
    	DB 11101110B
    	DB 11101110B
    	DB 11111111B
    
    	DB 11100001B
    	DB 11101110B
    	DB 11101110B
    	DB 11100001B
    	DB 11101110B
    	DB 11101110B
    	DB 11100001B
    	DB 11111111B
    
    	DB 11110001B
    	DB 11101110B
    	DB 11101111B
    	DB 11101111B
    	DB 11101111B
    	DB 11101110B
    	DB 11110001B
    	DB 11111111B
    
    	DB 11100011B
    	DB 11101101B
    	DB 11101110B
    	DB 11101110B
    	DB 11101110B
    	DB 11101101B
    	DB 11100011B
    	DB 11111111B
    
    	DB 11100000B
    	DB 11101111B
    	DB 11101111B
    	DB 11100001B
    	DB 11101111B
    	DB 11101111B
    	DB 11100000B
    	DB 11111111B
    
    	DB 11100000B
    	DB 11101111B
    	DB 11101111B
    	DB 11100001B
    	DB 11101111B
    	DB 11101111B
    	DB 11101111B
    	DB 11111111B
    END


    Dodano po 34 [minuty]:

    Fajfer2 napisał:
    Może być to spowodowane użyciem stałej o nazwie A0 , A1 etc. ?
    Może w ten sposób kompilator "myli" stałą nadaną przez użytkownika
    z wartością liczbową hex , albo z którymś z adresów rejestrów ?

    nie sądzę żeby to było to. Po kompilacji kompilator nie wywala błędów, pozatym jeśli to by była tego wina, sądzę że nic by się nie paliło... Szczególnie że przypisałem odpowiednie etykiety na początku programu.
    Fajfer2 napisał:
    A nie lepiej by było coś w tym stylu:
    ; w A wartość do wyświetlenia
    MOV DPTR,#TABLICA_ASCII
    MOVC A,@A+DPTR
    ;teraz w A jest wartość odczytana z tablicy

    no właśnie tak jest zrobione: program pobiera adres rejestru w DPTR odpowieniego znaku z własnej tablicy znaku (np. dla cyfry 2 jest to 11h) i do tego dodaje liczbe zapisaną w R3 aby program domyślił się że np chodzi o obsługe wiersza 3go (więc ADD A,R3 dla cyfry 2 po tej linicje w akumulatorze jest 13h -> program pobiera trzeci bajt z tablicy znaków który "buduje" cyfre 2). Mając ten bajt w A, program wysyła 5 ostatnich bitów poprzez
    RRC A
    MOV DANE,C
    ale na wyśweitlaczu matrix :( może powinienem sterować OE i MR ? Ale one są połaczone jak na schemacie więc chyba dobrze:(

    Dodano po 2 [minuty]:

    hmm...zniknął post kolegi Fajfer2...
  • #23 1840831
    Fajfer2
    Poziom 20  
    Posty: 507
    Pomógł: 18
    Ocena: 14
    No właśnie się "skapowałem" i czym prędzej go usunąłem
  • #24 1840855
    Jarema
    Użytkownik obserwowany
    Posty: 1179
    Pomógł: 86
    Ocena: 32
    A można wiedzieć dlaczego na każdy znak masz zarezerwowane 8 bajtów (5 bitowych) a nie 7 ?
    Podejrzewam, że wlasnie wysyłanie tego 8 bajtu powoduje kaszanę.
  • #25 1841066
    pawel129
    Poziom 16  
    Posty: 246
    Pomógł: 2
    Ocena: 4
    teoretycznie można to zrobić na 7 bajtach ;) ale mam już takie przyzwyczajenie jeśli chodzi o DPTR z ładowania własnych znaków do CGRAM wyświetlaczy LCD...ale do rzeczy: w programie jest wszystko tak policzone że znak zajmuje 8x8bitów więc nie powinno tro sprawiać różnicy...
  • #26 1851558
    pawel129
    Poziom 16  
    Posty: 246
    Pomógł: 2
    Ocena: 4
    eh, widze że temat nie cieszy się zainteresowaniem:(
    W między czasie znalazłem pare błędzików,ale one nie były bardzo istotne.
    Czy może ktoś mi wyjaśnić dokładniej jak działa 74hc259? Wiem że to może strasznie laickie pytanie, ale może tutaj tkwi problem? Bo jak zauważyłem, zapalają mi sięcałe kolumny zamiast pojedyńczych punktów w tych kolumnach :( Czy potrzeba sterować oddzielnie MR i LE ? Bo jak mam wszystko podłaczone tak jak na schemacie to właśnie taki jest problem:( Podaje funkcje na A0 A1 i A2 tak jak w tabeli i lipa... W moim układzie zamiast ULN2003 jest 7x TIP31
    Proszę o pomoc..
  • #27 1851734
    Fajfer2
    Poziom 20  
    Posty: 507
    Pomógł: 18
    Ocena: 14
    Wprawdzie niedokładnie pooglądałem ten projekt, ale czy
    przed "wyrzuceniem" na wyświetlacz nie powinien (ten wyświetlacz)
    być wygaszony ? (przy wpisie do rejestrów)
    Napisz jaki rejestr użyłeś w tym projekcie.
    Nie prościej było by użyć "zwykłego"
    rejestru przesuwnego z wyjściem równoległym.
    Jak by był osobny pin na przepisanie do wyjścia równoległego
    to cool. (pomijam tu wydajność prądową)
  • #29 1851889
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Ejże , czy jesteś tego pewien :?:
    A co sie stanie przy ustawianiu wszystkih lini adresowych na "1" :?:
    Jedynie wyjście Q7 (nie używane)będzie w satanie wysokim , a reszta (Q1-Q6) w stanie niskim.

    Przypatrz się jeszcze raz :D

    Piotrek
  • #30 1851929
    yego666
    Poziom 33  
    Posty: 2175
    Pomógł: 239
    Ocena: 564
    Faktycznie w ukladzie takim jak jest na schemacie, niestety "duszki" beda lataly przy przelaczaniu kolejnych rzadkow wyswietlacza. Nie da sie tego uniknacw prosty sposob, chyba ze przed zmiana rzedu wpisze sie do rejestrow 595 wartosci wygaszajace wszystkie diody, a po przelaczeniu rzadka zaladowac wlasciwa tresc do wyjsc rejestrow 595. Niestety bedzie to kosztowac sporo dodatkowego czasu procesora :( .
    Zamiast tego gdyby troszke zmodyfikowac schemat tak by procesor mogl sterowac liniami !OE ukladow 595 moznaby na chwile wygasic wyjscia, zmienic rzad i podac nowa tresc. Tym razem kosztowaloby to tylko kilka dodatkowych instrukcji procesora i "duszki" mamy z glowy. Nie wiem czy procek, ktory tam zastosowano ma dosc linii by to uskutecznic, ale jesli nie , to zawsze mozna dac inny procek.
    Pozdrawiam, yego


    Cholender, Zumek , masz absolutna racje. Tak bedzie najprosciej i bez przerobek. Nie zwrocilem uwagi, ze jest tylko 7 rzadkow.
    Brawo za bystrosc :)

Podsumowanie tematu

✨ Projekt matrycy LED z wykorzystaniem układu 74HC595 opiera się na przesyłaniu danych szeregowo do rejestrów przesuwających, które następnie zamieniają je na dane równoległe sterujące kolumnami matrycy. Omiatanie odbywa się rzędami – kolejno ładowane są 40-bitowe dane dla każdego wiersza, które po załączeniu odpowiedniej linii sterującej (wiersza) wyświetlają obraz. Wejście ST_CP (latch) służy do przepisania danych z wewnętrznego rejestru przesuwnego na wyjścia równoległe, co umożliwia jednoczesne wyświetlenie całego wiersza po przesłaniu wszystkich bitów. Wejście SH_CP to zegar przesuwający dane o jeden bit, a DS to wejście szeregowe danych. W projekcie stosuje się multipleksowanie, aby wyświetlać kolejne wiersze w szybkim cyklu, co daje wrażenie ciągłego obrazu.

Problemy praktyczne dotyczyły sterowania tranzystorami w układzie, zwłaszcza zastąpienia ULN2003A tranzystorami PNP, które negowały sygnał i powodowały świecenie wszystkich diod jednocześnie. Zalecane jest stosowanie tranzystorów PNP (np. BC557, BC327, BD140) z odpowiednimi rezystorami bazowymi (ok. 1kΩ w szereg z bazą i 22kΩ między bazą a emiterem) oraz poprawne podłączenie emiterów do +5V i kolektorów do wierszy matrycy. Sterowanie kolumnami odbywa się sygnałem "1", a wierszami sygnałem "0" (lub odwrotnie, w zależności od polaryzacji LED). W projekcie ważne jest wygaszanie matrycy podczas przełączania wierszy, co można osiągnąć przez chwilowe wyłączenie wyjść 74HC595 lub zastosowanie dodatkowego sterowania linią /OE.

Dodatkowo poruszono kwestie implementacji tablic znaków ASCII w pamięci EPROM lub pamięci programu mikrokontrolera, co ułatwia wyświetlanie tekstu na matrycy. Wskazano także na konieczność odpowiedniego doboru rezystorów ograniczających prąd LED (około 33Ω) oraz na poprawne polaryzowanie diod w matrycy, gdyż błędne podłączenie powodowało słabe świecenie lub świecenie wszystkich diod jednocześnie.

Podsumowując, 74HC595 pełni rolę rejestru przesuwnego z latch, umożliwiając sterowanie kolumnami matrycy LED, a układ 74HC259 (lub tranzystory PNP) steruje wierszami. Poprawne sterowanie sygnałami zegarowymi i latch oraz odpowiednia konfiguracja tranzystorów i rezystorów są kluczowe dla prawidłowego działania wyświetlacza.
Wygenerowane przez model językowy.
REKLAMA