?? 總程序.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 + -