Witam,
mam program prostego zegara ( pod 8051), w którym dodawanie sekund czy minut polega na komendzie INC. Dane pokazywane są na portach ( P0 sec, P1 min, P2 godz) w formacie binarnym. W zasadzie rozumiem diałanie mechanizmu, natomiast nie ogarniam cześci " konwersja" - z elementami dzielenia przez 100, 10 i zamiany tetrad a akumulatorze.
Kiedy usunąłem część " konwersja" zegar działa, tylko nie liczy od 0 do 9 tylko od 0 do A. Sprawdziłem sobie steep by step w programie Edsim51.
Wstawiam ten kawałek do liczenia + skok "konwersja. Chodzi mi o wytłumaczenie zasady działania tych bloków. Ucze się asemblera dopiero od 2 tygodni.
Dzieki za wszelką pomoc
petla:
mov a,r0 ; przepisz rejestr R0 do akumulatora
lcall konwersja
mov p0,r5 ; przepisz rejestr R5 do portu P0
mov a,r1 ; przepisz rejestro R1 do akumulatora
lcall konwersja
mov p1,r5 ; przepisz rejestr R5 do portu P1
mov a,r2 ; przepisz rejestr R2 do akumulatora
lcall konwersja
mov p2,r5 ; przepisz rejestr R5 do portu P2
inc r0 ; powiększ warość rejestru R0 o 1
cjne R0,#3cH,nie ; sprawdź czy rejestr R0 ma wartość 60D ( 3CH )
;jesli tak
mov R0,#0h ; zerujemy rejestr sekund R0
inc R1 ; powiększ wartość rejestr minut R1 o 1
mov P0,#0h ; zerujemy port sekund
cjne R1,#3ch,nie ;sprawdzamy czy rejestr minut R1 ma wartość 60D (3CH)
inc r2 ; powiększamy rejestr godzin R2 o 1
mov r1,#0h ; zerujemy rejestr R1 (minut)
mov r0,#0h ; zerujemy rejestr R0 (sekund)
cjne R2,#18h,nie ; sprawdzamy czy rejestr godzin R2 ma wartość 24D
mov R0,#0h ; zerujemy rejestr sekund
mov R1,#0h ;zerujemy rejestr minut
mov R2,#0h ;zerujemy rejestr godzin
nie:
jmp petla ; jeśli nie, skok do etykiety PETLA
ret ;powrót z procedury
konwersja:
clr c ;zerujemy flagę C
mov b,#100 ;wpisujemy do rejestru B wartość 100D
div ab ;dzielimy wartość akumulatora przez 100D
mov r4,a ;przepisujemy wartość akumulatora do R4 ; //save MSB in R0
clr c ;zerujemy flagę C
mov a,b ; wpisujemy do akumulatora watośc rejestru B
mov b,#10 ;wpisujemy do rejestru B wartość 10D ;/Divide by 10
div ab ;dzielimy wartość akumulatora przez 10
swap a ;zamiana połówek adresu (LSB z MSB) w akumulatorze
mov r5,a ;przepisz zawartość akumulatora do rejestru R5
; //save the tens place in the Higher nibble
mov a,b
orl a,r5 ;suma logiczna A i R5
mov r5,a ;przepisz zawartość A do rejestru R5 ;// save the tens place in the Lower nibble
ret ;powrót z procedury