发表于:2006/10/19 18:01:00
#0楼
org 0000h ;程序入口地址
ajmp main
org 0003h ;外部中断INTO入口地址
ajmp pinto ;转中断服务子程序
org 000bh ;T0中断入口
ajmp wto ;定时器T0入口地址
org 20h ;主程序起始地址
main: mov sp,#40h ;设置栈指针
clr 00h ;工作状态标志位(=0为“设置”状态,=1为“工作”状态)
clr 01h ;状态指示灯标志位(=0时LED亮,=1时LED灭)
setb 02h ;控制信号标志位(=0时p3.7为低,=1时p3.7为高)
mov 21h,#0 ;0.5毫秒计数器清零
mov 22h,#0 ;100毫秒计数器清零
mov 23h,#0 ;秒计数器清零
mov 24h,#15 ;分计数器预置数
mov tl0,#6 ;装入定时初值
mov th0,#6
mov tmod,#02h ;设T0为方式2
setb ea ;开CPU中断
setb et0 ;允许T0中断
clr tr0 ;禁止T0计数
setb it0 ;设定INT0触发方式
setb ex0 ;允许INT0中断
mov 34h,#1 ;显示缓冲器预置数(十位)
mov 35h,#5 ;显示缓冲器预置数(个位)
m: nop
acall led ;调用工作状态指示灯控制子程序
jnb 00h,m ;查询工作状态标志,为0时等待设置,为1时程序向下执行
mm: nop
acall zh1 ;调用数制转换子程序,将设置的十进制数转换为二进制数送到分计数器
acall dsp ;调用显示子程序,显示分计数器中的数据。
jnb 02h,son ;查询控制信号标志位,为0时转到信号输出子程序
ajmp m ;信号控制标志位为1时主程序循环
;输出控制信号子程序
son: clr ex0 ;关外部中断
clr tr0 ;关计数器
clr p3.7
jnb p3.4,son1 ;按K3使p3.7变高(清除输出信号)
ajmp son
;清除控制信号子程序
son1: jnb p3.4,$ ;消除抖动
setb p3.7
setb 02h ;设置p3.7状态标志
setb ex0 ;开外部中断
clr 00h ;设置工作状态标志
ajmp m ;返回主程序
;显示子程序
dsp: mov r7,#0afh
dsp0: mov r0,#30h
mov dptr,#tab
nop
mov a,@r0
movc a,@a+dptr
rx1: mov p1,a
clr p3.0
djnz r7,rx1
mov r7,#0afh
inc r0
mov p1,#0ffh
setb p3.0
mov a,@r0
movc a,@a+dptr
rx2: mov p1,a
clr p3.1
djnz r7,rx2
mov r7,#8
setb p3.1
djnz r7,dsp0
ret
dsp1: mov r7,#0fh
dsp01: mov r0,#34h
mov dptr,#tab
mov a,@r0
movc a,@a+dptr
rx01: mov p1,a
clr p3.1
djnz r7,$
mov r7,#0fh
inc r0
setb p3.1
mov a,@r0
movc a,@a+dptr
mov p1,a
clr p3.0
djnz r7,$
setb p3.0
ret
;数制转换子程序
zh1: mov r2,#0
mov r3,24h
acall bcd
mov a,r6
anl a,#0fh
mov 30h,a
mov a,r6
anl a,#0f0h
swap a
mov 31h,a
ret
;十进制转换为二进制子程序
dt0b: mov 32h,#0
mov 33h,#0
mov r0,#32h
mov r2,#3
acall idtb
mov a,r4
mov 24h,a
ret
idtb: mov r3,#0
mov a,@r0
mov r4,a
idtl: mov a,r4
mov b,#10
mul ab
mov r4,a
mov b,#10
xch a,b
xch a,r3
mul ab
add a,r3
xch a,r4
inc r0
add a,@r0
xch a,r4
addc a, #0
mov r3,a
djnz r2,idtl
ret
;二进制数转换为十进制数子程序
bcd: clr a
mov r4,a
mov r5,a
mov r6,a
mov r7,#16
ibtl2: clr c
mov a,r3
rlc a
mov r3,a
mov a,r2
rlc a
mov r2,a
mov a,r6
addc a,r6
da a
mov r6,a
mov a,r5
addc a,r5
da a
mov r5,a
mov a,r4
addc a,r4
da a
mov r4,a
djnz r7,ibtl2
ret
;外部中断服务子程序
pinto: clr ex0
push acc
push psw
setb p3.5
acall dsp1
pk: jb p3.2,toext
pk0: acall dsp1
jnb p3.2,pk0
pk2: jb p3.3,pk3 ;判K2按下否,末按则转到判K3状态
acall dsp1
inc 34h
mov a,34h
cjne a,#0ah,pk22
mov 34h,#0
pk22: acall dsp1 ;K2按下,30H加1
jnb p3.3,pk22
ajmp pk2
pk3: acall dsp1
jb p3.4,pk1 ;判K3按下否,末按则转到判K1状态
inc 35h
mov a,35h
cjne a,#0ah,pk33
mov 35h,#0
pk33: acall dsp1
jnb p3.4,pk33
ajmp pk3
pk1: acall dsp1
jb p3.2,pk2 ;K1末按则转判K2和K3
pk10: acall dsp1
jnb p3.2,pk10
acall dt0b
setb 00h
toext: setb ex0 ;开中断
setb tr0
pop psw ;恢复现场
pop acc
reti
;状态指示灯控制子程序
led: jb 01h,led0
clr p3.5
ret
led0: setb p3.5
ret
;段码表
tab: db 0c0h,0f9h,0a4h,0b0h,99h
db 92h,82h,0f8h,80h,90h
;定时中断服务子程序
wto: push acc
push psw
inc 21h
mov a,21h
cjne a,#0c8h,toreti
mov 21h,#0
inc 22h
mov a,22h
cjne a,#10,toreti
mov 22h,#0
inc 23h
cpl 01h
mov a,23h
cjne a,#60,toreti
mov 23h,#0
dec 24h
mov a,24h
cjne a,#0,toreti
clr tr0
clr 02h
clr 01h
clr 00h
toreti: pop psw
pop acc
reti
end
ajmp main
org 0003h ;外部中断INTO入口地址
ajmp pinto ;转中断服务子程序
org 000bh ;T0中断入口
ajmp wto ;定时器T0入口地址
org 20h ;主程序起始地址
main: mov sp,#40h ;设置栈指针
clr 00h ;工作状态标志位(=0为“设置”状态,=1为“工作”状态)
clr 01h ;状态指示灯标志位(=0时LED亮,=1时LED灭)
setb 02h ;控制信号标志位(=0时p3.7为低,=1时p3.7为高)
mov 21h,#0 ;0.5毫秒计数器清零
mov 22h,#0 ;100毫秒计数器清零
mov 23h,#0 ;秒计数器清零
mov 24h,#15 ;分计数器预置数
mov tl0,#6 ;装入定时初值
mov th0,#6
mov tmod,#02h ;设T0为方式2
setb ea ;开CPU中断
setb et0 ;允许T0中断
clr tr0 ;禁止T0计数
setb it0 ;设定INT0触发方式
setb ex0 ;允许INT0中断
mov 34h,#1 ;显示缓冲器预置数(十位)
mov 35h,#5 ;显示缓冲器预置数(个位)
m: nop
acall led ;调用工作状态指示灯控制子程序
jnb 00h,m ;查询工作状态标志,为0时等待设置,为1时程序向下执行
mm: nop
acall zh1 ;调用数制转换子程序,将设置的十进制数转换为二进制数送到分计数器
acall dsp ;调用显示子程序,显示分计数器中的数据。
jnb 02h,son ;查询控制信号标志位,为0时转到信号输出子程序
ajmp m ;信号控制标志位为1时主程序循环
;输出控制信号子程序
son: clr ex0 ;关外部中断
clr tr0 ;关计数器
clr p3.7
jnb p3.4,son1 ;按K3使p3.7变高(清除输出信号)
ajmp son
;清除控制信号子程序
son1: jnb p3.4,$ ;消除抖动
setb p3.7
setb 02h ;设置p3.7状态标志
setb ex0 ;开外部中断
clr 00h ;设置工作状态标志
ajmp m ;返回主程序
;显示子程序
dsp: mov r7,#0afh
dsp0: mov r0,#30h
mov dptr,#tab
nop
mov a,@r0
movc a,@a+dptr
rx1: mov p1,a
clr p3.0
djnz r7,rx1
mov r7,#0afh
inc r0
mov p1,#0ffh
setb p3.0
mov a,@r0
movc a,@a+dptr
rx2: mov p1,a
clr p3.1
djnz r7,rx2
mov r7,#8
setb p3.1
djnz r7,dsp0
ret
dsp1: mov r7,#0fh
dsp01: mov r0,#34h
mov dptr,#tab
mov a,@r0
movc a,@a+dptr
rx01: mov p1,a
clr p3.1
djnz r7,$
mov r7,#0fh
inc r0
setb p3.1
mov a,@r0
movc a,@a+dptr
mov p1,a
clr p3.0
djnz r7,$
setb p3.0
ret
;数制转换子程序
zh1: mov r2,#0
mov r3,24h
acall bcd
mov a,r6
anl a,#0fh
mov 30h,a
mov a,r6
anl a,#0f0h
swap a
mov 31h,a
ret
;十进制转换为二进制子程序
dt0b: mov 32h,#0
mov 33h,#0
mov r0,#32h
mov r2,#3
acall idtb
mov a,r4
mov 24h,a
ret
idtb: mov r3,#0
mov a,@r0
mov r4,a
idtl: mov a,r4
mov b,#10
mul ab
mov r4,a
mov b,#10
xch a,b
xch a,r3
mul ab
add a,r3
xch a,r4
inc r0
add a,@r0
xch a,r4
addc a, #0
mov r3,a
djnz r2,idtl
ret
;二进制数转换为十进制数子程序
bcd: clr a
mov r4,a
mov r5,a
mov r6,a
mov r7,#16
ibtl2: clr c
mov a,r3
rlc a
mov r3,a
mov a,r2
rlc a
mov r2,a
mov a,r6
addc a,r6
da a
mov r6,a
mov a,r5
addc a,r5
da a
mov r5,a
mov a,r4
addc a,r4
da a
mov r4,a
djnz r7,ibtl2
ret
;外部中断服务子程序
pinto: clr ex0
push acc
push psw
setb p3.5
acall dsp1
pk: jb p3.2,toext
pk0: acall dsp1
jnb p3.2,pk0
pk2: jb p3.3,pk3 ;判K2按下否,末按则转到判K3状态
acall dsp1
inc 34h
mov a,34h
cjne a,#0ah,pk22
mov 34h,#0
pk22: acall dsp1 ;K2按下,30H加1
jnb p3.3,pk22
ajmp pk2
pk3: acall dsp1
jb p3.4,pk1 ;判K3按下否,末按则转到判K1状态
inc 35h
mov a,35h
cjne a,#0ah,pk33
mov 35h,#0
pk33: acall dsp1
jnb p3.4,pk33
ajmp pk3
pk1: acall dsp1
jb p3.2,pk2 ;K1末按则转判K2和K3
pk10: acall dsp1
jnb p3.2,pk10
acall dt0b
setb 00h
toext: setb ex0 ;开中断
setb tr0
pop psw ;恢复现场
pop acc
reti
;状态指示灯控制子程序
led: jb 01h,led0
clr p3.5
ret
led0: setb p3.5
ret
;段码表
tab: db 0c0h,0f9h,0a4h,0b0h,99h
db 92h,82h,0f8h,80h,90h
;定时中断服务子程序
wto: push acc
push psw
inc 21h
mov a,21h
cjne a,#0c8h,toreti
mov 21h,#0
inc 22h
mov a,22h
cjne a,#10,toreti
mov 22h,#0
inc 23h
cpl 01h
mov a,23h
cjne a,#60,toreti
mov 23h,#0
dec 24h
mov a,24h
cjne a,#0,toreti
clr tr0
clr 02h
clr 01h
clr 00h
toreti: pop psw
pop acc
reti
end