Witam!
Dostałem za zadanie wrzucenia na cztery multipleksowane wyświetlacze siedmiosegmentowe napisu "8051". Niestety prowadzący cały czas nie chce zaliczyć laborki z powodu tego, że według niego wyświetlacze powinny się palić mocniej (po odpaleniu mojego programu wyświetlacze nie palą się tak mocno, jak reszta diod, co jest chyba logiczne z uwagi na multipleksację). Według moich spostrzeżeń, efekt ten można trochę zminimalizować przez odpowiednie dobranie opóźnienia, ale zmęczony ciągłym przestawianiem wartości dopisałem kod tak, aby regulacja odbywała się przez dwa przyciski. Niestety po nastawieniu najlepszego opóźnienia prowadzącemu i tak nie podoba się sposób świecenia wyświetlaczy. Poniżej zamieszczam program, który napisałem. Znacie jakieś sposoby rozwiązania tego zadania? Myślałem trochę o operacjach logicznych żeby nie zmieniać wszystkich wartości, ale i tak zmieniona część powinna palić się słabiej.
Z góry dzięki za wszelką pomoc.
Dostałem za zadanie wrzucenia na cztery multipleksowane wyświetlacze siedmiosegmentowe napisu "8051". Niestety prowadzący cały czas nie chce zaliczyć laborki z powodu tego, że według niego wyświetlacze powinny się palić mocniej (po odpaleniu mojego programu wyświetlacze nie palą się tak mocno, jak reszta diod, co jest chyba logiczne z uwagi na multipleksację). Według moich spostrzeżeń, efekt ten można trochę zminimalizować przez odpowiednie dobranie opóźnienia, ale zmęczony ciągłym przestawianiem wartości dopisałem kod tak, aby regulacja odbywała się przez dwa przyciski. Niestety po nastawieniu najlepszego opóźnienia prowadzącemu i tak nie podoba się sposób świecenia wyświetlaczy. Poniżej zamieszczam program, który napisałem. Znacie jakieś sposoby rozwiązania tego zadania? Myślałem trochę o operacjach logicznych żeby nie zmieniać wszystkich wartości, ale i tak zmieniona część powinna palić się słabiej.
Z góry dzięki za wszelką pomoc.
;odpowiednie rozkazy
$MOD517
;tutaj umieszczam program
ORG 1000H
SJMP START
ORG 1003H
SJMP INTO
ORG 1013H
SJMP INTI
;zaczynamy
START:
;włączenie przerwań
SETB EAL
;włączenie przerwania INT0
SETB EX0
;włączenie przerwania INT1
SETB EX1
;pętla, która będzie wykonywana:
LOOP:
;wybieram pierwszy wyświetlacz:
CLR P4.0
;wrzucam do niego wartość:
MOV P1, #01111111B
;małe opóźnienie:
ACALL DELAY
;wyłączam wyświetlacz:
SETB P4.0
;to samo z drugim i tak dalej:
CLR P4.1
MOV P1, #00111111B
ACALL DELAY
SETB P4.1
CLR P4.2
MOV P1, #01101101B
ACALL DELAY
SETB P4.2
CLR P4.3
MOV P1, #00000110B
ACALL DELAY
SETB P4.3
SJMP LOOP
;;;;;;;;;;;OBSŁUGA IRQ INT0;;;;;;;;;;;;
INTO:
;eliminacja efektu drgania styków:
CLR EX0
LCALL DEL2
SETB EX0
;zwiększ akumulator, w którym trzymana jest wartość
;od której ma zliczać opóźnienie
INC A
RETI
;;;;;;;;;;;OBSŁUGA IRQ INT1;;;;;;;;;;;;
INTI:
;jak wyżej, tylko zmniejszamy akumulator
CLR EX1
LCALL DEL2
SETB EX1
DEC A
RETI
;;;;;;;;;;;;;;;OPÓŹNIENIE;;;;;;;;;;;;;;
DELAY:
;opóźnienie A*255
;wrzucamy ustawioną wartość do R7
MOV R7, A
DEL:
DJNZ R6, $
DJNZ R7, DEL
RET
;;;;;;;;;;;;;;;OPÓŹNIENIE;;;;;;;;;;;;;;
;tylko użyte do eliminacji efektu drgania styków
;nie wpływa raczej na działanie wyświetlania
DEL2:
DJNZ R4, $
DJNZ R5, DEL2
RET
END