电子密码锁程序
定义状态灯 L1 BIT P1.0 L2 BIT P1.1 L3 BIT P1.2 ;p1.3串口坏 L4 BIT P1.4 L5 BIT P1.5 l6 BIT P1.6 Buzzer BIT P1.7 ;蜂鸣器 状态位定义20H~30H LOG_IN BIT 20H MODI_Password BIT 21H MODI1 BIT 23H MODI2 BIT 24H MODI_Success BIT 25H Correct_Password BIT 26H 密码缓存区 PW1 EQU 30H PW2 EQU 31H PW3 EQU 32H PW4 EQU 33H PW5 EQU 34H PW6 EQU 35H LED数码管显示缓存区 SHOW1 EQU 36H SHOW2 EQU 37H SHOW3 EQU 38H SHOW4 EQU 39H SHOW5 EQU 3AH SHOW6 EQU 3BH ;进入系统 ;修改密码 ;修改密码第二次输入 ;密码修改成功 ;功能键,0进入系统,1修改密码 ;1~6位密码 键盘输入密码暂时缓存区 PW_TEMP1 EQU 3DH PW_TEMP2 EQU 3EH PW_TEMP3 EQU 3FH PW_TEMP4 EQU 40H PW_TEMP5 EQU 41H PW_TEMP6 EQU 42H 修改密码时,原密码暂时缓存区 MODI_PW1 EQU 43H MODI_PW2 EQU 44H MODI_PW3 EQU 45H MODI_PW4 EQU 46H MODI_PW5 EQU 47H
计数 Password_NUM EQU 3CH 主程序 ORG 0000H AJMP MAIN ORG 000BH AJMP TIMER ORG 0013H AJMP INT1P ORG 0030H MOV SP,#60H ;开中断 SETB EX1 SETB L1 SETB L2 SETB L3 SETB L4 SETB L5 SETB L6 ;初始化清零 CLR LOG_IN CLR MODI_Password CLR MODI1 CLR MODI2 CLR MODI_Success CLR Correct_Password ;初始化密码 112211 MOV PW1,#01H MOV PW2,#01H MOV PW3,#02H MOV PW4,#02H MOV PW5,#01H MOV PW6,#01H ;初始化显示CHOOSE MOV SHOW1,#0EH MOV SHOW2,#05H MOV SHOW3,#00H MOV SHOW4,#00H MOV SHOW5,#12H ;输入密码的位数 MAIN
;计数初始化 MOV Password_NUM,#00H ;初始化8279 LCALL INIT_8279 SJMP $
8279键盘
INIT_8279
MOV DPTR,#5FFFH
MOV A,#0DCH
MOVX @DPTR,A
JUMP1 MOVX A,@DPTR
JB ACC.7,JUMP1
MOV A,#00H
MOVX @DPTR,A
MOV A,#34H
MOVX @DPTR,A
CLR IT1
NOP
SETB EA
NOP
LCALL DSY
RET
外部中断1
INT1P PUSH ACC
PUSH DPH
PUSH DPL
MOV A,#40H
MOV DPTR,#5FFFH
MOVX @DPTR,A
MOV DPTR,#5EFFH
MOVX A,@DPTR
显示缓存
MOV 3BH,3AH
MOV 3AH,39H
MOV 39H,38H
MOV 38H,37H
MOV 37H,36H
MOV 36H,A
键盘输入密码缓存
统
存
;检查当前选择的功能 输入原密码进入系统 CLR C MOV C,LOG_IN JNC JUMP3 ;进入系统状态为1,选择功能A,输入密码进入系;不是功能A,跳转,是功能A顺序执行,对密码缓改变指示灯110001,1:亮,0不亮 CLR L1 CLR L2 SETB L3 SETB L4 SETB L5 CLR L6
保存键盘输入的密码
MOV PW_TEMP1,PW_TEMP2
MOV PW_TEMP2,PW_TEMP3
MOV PW_TEMP3,PW_TEMP4
MOV PW_TEMP4,PW_TEMP5
MOV PW_TEMP5,PW_TEMP6
MOV PW_TEMP6,A
AJMP JUMP4 ;跳过功能B
修改密码的操作,a.验证原密码,b.输入要修改的新密码,c.验证要修改的新密码
JUMP3 CLR C
改密码
MOV C,MODI_Password ;修改密码状态为1,选择修改密码,输入原密码即可修JNC JUMP12 ;不是功能A,不是修改密码验证原密码 改变指示灯110100,1:亮,0不亮 CLR L1 CLR L2 SETB L3 CLR L4 SETB L5 SETB L6 保存键盘输入的密码 MOV PW_TEMP1,PW_TEMP2 MOV PW_TEMP2,PW_TEMP3 MOV PW_TEMP3,PW_TEMP4 MOV PW_TEMP4,PW_TEMP5 MOV PW_TEMP5,PW_TEMP6 MOV PW_TEMP6,A AJMP JUMP4 ;跳过修改密码时的原密码验证缓存
JUMP12
CLR C MOV C,MODI1 JNC JUMP13 ;输入要修改的新密码状态为1,选择输入修改密码
改变指示灯110001,1:亮,0不亮
CLR L1
SETB L2
SETB L3
SETB L4
CLR L5
SETB L6
保存键盘输入的密码
MOV PW_TEMP1,PW_TEMP2
MOV PW_TEMP2,PW_TEMP3
MOV PW_TEMP3,PW_TEMP4
MOV PW_TEMP4,PW_TEMP5
MOV PW_TEMP5,PW_TEMP6
MOV PW_TEMP6,A
AJMP JUMP4 ;跳过修改密码时的原密码验证缓存 JUMP13 CLR C
MOV C,MODI2
JNC JUMP4
改变指示灯110101,1:亮,0不亮
CLR L1
CLR L2
SETB L3
CLR L4
SETB L5
CLR L6
保存键盘输入的密码
MOV PW_TEMP1,PW_TEMP2
MOV PW_TEMP2,PW_TEMP3
MOV PW_TEMP3,PW_TEMP4
MOV PW_TEMP4,PW_TEMP5
MOV PW_TEMP5,PW_TEMP6
MOV PW_TEMP6,A
AJMP JUMP4 ;跳过修改密码时的原密码验证缓存 JUMP4 LCALL Key_Check 密码检验,检查密码是否为0~9 NOP
LCALL DSY
设置定时器
MOV R5,#60
MOV TMOD,#01H
MOV TH0,#3CH
SETB ET0 SETB TR0 POP DPL POP DPH POP ACC RETI
时延1s
DELAY1s MOV R3,#0FH
DL13 MOV R4,#0FAH
DL12 MOV R5,#0F6H;
DL11
DJNZ R5,DL11 ;时延246us DJNZ R4,DL12 ;(246+4)250=62500us DJNZ R3,DL13 ;6250016=1s RET
时延3s
DELAY3s MOV R3,#2FH
DL33 MOV R4,#0FAH
DL32 MOV R5,#0F6H;
DL31
DJNZ R5,DL31 ;时延246us DJNZ R4,DL32 ;(246+4)250=62500us DJNZ R3,DL33 ;6250016=1s RET
LED数码管显示程序
DSY MOV R2,#06H
MOV A,#92H
MOV DPTR,#5FFFH
MOVX @DPTR,A
MOV R0,#36H
TY11 MOV A,@R0
MOV DPTR,#TABL
MOVC A,@A+DPTR
MOV DPTR,#5EFFH
MOVX @DPTR,A
INC R0
DJNZ R2,TY11
RET
密码检验0~9
Key_Check
;检查当前选择的功能
FUNC_A
Correct
JUMP16
MOV C,LOG_IN ;进入系统状态为1,选择功能A,输入密码进入系统 JNC FB NOP 功能A,进入系统 ;计数,密码输入位数 MOV A,Password_NUM INC A MOV Password_NUM,A NOP CJNE A,#06H,JUMP5 CLR LOG_IN LCALL Password_Verity CLR C MOV C,Correct_Password JC Correct AJMP JUMP16 改变指示灯110010,1:亮,0不亮 CLR L1 CLR L2 SETB L3 SETB L4 CLR L5 SETB L6 LED数码管显示 MOV SHOW1,#0EH MOV SHOW2,#05H MOV SHOW3,#00H MOV SHOW4,#00H MOV SHOW5,#12H MOV SHOW6,#0CH LCALL DSY 状态位清零 CLR LOG_IN CLR MODI_Password CLR MODI1 CLR MODI2 CLR MODI_Success CLR Correct_Password AJMP JUMP7 LCALL Long_Buzzer 改变指示灯110110,1:亮,0不亮
JUMP5
FB
FUNC_B
JUMP6 CLR L2 CLR L3 SETB L4 CLR L5 SETB L6 LED显示ERR002 MOV SHOW1,#02H MOV SHOW2,#00H MOV SHOW3,#00H MOV SHOW4,#0AH MOV SHOW5,#0AH MOV SHOW6,#0EH LCALL DSY AJMP JUMP7 CLR C MOV C,MODI_Password ;修改密码状态为1,选择功能B,输入密码修改密码JNC FUNC_MODI1 NOP 功能B,修改密码 MOV A,Password_NUM INC A MOV Password_NUM,A NOP CJNE A,#06H,JUMP6 LCALL Password_Verity CLR C MOV C,Correct_Password JNC again1 LCALL Short_Buzzer 改变指示灯110110,1:亮,0不亮 CLR L1 CLR L2 SETB L3 CLR L4 CLR L5 SETB L6 CLR MODI_Password SETB MODI1 ;密码正确,进行第一次输入修改密码 AJMP JUMP7
again1
密码错误重新输入密码 MOV Password_NUM,#00H SETB MODI_Password 改变指示灯110110,1:亮,0不亮 CLR L1
CLR L2
CLR L3
SETB L4
SETB L5
CLR L6
LED显示ERR002
MOV SHOW1,#02H
MOV SHOW2,#00H
MOV SHOW3,#00H
MOV SHOW4,#0AH
MOV SHOW5,#0AH
MOV SHOW6,#0EH
LCALL DSY
AJMP JUMP7
FUNC_MODI1 CLR C
MOV C,MODI1
修改密码
JNC FUNC_MODI2
NOP
第一次输入新密码
LCALL Modify
AJMP JUMP7
FUNC_MODI2 CLR C
MOV C,MODI2
修改密码
JNC NEXT_A
NOP
第二次输入新密码
LCALL Modi_Verity
AJMP JUMP7
功能选择
NEXT_A CJNE A,#0AH,NEXT_B
SETB LOG_IN
AJMP JUMP7
NEXT_B CJNE A,#0BH,NEXT_C
SETB MODI_Password ;第一次输入修改密码状态,选择功能B2,第二次输入;第一次输入修改密码状态,选择功能B2,第二次输入;选择进入系统 ;选择修改密码
NEXT_C NEXT_D NEXT_E NEXT_F
RESET AJMP JUMP7 CJNE A,#0CH,NEXT_D AJMP RESET 未定义的功能,选择会出现警告 CJNE A,#0DH,NEXT_E AJMP WARN1 CJNE A,#0EH,NEXT_F AJMP WARN1 CJNE A,#0FH,WARN1 AJMP WARN1
复位,密码初始化呢,状态位初始化,显示初始化 ;初始化清零 CLR LOG_IN CLR MODI_Password CLR MODI1 CLR MODI2 CLR MODI_Success CLR Correct_Password ;初始化密码 112211 MOV PW1,#01H MOV PW2,#01H MOV PW3,#02H MOV PW4,#02H MOV PW5,#01H MOV PW6,#01H ;初始化显示CHOOSE MOV SHOW1,#0EH MOV SHOW2,#05H MOV SHOW3,#00H MOV SHOW4,#00H MOV SHOW5,#12H MOV SHOW6,#0CH ;计数初始化 MOV Password_NUM,#00H AJMP JUMP7 数码管显示ERR001 MOV SHOW1,#01H MOV SHOW2,#00H WARN1
MOV SHOW4,#0AH MOV SHOW5,#0AH MOV SHOW6,#0EH LCALL DSY 蜂鸣器响,重新选择功能 LCALL Long_Buzzer MOV SHOW1,#0EH MOV SHOW2,#05H MOV SHOW3,#00H MOV SHOW4,#00H MOV SHOW5,#12H MOV SHOW6,#0CH
状态位清零
CLR LOG_IN
CLR MODI_Password
CLR MODI1
CLR MODI2
CLR MODI_Success
CLR Correct_Password
JUMP7 RET
密码校验,与原密码是否一样
Password_Verity
计数清零 MOV Password_NUM,#00H 密码校验 CLR C MOV A,PW_TEMP1 SUBB A,PW1 JNZ JUMP8 CLR C MOV A,PW_TEMP2 SUBB A,PW2 JNZ JUMP8 CLR C MOV A,PW_TEMP3 SUBB A,PW3 JNZ JUMP8 CLR C
SUBB A,PW4 JNZ JUMP8 CLR C MOV A,PW_TEMP5 SUBB A,PW5 JNZ JUMP8 CLR C MOV A,PW_TEMP6 SUBB A,PW6 JNZ JUMP8
SETB Correct_Password ;密码全对
RET
保存修改的密码
MOV A,Password_NUM
INC A
MOV Password_NUM,A
NOP
CJNE A,#06H,JUMP9
完成6位密码输入
改变指示灯101010,1:亮,0不亮
CLR L1
SETB L2
CLR L3
SETB L4
CLR L5
SETB L6
CLR MODI1 ;第一次修改密码输入完成
SETB MODI2 ;第二次输入修改密码
MOV Password_NUM,#00H
暂时保存原密码,修改密码出现错误,为系统回复原密码 MOV MODI_PW1,PW1
MOV MODI_PW2,PW2
MOV MODI_PW3,PW3
MOV MODI_PW4,PW4
MOV MODI_PW5,PW5
MOV MODI_PW6,PW6
为新密码送入密码缓存区
MOV PW1,PW_TEMP1
MOV PW2,PW_TEMP2 JUMP8 Modify
JUMP9
Modi_Verity
MOV PW4,PW_TEMP4 MOV PW5,PW_TEMP5 MOV PW6,PW_TEMP6 RET MOV A,Password_NUM INC A MOV Password_NUM,A NOP CJNE A,#06H,JUMP14 校验两次输入的新密码是否一样 CLR Correct_Password LCALL Password_Verity AJMP JUMP15
JUMP14 AJMP JUMP11 ;结束子程序
JUMP15 CLR C
MOV C,Correct_Password
JNC JUMP10
修改密码正确,初始化状态位 CLR LOG_IN CLR MODI_Password CLR MODI1 CLR MODI2 CLR Correct_Password SETB MODI_Success ;修改密码成功状态位 改变指示灯111111,1:亮,0不亮 CLR L1 CLR L2 CLR L3 CLR L4 CLR L5 CLR L6 LED显示 MOV SHOW1,#06H MOV SHOW2,#06H MOV SHOW3,#06H MOV SHOW4,#06H MOV SHOW5,#06H MOV SHOW6,#06H LCALL DSY
出现错误,标志位清零 CLR LOG_IN CLR MODI_Password CLR MODI1 CLR MODI2 CLR MODI_Success CLR Correct_Password JUMP10 改变指示灯110110,1:亮,0不亮 CLR L1 CLR L2 CLR L3 SETB L4 CLR L5 CLR L6 提示ERR003 MOV SHOW1,#03H MOV SHOW2,#00H MOV SHOW3,#00H MOV SHOW4,#0AH MOV SHOW5,#0AH MOV SHOW6,#0EH 密码修改出现错误,复原原密码 MOV PW1,MODI_PW1 MOV PW2,MODI_PW2 MOV PW3,MODI_PW3 MOV PW4,MODI_PW4 MOV PW5,MODI_PW5 MOV PW6,MODI_PW6 LCALL DSY RET JUMP11
鸣笛
Long_Buzzer
MOV R3,#1FH
BL13 MOV R4,#0FAH
CLR Buzzer
BL12 MOV R5,#0F6H;
BL11 DJNZ R5,BL11 ;时延246us
DJNZ R4,BL12 ;(246+4)250=62500us SETB Buzzer
DJNZ R3,BL13 ;6250016=1s
RET
RET
Short_Buzzer
BS13
BS12
BS11
TIMER
MOV R3,#0FH MOV R4,#0FAH CLR Buzzer MOV R5,#0F6H; DJNZ R5,BS11 ;时延246us DJNZ R4,BS12 ;(246+4)250=62500us SETB Buzzer DJNZ R3,BS13 ;6250016=1s RET RET 定时器终端程序 MOV TH0,#3CH MOV TL0,#0B0H DJNZ R5,LOOP
3S内没有按按键
LCALL Short_Buzzer ;初始化清零
CLR LOG_IN
CLR MODI_Password CLR MODI1
CLR MODI2
CLR MODI_Success CLR Correct_Password ;初始化显示CHOOSE MOV SHOW1,#0EH MOV SHOW2,#05H MOV SHOW3,#00H MOV SHOW4,#00H MOV SHOW5,#12H MOV SHOW6,#0CH ;计数初始化
MOV Password_NUM,#00H LOOP RETI
TABLE表
TABL DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H,82H,0F8H,80H,90H,88H DB 83H,0C6H,0A1H,86H,8EH,8CH
DB 0C1H,89H,0C7H,0BFH,91H DB 00H,0FFH
END