📄 text1.asm
字号:
;********************************************
;********* 电子密码锁 *********
;********************************************
;********* 2008/6/10 *********
;********************************************
;显示缓冲区
LED1 EQU 6FH
BUFF EQU 6EH
TIMERS1 EQU 6DH ;输入回车的次数
TIMERS2 EQU 6CH ;报警的次数
LED6 EQU 6AH
;密码缓冲区
PS1 EQU 69H
PS2 EQU 78H
PS3 EQU 67H
PS4 EQU 66H
PS5 EQU 65H
PS6 EQU 64H
PS7 EQU 63H
PS8 EQU 62H
;AT24C02读取缓冲区
AT1 EQU 61H
AT2 EQU 60H
AT3 EQU 5FH
AT4 EQU 5EH
AT5 EQU 5DH
AT6 EQU 5CH
AT7 EQU 5BH
AT8 EQU 5AH
;按键标志位
F_0 BIT 20H
F_1 BIT 21H
F_2 BIT 22H
F_3 BIT 23H
F_4 BIT 24H
F_5 BIT 25H
F_6 BIT 26H
F_7 BIT 27H
F_8 BIT 28H
F_9 BIT 29H
CH_STATE BIT 2AH ;系统更改的状态标志位,为1表示busy
FLAG1 BIT 2BH ;功能键标志位,为1表示功能按键。
F_F1 BIT 2CH
F_F2 BIT 2DH
PSW_F BIT 2EH ;密码是否正确的标志位
;口资源定义
SPK BIT P2.1
WP BIT P3.5
SDA BIT P3.6 ;定义串口数据端
SCL BIT P3.7
ORG 0000H
AJMP MAIN
ORG 000BH
;AJMP TIMER0
ORG 001BH
;AJMP TIMER1
ORG 0030H
MAIN:MOV SP, #70H
MOV TMOD, #11H
MOV TH0, #3CH
MOV TL0, #0B0H
MOV TH1, #3CH
MOV TL1, #0B0H
CLR F_0 ;清除标志位
CLR F_1
CLR F_2
CLR F_3
CLR F_4
CLR F_5
CLR F_6
CLR F_7
CLR F_8
CLR F_9
CLR BUF_FULL
CLR CH_STATE
CLR FLAG1
CLR F_F1
CLR F_F2
CLR PSW_F
MOV BUFF,#00H ;调用
LCALL INITPS ;初始化环境
LCALL INITAT
LCALL XSA ;调用默认显示
MOV TIMERS1,#00H
NOP
MOV PS1, #11H ;初始化密码830620
MOV PS2, #0AH
MOV PS3, #02H
MOV PS4, #13H
MOV PS5, #0BH
MOV PS6, #02H
START:NOP ;程序开始
LCALL CH_KEY ;检查键盘
AJMP START ;返回
CH_KEY:LCALL KS ;检查有没有按键按下
JNZ LK1
AJMP CH_KEY
LK1:
LCALL T10MSD
ACALL KS
JNZ LK2
RET
LK2:
NOP
LCALL SBIE ;按键识别子程序
MOV BUFF, A ;送缓冲区以识别是数字键还是功能键?
LCALL CH_KF ;判断按键功能。
JB FLAG1 ,KEY_FUN ;标志为1,则为功能键
;***********数字按键输入并且存放到缓冲区内等待比较***********
KEY_DIG:NOP ;设一标志,辨别输入是否满
;SETB TR0
INC TIMERS ;输入数字的位数
MOV A, TIMERS
CLR C
SUBB A, #01H
JNZ PS_2
MOV PS1, BUFF ;依照顺序存放密码
AJMP NEXT
PS_2:MOV A, TIMERS
SUBB A, #02H
CLR C
JNZ PS_3
MOV PS2, BUFF
AJMP NEXT
PS_3:MOV A, TIMERS
CLR C
SUBB A, #03H
JNZ PS_4
MOV PS3, BUFF
AJMP NEXT
PS_4:MOV A, TIMERS
CLR C
SUBB A, #04
JNZ PS_5
MOV PS4, BUFF
AJMP NEXT
PS_5:MOV A, TIMERS
CLR C
SUBB A, #05
JNZ PS_6
MOV PS5, BUFF
AJMP NEXT
PS_6:MOV A, TIMERS
CLR C
SUBB A, #06H
JNZ CH_KEY
MOV PS6, BUFF
NEXT:LCALL XSC
MOV R7, TIMERS ;比较输入的次数。
CJNE R7, #06H ,FULL
FULL:JC NEXT9
SETB BUF_FULL
MOV TIMERS1,#06H
CLR L3
NOP
CLR P2.1
LCALL T100MSD
SETB P2.1
NOP
AJMP CH_KEY
NEXT9:CLR P2.1 ;密码输入一位,鸣叫一声。
CLR L3
LCALL T100MSD ;延时100ms
SETB L3
SETB P2.1
AJMP CH_KEY
;***************开门子程序 ********************************
CL:NOP
SETB L3
MOV BUFF, #00H ;消密码缓冲
MOV TIMERS,#00H
LCALL INITPS ;消除AT缓冲,调电存储后一定要加上
LCALL XSC
LCALL BP
LCALL BP
LCALL T100MSD
LCALL BP
CLR FLAG1
AJMP CH_KEY
FU4:NOP
LCALL BP
LCALL T100MSD
LCALL BP
LCALL T100MSD
LCALL BP
LCALL T100MSD
LCALL BP
LCALL T100MSD
LCALL BP
CLR FLAG1
AJMP CH_KEY
FU3:NOP
LCALL BP
LCALL T100MSD
LCALL BP
LCALL KILLXS ;关闭显示
CLR FLAG1
AJMP CH_KEY
FU1:NOP
LCALL XSC
JB F_F1, NEXT_F1
CLR TL1
LCALL BP
SETB F_F1
AJMP CH_KEY
NEXT_F1:SETB TL1
LCALL BP
CLR F_F1
;LCALL CH_STATE ;查看现在的状态以防误按
;SETB TR1 ;报警限制暂时不开
;INC F_F1
CLR FLAG1
AJMP CH_KEY
FU2:NOP
JB F_F2, NEXT_F2
CLR L2
LCALL BP
SETB F_F2
AJMP CH_KEY
NEXT_F2:SETB L2
LCALL BP
CLR F_F2
CLR FLAG1
AJMP CH_KEY
;**************各类子程序********************************
;**** 注意清楚缓冲区时AT1...AT8不应在初始化中执行,以 ***
;**** 防两缓冲区都为0,相同开锁 ***
;********************************************************
CLR_BUF:MOV R7, #06H
MOV R0, #6FH
LOOP1:MOV A, #00H
MOV @R0, A
DEC R0
DJNZ R7,LOOP1
RET
;*************初始化显示缓冲区以及其他缓冲区**************
INITPS:PUSH ACC
PUSH PSW
MOV R7, #06H
MOV R1, #PS1
MOV A, #00H
INIT_PS:MOV @R1, A
DEC R1
DJNZ R7, INIT_PS
POP PSW
POP ACC
NOP
RET
INITAT:PUSH ACC
PUSH PSW
MOV R7,#06H
MOV R1,#AT1
MOV A, #00H
INIT_AT:MOV @R1, A
DEC R1
DJNZ R7, INIT_AT
MOV TIMERS1,#00H ;密码输入的次数清零。
POP PSW
POP ACC
RET
;****************检验密码正误******************************
C_PSW:PUSH PSW
PUSH ACC
MOV R2,#06H
MOV R0,#PS1
MOV R1,#AT1
C_P:CLR C
MOV A,@R0
SUBB A,@R1
JNZ RETURN
DEC R0
DEC R1
DJNZ R2,C_P
NOP
SETB PSW_F
AJMP EXIT7
RETURN:CLR PSW_F
EXIT7:NOP
POP ACC
POP PSW
RET
;×××××××××××××××××锁定,鸣笛子程序××××××××××××
LOCK_1M:MOV R4,#3CH ;锁定1分钟
M1_LOOP:LCALL SEC
DJNZ R4,M1_LOOP
NOP
RET
WARN2S:PUSH PSW
PUSH ACC
MOV R5, #14H ;调用20次BP,报警2s
WARN:LCALL BP
DJNZ R5,WARN
NOP
POP ACC
POP PSW
NOP
RET
BP:CLR SPK ;鸣笛子程序
LCALL T100MSD
SETB SPK
NOP
RET
;***************************
;***** 显示子程序 ********
;***************************
;锁定状态显示。
XSA:PUSH ACC
PUSH PSW
MOV A, TIMERS1
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV SBUF, A ;送已经输入密码的次数
JNB TI, $
CLR TI
MOV SBUF, #0FEH ;送短线
JNB TI, $
CLR TI
MOV SBUF, #0FEH ;送短线
JNB TI, $
CLR TI ;送F
MOV SBUF, #78H
JNB TI, $
CLR TI
MOV SBUF, #78H
JNB TI, $
CLR TI
MOV SBUF, #11H
JNB TI, $
CLR TI
POP PSW
POP ACC
RET
;成功开锁状态显示
XSB:PUSH ACC
PUSH PSW
MOV A, TIMERS1
MOV DPTR, #TAB
MOVC A, @A+DPTR
MOV SBUF, A
JNB TI, $
CLR TI
MOV SBUF, #0FEH
JNB TI, $
CLR TI
MOV SBUF, #0FEH
JNB TI, $
CLR TI
MOV SBUF, #10H
JNB TI, $
CLR TI
MOV SBUF, #10H
JNB TI, $
CLR TI
MOV SBUF, #10H
JNB TI, $
CLR TI
POP PSW
POP ACC
RET
;密码输入及修改状态
XSC:PUSH ACC
PUSH PSW
LCALL KILLXS
SETB RS1 ;切换到第三组寄存器。防止操作数读取错误。
MOV R6, TIMERS1
MOV A, R6
SUBB A, #01H
JNC SC0
JZ SC1
SC0:MOV SBUF, #0FEH
JNB TI, $
CLR TI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -