Witam i przepraszam z gory za kod w asm
Potrzebuje waszej pomocy, musze napisac stoper w asm. Już sie męcze z tym troche i nie chce działac tak jak powinno, więc prosze was o naproawdzenie/poprawienie błedów w kodzie ponizej.
I chcialbym rowniez wiedziec, czy moja interpretacja polecen w tym kodzie jest poprawna.
Sam Timer działa poprawnie.
Chcialbym aby sterowanie stoperem odbywalo sie za pomoca portu P1. w sensie poprzez ilosc klikniec nastapi start/stop/zerowanie.
z gory thx.
org 0h
;Następny rozkaz zostanie umieszczony pod adresem 0x0000
sek1 equ 55h
sek2 equ 56h
ms1 equ 57h
ms2 equ 58h
min1 equ 59h
min2 equ 5Ah
godz1 equ 5Bh
godz2 equ 5Ch
;umieszczenie nowych zmiennych w rejestrach
MOV R5,#0
MOV R4,#0
MOV R3,#0
MOV R2,#0
;wyzerowanie rejestrów
JMP stoper
;skok krótki do etykiety stoper
start:
org 100bh
;ustawienie licznika lokalizacji asemblera
INTT0:
Inc R5
;dodanie 1 do R5
CJNE R5, #99, ems
;porównanie zawartości rejestru z daną natychmiastową (99), jeśli są różne następuje skok pod etykietę ems, jeśli są równe skok nie jest wykonywany
Inc R4
MOV R5,#0
;wyzerowanie R5
CJNE R4, #60, s
Inc R3
MOV R4,#0
CJNE R3, #60, min
Inc R2
MOV R3,#0
CJNE R2, #24, godz
ems:
SJMP BCDMS
;skok krótki do etykiety BCDMS, tylko pod adresy z zakresu 0-255
s:
SJMP BCDS
min:
LJMP BCDMIN
;skok długi do etykiety BCDMIN, dostępny pełny obszar adresowy 64k
godz:
LJMP BCDGODZ
start:
MOV sek1,#0
MOV sek2,#0
MOV ms1,#0
MOV ms2,#0
MOV min1,#0
MOV min2,#0
MOV godz1,#0
MOV godz2,#0
;wyzerowanie zmiennych
MOV R7, #0
;wyzerowanie R7
MOV TL0, #LOW(65535-10000)
;Załadowanie młodszych bitów zmiennej z liczbą cykli 10000
MOV TH0, #HIGH(65535-10000)
;Załadowanie s tarszych bitów zmiennej z liczbą cykli 10000
MOV TMOD, #00010001b
;tryb pierwszy dla T0 i T1
SETB EA
;zezwolenie na przerwania ogolnie
SETB ET0
;zezwolenie na przerwanie licznika T0
SETB TR0
;startujemy T0
;obsluga portu
SETB ET1
;zezwolenie na przerwanie od licznika t1
MOV TH1,#-13
;ustawienie szybkosci przepelnienia, czym mniejsza wartosc tym szybciej nastapi sygnał przerwania
MOV TL1,TH1
;zapamiętanie wartości TH1 w mniej znaczącym bicie
SETB TR1
;startujemy T1
MOV SCON,#01010000b
;aktywacja odbiornika oraz wybor 1-go trybu dla portu szeregowego = Transmisja szeregowa asynchroniczna full duplex, Znaki 8-bitowe. Prędkość transmisji określana programowo
JMP $
;wieczna pętla
BCDS:
MOV A,04
MOV B,#10
;ustawienie ile razy licznik ma się przepełnić, ile razy ma zliczac
DIV AB
MOV sek1,A
;wynik z dzielenia zapisany do sek1
MOV sek2,B
;dzielnik dielenia zapisany do sek2
RETI
;Wyjście z bloku kodu obsługi przerwania
BCDMS:
CLR C
;wyczyszczenie C
MOV A,05
MOV B,#10
DIV AB
MOV ms1,A
MOV ms2,B
MOV SBUF,#13
MOV A,godz1
ADD A,#30h
MOV SBUF,A
MOV A,godz2
ADD A,#30h
MOV SBUF,A
MOV SBUF,#58
MOV A,min1
ADD A,#30h
MOV SBUF,A
MOV A,min2
ADD A,#30h
MOV SBUF,A
MOV SBUF,#58
MOV A,sek1
ADD A,#30h
MOV SBUF,A
MOV A,sek2
ADD A,#30h
MOV SBUF,A
MOV SBUF,#58
MOV A,ms1
ADD A,#30h
MOV SBUF,A
MOV A,ms2
ADD A,#30h
MOV SBUF,A
RETI
BCDMIN:
CLR C
MOV A,03
MOV B,#10
DIV AB
MOV min1,A
MOV min2,B
RETI
BCDGODZ:
CLR C
MOV A,02
MOV B,#10
DIV AB
MOV godz1,A
MOV godz2,B
RETI
Zerowanie:
MOV TR1,#0
MOV TR0,#0
jnb P1.0,stoper
stoper:
jnb P1.0, start
jb P1.0, Zerowanie
END