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 ?
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
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.