Robię krok dalej i chciałem użyć układu 74HC595N, Cel : Obsługa matrycy 8x8. Spotkałem się z algorytmem :
Od i=1 do i=8 {
1* na nóżkę 'data' podaj bit i;
2* ustaw pin11 HIGH; }
3* ustaw pin12 HIGH;
tym sposobem wyjścia układu 74HC595N przyjmą stan bitów jak ustawiono od 1 do 8. (nie podoba mi się w zasadzie to, że pinem "pin11" clock, trzebaby chyba mrygać,a tu tego nie ma ?) Czy to zadziała, jeśli nie, to jak zrobić, żeby zadziałało? Jak połączyć kilka układów 74HC595N ?
Dzięki.
Didn't find your answer? Ask the community — no account required.
W
Waldemar Krzok
Jan Górski | gdL schrieb:
używałem 595 do wysterowania matrycy 2x(5x5-1), ale w sumie to samo co ty chcesz. Do tego cemu miałem ATTiny12 i 6x74HC595. Połączone "szeregowo", znaczy Q7' jednego idzie na DS następnego. MR, SH_CP i ST_CP równolegle do wsiech. Teraz trochę pływam, bo było to testowanie 3 lata temu i dokumentacja do dupy. Ale jak patrzę na kod, to mrygam SH_CP I ST_CP jednocześnie, do pierwszego DSa daję wartości z LUTa (toto miało generować "wzorki" na dwóch płytkach 5x5 LEDów bez środkowej diody). Robię to pisząc 6 lub 7 na port (110 by diodę zaświecić, 111 by zgasić). Cóś takiego na przykład:
SET_ALL: ldi i,49 SET_LOOP: ldi temp,0 out PORTB,temp ldi temp,6 out PORTB,temp dec i brne SET_LOOP ret
zapala wsie diody. Bit 0 to DS, 1 to SH, 2 to ST. Zmienne i i temp to rejestry. Do zgaszenia wsiech diod ładujesz 1 a potem 7. Diody połączone od Q0-Q7 do plusa.
Zrobiłem to tak, bo chciałem w wersji końcowej rozdzielić takty, by diody mi po drodze nie mrugały, ale wersji końcowej szef nie chciał, więc jest jak jest. Aha, reset olałem (do + na fest) i startuję program wywołując kasowanie wsiego.
; ============== long delay routine ===================== DELAY: ldi delay3,DELAY_COUNT DELAY_X: dec delay1 brne DELAY_X dec delay2 brne DELAY_X dec delay3 brne DELAY_X ret
; ============== short delay routine =====================
DELAY_S: ldi delay3,DELAY_COUNT DELAY_SX: dec delay1 brne DELAY_SX dec delay3 brne DELAY_SX ret
; =============== clear all routine ==================
CLEAR_ALL: ldi i,49 CLEAR_LOOP: ; clear all ldi temp,1 out PORTB,temp ldi temp,7 out PORTB,temp dec i brne CLEAR_LOOP ret
; =============== set all routine =========================
SET_ALL: ldi i,49 SET_LOOP: ldi temp,0 out PORTB,temp ldi temp,6 out PORTB,temp dec i brne SET_LOOP ret
; =============== set one routine =========================
SET_ONE: mov i,cnt rcall CLEAR_LOOP
ldi temp,0 out PORTB,temp ldi temp,6 out PORTB,temp
ldi i,SEQ_LENGTH_ETD sub i,cnt rcall CLEAR_LOOP
ret
; =============== clear one routine =========================
CLEAR_ONE: mov i,cnt rcall SET_LOOP
ldi temp,1 out PORTB,temp ldi temp,7 out PORTB,temp