Pengguna:ArdWar/digiclock
code_seg segment
assume cs:code_seg,ds:code_seg,ss:code_seg
org 100h
;PA0 = Start/Reset timer
;PA1 = Delay set
;PC0 = Servo ctrl
;PB0-7 = Minute indicator
start:
mov al,98h ;A=IN B=OUT
out 03h,al ;
mov ax,02h
push ax
mov dx,02h
inp:
call debounce
in ax,00h ;pool port A 14
cmp ax,02h ;00000010
je hlds
cmp ax,01h
je hldr
jmp inp
hlds:
call debounce
in ax,00h ;pool port A
cmp ax,02h ;PA0 = start
je hlds ;repeat hold
add cx,60d
pop ax
shl ax,1
out 02h,ax
push ax
rlss:
call debounce
in ax,00h ;pool port A
cmp ax,00h ;release
jne rlss ;wait for PA0 release
jmp inp
hldr:
call debounce
in ax,00h ;pool port A
cmp ax,01h ;PA0 = start
je hldr ;repeat hold
add cx,60d
rlsr:
call debounce
in ax,00h ;pool port A
cmp ax,00h ;release
jne rlsr ;wait for PA0 release
timer:
push cx
mov cx,60d
onemin:
push cx ;store second timer 15
mov cx,50d ; 4
onesec: ;1s PC0 indicator
push cx ; 15
mov cx,1948d ;9,75u x 1948 = 18,993m 4
lowspace: ;19ms servo space 39 9,75u
in ax,00h ;pool port A 14
cmp ax,01h ;reset 4
je inp ;jump if reset 4
loop lowspace ;loop 1688x 17
mov al,01h ;toggle servo hi 4
out dx,al ;PC0 high 14
mov cx,102d ;mark timer 4
lowmark: ;1ms servo mark 39
in ax,00h ;pool port A
cmp ax,01h ;reset
je inp ;jump if reset
loop lowmark ;loop 1ms
mov al,00h ;toggle servo low
out dx,al ;PC0 low
pop cx ;return second timer
loop onesec
pop cx
mov al,cl
and al,0001b
out 01h,al
loop onemin
pop cx
pop ax
shr ax,1
out 01h,ax
push ax
loop timer ;loopback servo ctr
endtimer:
mov cx,1846d ;loop 18ms
highspace:
in ax,00h ;pool port A
cmp ax,01h ;reset
je rlss
loop highspace
mov al,01h ;toggle servo high
out dx,al ;port B high
mov cx,205d ;loop 2ms
highmark:
in ax,00h ;pool port A
cmp ax,01h ;reset
je rlss
loop highmark
mov al,00h ;toggle servo low
out dx,al ;port B low
jmp endtimer
debounce proc near
push cx
mov cx,0ffffh
del:
loop del
pop cx
ret
debounce endp
org 20f0h
db 0eah
dw 100h
dw 0fdf0h
code_seg ends
end start