?? 電子密碼鎖程序20051230.asm
字號:
;********************************************
;********* 電子密碼鎖 *********
;********************************************
;********* 2005/12/24 *********
;********************************************
;顯示緩沖區
;LED1 EQU 6FH
BUFF EQU 6EH
TIMERS1 EQU 6DH ;輸入回車的次數
TIMERS2 EQU 6CH ;報警的次數
TIMERS EQU 6BH ;輸入數字的位數
;LED6 EQU 6AH
;密碼緩沖區
PS1 EQU 69H
PS2 EQU 68H
PS3 EQU 67H
PS4 EQU 66H
PS5 EQU 65H
PS6 EQU 64H
;AT24C02讀取緩沖區
AT1 EQU 63H
AT2 EQU 62H
AT3 EQU 61H
AT4 EQU 60H
AT5 EQU 5FH
AT6 EQU 5EH
;按鍵標志位
F_1 BIT 20H
F_2 BIT 21H
F_3 BIT 22H
F_4 BIT 23H
BUF_FULL BIT 24H ;密碼已經夠六位的標志位,為1表示滿
CH_STATE BIT 25H ;系統更改的狀態標志位,為1表示busy
FLAG1 BIT 26H ;功能鍵標志位,為1表示功能按鍵。
F_F1 BIT 27H
F_F2 BIT 28H
PSW_F BIT 29H ;密碼是否正確的標志位
;口資源定義
SPK BIT P2.1
JDQ BIT P2.3
SDA BIT P2.4 ;定義串口數據端
SCL BIT P2.5
;發光二極管燈
L1 BIT P1.0
L2 BIT P1.1
L3 BIT P1.2
;
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_1 ;清除標志位
CLR F_2
CLR F_3
CLR F_4
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 T12MS
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 TIMERS,#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
;*****************功能按鍵比較并且跳轉*************
KEY_FUN:
CLR FLAG1
CLR C
MOV A, BUFF
SUBB A, #03H ;按鍵CL跳轉
JNZ EN_C
AJMP CL
EN_C:CLR C
MOV A, BUFF ;按鍵EN跳轉
SUBB A, #00H
JNZ F1_C
AJMP EN
F1_C:CLR C
MOV A, BUFF
SUBB A, #1BH
JNZ F2_C
AJMP FU1
F2_C:CLR C
MOV A, BUFF
SUBB A, #1AH
JNZ F3_C
AJMP FU2
F3_C:CLR C
MOV A, BUFF
SUBB A, #19H
JNZ F4_C
AJMP FU3
F4_C:CLR C
MOV A, BUFF
SUBB A, #18H
JZ FU4
EXIT8:NOP
LJMP 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 L1
LCALL BP
SETB F_F1
AJMP CH_KEY
NEXT_F1:SETB L1
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
;***************按鍵的功能描述*************************
EN:NOP
JB BUF_FULL, GOON
AJMP EXIT
GOON:CLR BUF_FULL
JB F_F2, AT_WRON ;F2按鍵標志,若為1,則調用修改密碼子程序。
LCALL AT_RADE
LCALL C_PSW ;比較密碼子程序
JB PSW_F,OPEN ;密碼比較正確,則調用開鎖子程序
LCALL XSD
INC TIMERS2
MOV R7,TIMERS2 ;密碼錯誤,調入輸入密碼輸入次數,準備鎖定鍵盤
CJNE R7,#03H,D0
D0:JC NEXT1 ;錯誤次數小3次
LCALL XSE ;鎖定5分鐘
LCALL WARN2S
LCALL LOCK_1M
NEXT1:LCALL WARN2S ;報警2分鐘
LCALL XSA
EXIT:LCALL INITPS
MOV BUFF, #00H
CLR FLAG1
MOV TIMERS, #00H
AJMP CH_KEY ;跳出
AT_WRON:LCALL AT_WR
LCALL XSF
LCALL BP
LCALL T100MSD
LCALL BP
LCALL T500MSD
LCALL KILLXS
LCALL T500MSD
LCALL XSF
LCALL T500MSD
LCALL KILLXS
LCALL T500MSD
LCALL XSF
LCALL T500MSD
NOP
NOP
LCALL XSA
AJMP EXIT
OPEN:MOV A, TIMERS1
CJNE A, #09H,CLT1
CLT1:JC GOON1
MOV TIMERS1,#00H
GOON1:INC TIMERS1 ;輸入回車的次數
MOV TIMERS2,#00H
SETB L3
CLR PSW_F
LCALL XSB
CLR JDQ ;開門
LCALL BP
LCALL BP
LCALL BP
LCALL BP
LCALL SEC
LCALL SEC
LCALL SEC
LCALL SEC
LCALL SEC
LCALL SEC
LCALL SEC
LCALL SEC
SETB JDQ
LCALL XSA
NOP
AJMP EXIT
;**************各類子程序********************************
;**** 注意清楚緩沖區時AT1...AT6不應在初始化中執行,以 ***
;**** 防兩緩沖區都為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 TIMERS,#00H ;密碼輸入的次數清零。
POP PSW
POP ACC
RET
;************* 按鍵識別子程序 ***************************
SBIE:MOV R2, #0EFH ;識別按鍵子程序,數據送A保存,課本P146頁。
MOV R4, #00H
LK4:MOV A, R2
MOV P0, A
NOP
MOV A, P0
JB ACC.0,LONE
MOV A, #00H
AJMP LKP
LONE:JB ACC.1,LTWO
MOV A, #08H
AJMP LKP
LTWO:JB ACC.2,LTHR
MOV A, #10H
AJMP LKP
LTHR:JB ACC.3,NEXTT ;判斷下一列
MOV A, #18H
LKP:ADD A, R4
PUSH ACC
LK3:ACALL KS
JNZ LK3
POP ACC
RET
NEXTT:INC R4
MOV A, R2
JNB ACC.7,KND
RL A
MOV R2, A
AJMP LK4
KND:AJMP CH_KEY
KS:MOV P0, #0FH
NOP
MOV A, P0
CPL A
ANL A, #0FH
NOP
RET
CH_KF:CLR C
MOV A, BUFF ;判斷是數字按鍵還是功能按鍵,為1表示功能鍵
CJNE A, #17H, KY
KY:JC SET_CH ;假若是數字按鍵則標志置為0
SETB FLAG1 ;假若是功能按鍵則標志置為1
AJMP CHKE_END
SET_CH:CLR C
MOV A, BUFF
SUBB A, #00H
JNZ EN_CH
SETB FLAG1
AJMP CH_END
EN_CH:MOV A, BUFF
SUBB A, #03H
JNZ DIG
SETB FLAG1
AJMP CH_END
DIG:CLR FLAG1
CH_END:NOP
CHKE_END:RET
T12MS:MOV R7, #18H
TM1:MOV R6, #0FFH
TM66:DJNZ R6, TM66
DJNZ R7, TM1
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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -