Kto moze pomoc zmodyfikować program dla dsm 8051 tak, żeby jeżeli naciskam na klawiaturze dsm przycisk w dol to licznik na wyświetlaczu 7_segmentowym zmniejsza o ''1'' jeżeli przycisk w gore to zwieksza o "1", a jeżeli "enter" to zatrzyma lub wznowią liczenie. Mam teraz cos takiego:
;
; zegar na DSM51
;
CSDS equ 30H ;bufor wyboru wskaźnika 7-segmentowego
CSDB equ 38H ;bufor segmentow wskaźnika 7-segmentowego
ww7s bit P1.6 ;wylacznik wyświetlacza 7-segmentowego
KEYB bit P3.5 ;bit informujacy o nacisnieciu klawisza
KEYS equ 72h ;tablica przechowujaca 4 stany klawiatury (obecny i 3 poprzednie)
LS equ 76h ;licznik sekund
LM equ 77h ;licznik minut
LG equ 78h ;licznik godzin
CZAS equ 79h ;tablica przechowywująca wskazanie zegara
org 0
ljmp start
org 0Bh ;procedura obsługi przerwanie od TIMER0
mov TH0, #226 ;w trybie0 generuje 960 przerwań na sekundę
setb F0 ;informuję pętlę zliczającą o wystąpieniu przerwania
; cpl P1.7
; cpl P1.5
reti ;wracam z przerwania
org 100h
start: ;USTAWIAMY ŚRODOWISKO
;12:58:34
mov LG, #12
mov LM, #58
mov LS, #34
mov DPTR, #WZORY ;adres wzorow cyfr na stałe do DPTR
acall convertCZAS
clr ww7s
mov R0, #CZAS ;R0 to wskaznik na tablice czas
mov R7, #00000001b ;bit wybierający wyświetlacz
mov IE, #0 ;blokada wszystkich przerwań
mov TMOD, #01110000b ;blokujemy TIMER1, ustawiamy TIMER0 w trybie 16bitowym
mov TCON, #00010000b ;zgoda na zliczanie przez TIMER0
setb ET0 ;zgoda na obsługę przerwania od TIMER0
setb EA ;ogólna zgoda na obsługę przerwań
mov TH0, #226 ;w trybie0 generuje 960 przerwań na sekundę
mov R2, #4 ;ustawiam liczniki aby zliczyć do 960
mov R3, #192
dispLoop: ;============ petla główna
jnb F0, dispLoop ;czekam na rzerwanie zegarowe
clr F0 ;zapominam o przerwaniu zegarowym
acall pokazCZAS ;TUTAJ JESTEM 960 RAZY NA SEKUNDĘ
djnz R3, dispLoop ;zliczam przerwania do 960
djnz R2, dispLoop
mov R2, #4 ;ustawiam liczniki aby zliczyć do 960
mov R3, #192
acall aktualizujCZAS ;TUTAJ JESTEM 1 RAZ NA SEKUNDĘ
cpl P1.7 ;żeby coś było widać
sjmp dispLoop ;wracam na poczatek pętli zliczającej
WZORY: ;========== wzory cyfr
db 00111111b, 00000110b, 01011011b, 01001111b ;0..3
db 01100110b, 01101101b, 01111101b, 00000111b ;0..7
db 01111111b, 01101111b ;8..9
pokazCZAS: ;=========OBSLUGA WYSWIETLACZA 7SEG
mov R1, #CSDB ;decyduje, które segmenty będą świecić
mov A, @R0 ;wartosc z odpowiedniej cyfry z tablicy czasow do ACC
; movc A, @A+DPTR ;zamieniam cyfre na odpowiadajacy jej wzorek
inc R0 ;nastepna cyfra na potrzeby nastepnego obrotu petli
setb ww7s ;wyłączam wyświetlacze żeby nie było duchów
movx @R1, A ;wysyłam wzorek do zatrzasku
mov R1, #CSDS ;decyduje, które wyświetlacze będą się świecić
mov A, R7 ;wybieram wyświetlacz do ACC
movx @R1, A ;wybieram wyswietlacz
jnb KEYB, noKEY ;jeżeli jest nacisniety klawisz
orl KEYS, A ;to maksa z ACC(R7) mowi nam ktory to klawisz
noKEY:
clr ww7s ;włączam wyswietlacze
rl A; ;przesówam wybrany wyswietlacz w lewo na potrzeby nastepnego
jnb ACC.7, nbACC7 ;sprawdzam czy nie minąłem wyświetlaczy
mov A,#00000001b ;jeżeli tak to wracam na najmłowdszy wyświtlacz
mov R0, #CZAS ;i wracam na cyfre jednostki sekund w tablicy CZas
mov CZAS+6, KEYS
acall keySERV
mov KEYS+3, KEYS+2
mov KEYS+2, KEYS+1
mov KEYS+1, KEYS
mov KEYS, #0
nbACC7:
mov R7, A ;zapamietuje nastepny wybrany wyświtlacz
ret
keySERV:
push ACC
mov A, KEYS
jz wracaj ;nie ma zadnego klawisza - nie ma nic do roboty
cjne A, KEYS+1, wracaj ;niestabilna klawiatura nie bedziemy obsługiwać
cjne A, KEYS+2, wracaj
cjne A, KEYS+3, obsluz ; stabilna klawiatura jeszcze nie obsluzona
sjmp resetC
obsluz:
cjne A, #4,niePrawo ; nie jest nacisniety klawisz "w prawo"
acall aktualizujCZAS
sjmp resetC
niePrawo:
cjne A, #16, nieDol
acall aktualizujMinuty
sjmp resetC
nieDol:
cjne A, #32, wracaj
acall aktualizujGodziny
resetC:
mov R2, #4 ;ustawiam liczniki aby zliczyć do 960
mov R3, #192
wracaj:
pop ACC
ret
convertCZAS:
mov A, LS
mov B, #10
div AB
movc A, @A+DPTR
mov CZAS+1, A ;dziesiatki sekund
mov A, B
movc A, @A+DPTR
mov CZAS, A ;sekundy
mov A, LM
mov B, #10
div AB
movc A, @A+DPTR
mov CZAS+3, A ;sekundy
mov A, B
movc A, @A+DPTR
mov CZAS+2, A ;dziesiatki sekund
mov A, LG
mov B, #10
div AB
movc A, @A+DPTR
mov CZAS+5, A ;sekundy
mov A, B
movc A, @A+DPTR
mov CZAS+4, A ;dziesiatki sekund
ret
aktualizujCZAS:
inc LS
mov A, LS
cjne A, #60, nie60
mov LS, #0
aktualizujMinuty:
inc LM
mov A, LM
cjne A, #60, nie60
mov LM, #0
aktualizujGodziny:
inc LG
mov A, LG
cjne A, #24, nie60
mov LG, #0
nie60:
acall convertCZAS
mov R2, #4 ;odnaiwam licznika aby ponownie
mov R3, #192 ;zliczyć do 960
ret
end