Hladam niekoho ochotneho kto by mi pomohol popisat riadky programu aby som vedel co ktory riadok programu znamena, je to program ktory na zaklade vopred znamej vzdialenosti ma vypocitat rychlost z bodu A do bodu B a zobrazit to na 4segmentovom displej, po privedeni log. 1 na vstup INT-0 sa ma zacat pocitanie casu az po zaregistrovani log. 1 na vystupe INT-1, a z daneho casu sa potom vypocita rychlost.
;Program vyrata a zobrazi rychlost na zaklade zmeraneho casu a znamej
;vzdialenosti
org 0000h ;nastavenie pociatku programu
sdat equ 0b1h ;p3.1
clk equ 0b0h ;p3.0
ajmp 100h ;zaciatok na 100h
;obsluha prerusenia int 0 + jeho zakazanie
org 0003h
acall 30h
clr 0a8h
reti
;obsluha prerusenia int 1 + jeho zakazanie
org 0013h
acall 30h
clr 0aah
reti
;spustenie a zastavenie casovaca
org 30h
jbc 8eh,5H
setb 8eh
ret
;zaciatok programu
org 100h
clr clk
clr 0afh ;zakazanie preruseni, nastavenie sp,tmod,th1 a tl1
mov 81h,#50h
mov r0,#0h
mov 89h,#10h
mov 8dh,#0fch
mov 8bh,#17h
anl 88h,#0aah ;zastavenie casovacov nastavenie it na log.0
orl 0a8h,#85h ;povolenie extern.preruseni
clr 80h ;pomocny bit na pretecenie rozsahu
opakuj:
jnb 8eh,opakuj ;cakanie na interupt
rataj:
jb 8fh,130h ;zaratanie pretecenia
jb 80h,100h ;pretecenie rozsahu=navrat na zaciatok
jb 8eh,rataj ;cakanie na druhy interupt
;kontrola,ci aspon raz pretieklo
clr 0d7h
mov a,#0ffh
add a,r0
jnc 100h ;ak ani raz,vrat sa na zaciatok
jmp pokrac
;podprogram pre obsluzenie pretecenia casovaca
org 130h ;nastavenie th1,tl1
mov 8dh,#0fch
mov a,#19h ;zaratanie uz napocitanych impulzov v tl1
add a,8bh
mov 8bh,a
clr 8fh ;tf=0 a inkrementacia r0
mov a,#01h
add a,r0 ;v r0 je počet pretečení, teda vlastne počet milisekund
mov r0,a
clr 0d7h ;vymazanie cy
add a,#1h ;kontrola r0<252
jnc skonci
setb 80h ;pretecenie rozsahu
skonci:
jmp rataj
;pokracovanie programu po preskoceni podprogramu
;vlozenie hodnoty z casovaca do registru r1
pokrac:
mov a,08dh ;beriem spodne 2 bity z th1
anl a,#3h
mov b,#40h ;posuvam ich na horne 2 bity
mul ab
mov r1,a
mov a,08bh ;odcitam 13h(17-4,lebo prerusenie trva 4 cykly)
clr 0d7h ;ako pociatocnu hodnotu v casovaci
subb a,#13h
mov r7,a ;v r7 bude korekcia poslednych dvoch bitov
anl a,#0fch ;beriem hornych 6 bitov z tl1
mov b,#4h ;posuvam ich na spodnych 6 bitov
div ab
add a,r1
mov r1,a
mov a,#03h ;ulozenie korekcie
anl a,r7
mov r7,a
;hlavny vypocet rychlosti
mov r2,#0eah ;nastavenie vzdialenosti 6,5 cm
mov r3,#0h
call pomoc ;zistenie celej casti
mov 31h,r4
call desatiny ;posunutie na desatiny
call pomoc ;vyratanie desatin
mov 35h,r4
call desatiny ;posunutie na stotiny
call pomoc ;vyratanie stotin
mov 36h,r4
call desatiny ;posunutie na tisiciny
call pomoc ;vyratanie tisicin
mov 37h,r4
jmp preskoc ;preskocenie podprogramov
tabznak: db 3fh,06h,05bh,4fh,66h,6dh,7dh,07h,7fh,6fh
;podprogram pre posunutie desatinnej casti na jednotky
desatiny:
mov b,#0ah
mov a,r3
mul ab ;roznasobenie spodnych bytov
mov r3,a
mov r5,b
mov b,#0ah
mov a,r2
clr 0d2h
mul ab ;roznasobenie hornych bytov
add a,r5
jb 0d2h,posun ;ak pretecenie,potom zaokruhli
mov r2,a
jmp fine
posun:
mov r2,b
mov r3,a
fine:
ret
;podprogram pre delenie za pomoci odpocitavania
pomoc:
mov r4,#0h
odcitaj:
mov a,r2
clr 0d7h ;kontrola,ci r2>r0
subb a,r0
jc mensi
mov 39h,r2
mov a,r0
cjne a,39h,nerov ;kontrola ,ci sa nerovnaju r2 a r0
mov a,r3 ;ak r2=r0 a r3<r1 potom uz nerataj
clr 0d7h
subb a,r1
jc mensi
nerov:
mov a,r3 ;odcitanie nizsich bytov
subb a,r1
mov r3,a
mov a,r2 ;odcitanie vyssich bytov
subb a,r0
mov r2,a
inc r4 ;inkrementacia r4 a cyklenie
jmp odcitaj
mensi:
mov a,r7 ;korekcia poslednych dvoch bitov
mov b,r4
mul ab ;zistenie,ze kolko sme nezaratali
mov r6,b
mov b,#4h ;beriem horne 6 bity z r7
div ab
mov r5,a
mov b,#40h ;beriem dolne dva bity,ak pretieklo
mov a,r6
mul ab
add a,r5
xch a,r3 ;odcitam od desatin korekciu,ak pretecie,potom upravim aj jednotky
clr 0d7h
subb a,r3
mov r3,a
jnc konec
dec r4
konec:
ret
;pokracovanie programu,rozlozenie celej casti na stovky,desiatky a jednotky
preskoc:
mov a,31h
mov b,#0ah
div ab ;predelenie 10 a zistim jednotky
mov 34h,b
mov b,#0ah
div ab ;predelenie 10 a zistim desiatky
mov 33h,b
mov b,#0ah
div ab ;predelenie 10 a zistim stovky
mov 32h,b
;zistenie zobrazovanych 4 cislic
mov a,32h
mov 38h,#3h ;poloha desatinnej bodky
cjne a,#0h,zobraz ;ak nemame stovky,potom zobrazuj od desiatok
desiatky:
mov 38,#2h ;poloha desatinnej bodky
mov 32h,33h
mov 33h,34h
mov 34h,35h
mov 35h,36h
mov a,32h
cjne a,#0h,zobraz ;ak nemame desiatky,potom zobrazuj od jednotiek
jednotky:
mov 32h,33h
mov 38h,#1h ;poloha desatinnej bodky
mov 33h,34h
mov 34h,36h
mov 35h,37h
;priprava a zobrazenie cislic
zobraz:
mov a,32h ;dekoduj prvy znak
mov dptr,#tabznak
movc a,@a+dptr
mov 32h,a
mov a,33h ;dekoduj druhy znak
mov dptr,#tabznak
movc a,@a+dptr
mov 33h,a
mov a,34h ;dekoduj treti znak
mov dptr,#tabznak
movc a,@a+dptr
mov 34h,a
mov a,35h ;dekoduj stvrty znak
mov dptr,#tabznak
movc a,@a+dptr
mov 35h,a
;vytvorenie prvych dielcich 8 bitov
mov 36h,#0h ;nulovanie zobrazovanej cislice
mov a,32h
jnb acc.4,s1 ;skusanie,ci ma E4 segment svietit
xrl 36h,#80h ;ak ano,potom ho zasviet
s1: jnb acc.3,s2 ;D4
xrl 36h,#40h
s2: jnb acc.2,s3 ;c4
xrl 36h,#20h
s3: mov a,38h ;skumanie polohy desatinnej bodky
cjne a,#1h,s4
xrl 36h,#10h ;ak tam patri,zobraz ju
s4:mov a,33h
jnb acc.4,s5 ;skusanie,ci ma E3 segment svietit
xrl 36h,#8h ;ak ano,potom ho zasviet
s5: jnb acc.3,s6 ;D3
xrl 36h,#4h
s6: jnb acc.2,s7 ;c3
xrl 36h,#2h
s7: mov a,38h ;skumanie polohy desatinnej bodky
cjne a,#2h,s8
xrl 36h,#1h ;ak tam patri,zobraz ju
;vytvorenie druhych dielcich 8 bitov
s8: mov 37h,#0h ;nulovanie zobrazovanej cislice
mov a,34h
jnb acc.4,s21 ;skusanie,ci ma E2 segment svietit
xrl 37h,#80h ;ak ano,potom ho zasviet
s21: jnb acc.3,s22 ;D2
xrl 37h,#40h
s22: jnb acc.2,s23 ;c2
xrl 37h,#20h
s23: mov a,38h ;skumanie polohy desatinnej bodky
cjne a,#3h,s24
xrl 37h,#10h ;ak tam patri,zobraz ju
s24:mov a,35h
jnb acc.4,s25 ;skusanie,ci ma E1 segment svietit
xrl 37h,#8h ;ak ano,potom ho zasviet
s25: jnb acc.3,s26 ;D1
xrl 37h,#4h
s26: jnb acc.2,s28 ;c1
xrl 37h,#2h
;vytvorenie tretich dielcich 8 bitov
s28: mov 39h,#0h ;nulovanie zobrazovanej cislice
mov a,35h
jnb acc.1,s31 ;skusanie,ci ma B1 segment svietit
xrl 39h,#80h ;ak ano,potom ho zasviet
s31: jnb acc.0,s32 ;A1
xrl 39h,#40h
s32: jnb acc.5,s33 ;F1
xrl 39h,#20h
s33: jnb acc.6,s34 ;G1
xrl 39h,#10h
s34: mov a,34h
jnb acc.1,s35 ;skusanie,ci ma A2 segment svietit
xrl 39h,#8h ;ak ano,potom ho zasviet
s35: jnb acc.0,s36 ;B2
xrl 39h,#4h
s36: jnb acc.5,s37 ;C2
xrl 39h,#2h
s37: jnb acc.6,s38 ;G2
xrl 39h,#1h
;vytvorenie stvrtych dielcich 8 bitov
s38: mov 40h,#0h ;nulovanie zobrazovanej cislice
mov a,33h
jnb acc.1,s41 ;skusanie,ci ma B3 segment svietit
xrl 40h,#80h ;ak ano,potom ho zasviet
s41: jnb acc.0,s42 ;A3
xrl 40h,#40h
s42: jnb acc.5,s43 ;F3
xrl 40h,#20h
s43: jnb acc.6,s44 ;G3
xrl 40h,#10h
s44: mov a,32h
jnb acc.1,s45 ;skusanie,ci ma A4 segment svietit
xrl 40h,#8h ;ak ano,potom ho zasviet
s45: jnb acc.0,s46 ;B4
xrl 40h,#4h
s46: jnb acc.5,s47 ;C4
xrl 40h,#2h
s47: jnb acc.6,s48 ;G4
xrl 40h,#1h
s48: ;vysielanie 35bitov + start bit
setb sdat
setb clk ;vysielanie start bitu
mov r1,#9
g91: djnz r1,g91 ;opakovani cyklu dle obsahu registru r1
clr clk
mov r1,#9
g92: djnz r1,g92
setb clk ;nevyuzity 18.vyvod
mov r1,#9
g93: djnz r1,g93
clr clk
mov a,36h
nop
nop
mov r0,#8 ;prve 8 bity
g1: acall monitor
djnz r0,g1
mov a,37h
mov r0,#8 ;druhe 8 bity
g2: acall monit
djnz r0,g2
setb clk ;nevyuzity 40.vyvod
mov r1,#9
g94: djnz r1,g94
clr clk
mov a,39h
mov r0,#8 ;tretie 8 bity
g3: acall monit
djnz r0,g3
mov a,40h
mov r0,#8 ;stvrte 8 bity
g4: acall monit
djnz r0,g4
nop
clr sdat
mov r1,#6
g95: djnz r1,g95
opak: setb clk
mov r1,#9
g96: djnz r1,g96
clr clk
mov r1,#8
g97: djnz r1,g97
ajmp opak
monitor:
mov r1,#3
g98: djnz r1,g98
jb acc.7,g11
clr sdat
ajmp g12
g11: setb sdat
nop
nop
g12: rl a
setb clk
mov r1,#9
g99: djnz r1,g99
clr clk
ret ;navrat z podprogramu
monit:
clr 0d7h
mov a,#7
subb a,r0
jc g22
nop
nop
g22: jb acc.7,g23
clr sdat
ajmp g24
g23: setb sdat
nop
nop
g24: rl a
setb clk
mov r1,#9
g89: djnz r1,g89
clr clk
ret
end
|