📄 总程序.asm
字号:
org 0000h
ljmp main
org 0013h
ljmp aint1
org 0100h
main: mov sp,#67h
setb 8ah ;边沿触发
mov ie,#84h
lcall q0
lcall rd33 ;读24c02原密码
setb p1.4
mov tmod,#60h
mov th1,#0d0h ;响三声摘机
mov tl1,#0d0h ;80:五声,0f0:一声
setb tr1
wait: jbc tf1,lp
sjmp wait ;wait int1
lp: clr p1.4
w: lcall input
lcall test
lcall tag ;密码修改标志
lcall new1
lcall new2
lcall save
lcall choose ;选择通道
lcall close
lcall open ;控制电器
ljmp w
aint1: inc 24h
mov 21h,#01h
setb p1.0
setb p1.1
setb p1.2
setb p1.3
mov a,p1
anl a,#0fh
mov 50h,a
reti
q0: mov 20h,#0 ;密码无效0
mov 21h,#0 ;按下键标志0
mov 22h,#0 ;选中第n个通道
mov 23h,#0 ;新密码存储标志0
mov 24h,#0 ;输入的密码位数
mov 25h,#0 ;密码结束标志0
mov 26h,#0 ;密码错误次数
mov 27h,#0 ;挂机标志
mov 28h,#0 ;*输入新密码0(b)
mov 29h,#0 ;第二次输入新密码标志
mov 50h,#0 ;存当前键值
input:
mov a,25h ;密码输完否
clr c
subb a,#00h
jz bb
ret
bb:
mov a,#00h ;密码正确否
clr c
subb a,20h
jz cc
ret
cc: lcall ring1
mov a,21h ;有健按下?
clr c
subb a,#01h
jz dd
ret
dd: mov a,24h ;密码存于35h
add a,#34h
mov r0,a
mov @r0,50h
mov a,24h
clr c
subb a,#2 ;2位密码
jz mm
ret
mm: mov 24h,#0 ;清密码计数器
mov 25h,#01h ;建立密码结束标志
ret
test:
mov a,#01h
clr c
subb a,25h ;密码输完否
jz bj0
ret
bj0: mov a,#00h ;密码正确否
clr c
subb a,20h
jz bj1
ret
bj1: mov a,35h
clr c
subb a,30h
jnz bj2
mov a,36h
clr c
subb a,31h
jnz bj2
lcall ring4
mov 20h,#01h ;密码有效标志
mov 24h,#0
mov 21h,#0 ;按键标志清零
lcall de1s
ret
bj2:
lcall ring2
inc 26h ;密码错误次数加一
lcall de1s
mov a,#3
clr c
subb a,26h
jz btg
mov 25h,#0
mov 24h,#0
mov 20h,#0
mov 26h,#0
ret
btg:
mov 26h,#0 ;挂机标志
mov 27h,#1
ret
choose: mov a,28h
clr c
subb a,#1
jnz c0
ret
c0: mov a,29h
clr c
subb a,#1
jnz c00
ret
c00:
mov a,22h
clr c
subb a,#0 ;没有通道被选中
jz c1
ret
c1: mov a,#01h ;密码有效?
clr c
subb a,20h
jz cz
ret
cz: lcall ring5 ;输入操作通道号
mov a,21h ;有健按下?
clr c
subb a,#01h
jz cz1
ret
cz1: mov 21h,#0 ;查表
mov 22h,#0
mov r1,50h
mov a,50h
rl a
add a,r1
mov dptr,#tab
jmp @a+dptr
tab: ljmp nine ;0
ljmp one ;
ljmp two ;
ljmp three ;3
ljmp nine
ljmp nine
ljmp nine
ljmp nine
ljmp nine
ljmp nine ;9
ljmp nine ;
ljmp tag ;b
nop
nop
ret
one: mov 22h,#1 ;有1通道被选中
ret
two: mov 22h,#2 ;有2通道被选中
ret
three: mov 22h,#3 ;有3通道被选中
ret
nine: mov 22h,#0
mov 27h,#1 ;关闭
ret
open: mov a,22h ;有电器选中否
clr c
subb a,#0
jnz o1
ret
o1: lcall ring6
mov a,21h ;有健按下?
clr c
subb a,#01h
jz o2
ret
o2: mov 21h,#0 ;清键值
mov a,50h
clr c
subb a,#0ah ;判0
jz one0
mov a,50h ;判1
clr c
subb a,#0ch
jz one1
mov a,50h
clr c
subb a,#9
jz rest
mov 27h,#1 ;挂机
ret
rest: mov 22h,#0
ret
one0: mov a,22h
clr c
subb a,#1
jz lp01
clr c
subb a,#1
jz lp02
lcall ring8
setb p1.7
ret
lp01: lcall ring8
setb p1.5
ret
lp02: lcall ring8
setb p1.6
ret
one1: mov a,22h
clr c
subb a,#1
jz lp11
clr c
subb a,#1
jz lp12
lcall ring7
clr p1.7
ret
lp11: lcall ring7
clr p1.5
ret
lp12: lcall ring7
clr p1.6
ret
close: mov a,27h
clr c
subb a,#1
jz col1
ret
col1: lcall ring8
lcall q0
setb p1.4
ljmp main
ret
tag: mov a,20h ;密码正确
clr c
subb a,#01h
jz tt1
ret
tt1: mov a,#0bh
clr c
subb a,50h ;*修改密码
jz tt2
ret
tt2: mov 28h,#1 ;*新密码标志位
mov 21h,#0 ;清按键标志
mov 24h,#0
ret
new1:
mov a,28h ;判新密码标志位
clr c
subb a,#1
jz n1
ret
n1: lcall ring3
mov a,21h ;有键按下标志
clr c
subb a,#1
jz n2
ret
n2:
mov a,24h ;新密码存于40h
add a,#3fh
mov r0,a
mov @r0,50h
mov a,24h
clr c
subb a,#2 ;四位密码
jz n3
ret
n3: lcall ring4
mov 24h,#0 ;清密码计数器
mov 25h,#1 ;建立密码结束标志
mov 21h,#0
mov 28h,#0 ;清新密码标志
mov 29h,#1 ;建立第二次输入新密码的标志
ret
new2:
mov a,29h ;判第二次输入的密码标志位
clr c
subb a,#1
jz nn1
ret
nn1: lcall ring3
mov a,21h ;有键按下标志
clr c
subb a,#1
jz nn2
ret
nn2:
mov a,24h ;新密码存于45h
add a,#44h
mov r0,a
mov @r0,50h
mov a,24h
clr c
subb a,#2 ;2位密码
jz nn3
ret
nn3: mov a,45h
clr c
subb a,40h
jnz cm
mov a,46h
clr c
subb a,41h
jnz cm
mov 21h,#0
mov 23h,#1 ;比较新密码标志
mov 24h,#0 ;清密码计数器
mov 25h,#1 ;建立密码结束标志
mov 29h,#0
ret
cm: lcall ring2
mov 27h,#1 ;两次输入密码比较不正确
;挂机
ret
save: mov a,23h
clr c
subb a,#1
jz s1
ret
s1: mov a,40h
mov 30h,a
mov a,41h
mov 31h,a
lcall ring4
lcall wr33
mov 21h,#0 ;按下键标志0
mov 22h,#0 ;选中第n个通道
mov 23h,#0 ;新密码存储标志0
mov 24h,#0 ;输入的密码位数
mov 27h,#0 ;挂机标志
mov 28h,#0 ;*输入新密码0(b)
mov 29h,#0 ;第二次输入新密码标志
ret
;*************************24c02*******************************
STA24:
SETB p0.7
SETB p0.6
NOP
NOP
CLR p0.7
NOP
NOP
CLR p0.6
RET
STOP: CLR p0.7
SETB p0.6
NOP
NOP
SETB p0.7
NOP
NOP
CLR p0.6
CLR p0.7
RET
WRBYTE: MOV R6,#08H ;写一字节数
WBLP1: CLR C
RLC A
MOV p0.7,C
SETB p0.6
NOP
NOP
CLR p0.6
CLR p0.7
DJNZ R6,WBLP1
NOP
SETB p0.7
SETB p0.6
WBLP2: NOP
JB p0.7,WBLP2
CLR p0.6
RET
RDBYTE: MOV R6,#08H ;读一字节数
RBLP: SETB p0.7
SETB p0.6
MOV C,p0.7
RLC A
CLR p0.6
NOP
DJNZ R6,RBLP
SETB p0.7
SETB p0.6
NOP
NOP
CLR p0.6
CLR p0.7
RET
WR33: ;lcall ring7
MOV R1,#33H ;写四个数子程序
MOV R2,#04H
LCALL STA24
; lcall ring3
MOV A,#0A0H
LCALL WRBYTE
;lcall ring4
MOV A,#00H
LCALL WRBYTE
WLP: MOV A,@R1
LCALL WRBYTE
DEC R1
DJNZ R2,WLP
LCALL STOP
RET
RD33: ;lcall ring8
MOV R1,#33H ;读四个数子程序
MOV R2,#04H
LCALL STA24
MOV A,#0A0H
LCALL WRBYTE
MOV A,#00H
LCALL WRBYTE
LCALL STA24
MOV A,#0A1H
LCALL WRBYTE
RLP: MOV R6,#08H
RLP1: SETB p0.7
SETB p0.6
CLR C
MOV C,p0.7
RLC A
CLR p0.6
NOP
DJNZ R6,RLP1
CJNE R2,#01H,RLP2
SETB p0.7
SETB p0.6
MOV @R1,A
NOP
NOP
CLR p0.6
CLR p0.7
AJMP RLP3
RLP2: CLR p0.7
SETB p0.6
MOV @R1,A
DEC R1
NOP
CLR p0.6
DJNZ R2,RLP
RLP3: LCALL STOP
RET
L_DELAY: MOV R7,#0CH ;延时50us
L0: DJNZ R7,L0
RET
M_DELAY: MOV R7,#06H ;延时25us
L1: DJNZ R7,L1
RET
S_DELAY: MOV R7,#02H ;延时8us
L2: DJNZ R7,L2
RET
ring1:
mov p2,#01h
clr p2.0
acall de2s
setb p2.0
ret
ring2:
mov p2,#15h
clr p2.0
acall de2s
setb p2.0
ret
ring3:
mov p2,#25h
clr p2.0
acall de2s
setb p2.0
ret
ring4:
mov p2,#37h
clr p2.0
acall de2s
setb p2.0
ret
ring5:
mov p2,#43h
clr p2.0
acall de2s
setb p2.0
ret
ring6:
mov p2,#59h
clr p2.0
acall de2s
setb p2.0
ret
ring7:
mov p2,#65h
clr p2.0
acall de2s
setb p2.0
ret
ring8:
mov p2,#75h
clr p2.0
acall de2s
setb p2.0
ret
de50ms: mov r6,#100
sd: mov r7,#248
djnz r7,$
djnz r6,sd
ret
de1s: mov r5,#10
de1: lcall de50ms
djnz r5,de1
ret
de2s: mov r5,#30
de2: lcall de50ms
djnz r5,de1
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -