简介
利用CPU芯片 8086、并行接口8255A、译码器74138、锁存器74HC373等设计一个多功能密码锁。通过8255A读取键盘电平获得输入密码,与预设密码比较,进而实现开锁、报错功能,并控制数显管和指示灯做出相应变化。还可实现密码修改功能。
课程设计使用Proteus7.8绘制电路图,使用EMU8086编译汇编程序,并将编译生产exe可执行文件挂载到Proteus,进行联合调试。
设计方案
设计思路
用数显管显示表示键盘输入数字及相应状态,通过LED的亮灭和扬声器表示密码是否正确,用键盘的电平编码表示密码。其中数显管连接8255A的A端口,键盘连接B端口和C端低四位,LED和扬声器连接C端高四位中的两位。
(1)密码锁开始运行,通过长按确认键进入开锁流程,或长按修改键进入修改流程。
(2)扫描获取C端口和B端口的电平,逐次比较哪个引脚为低电平确定按下的是哪个键。扫描六次可得六位密码。
(3) 4*3键盘分别为0-9九个按钮和确认键、修改键,当按下数字键时,数显管会显示该数字。
(4)将输入所得密码与程序预设密码进行逐位比较。密码正确则通过写入8255端口电平使绿色LED亮,数显管显示“00”字样;密码不正确则使红色LED灯亮和数显管显示“FF”字样,扬声器短鸣。
(5)当密码错误次数达到六次,则红色LED灯亮,数显管显示“EE”字样,扬声器长鸣。
(6)将输入所得密码写入预设密码的地址,实现密码修改。
(7)开锁流程中输入密码时数显管显示下划线 “_”,修改流程中输入密码会显示上划线,以便提醒用户密码锁工作状态。
硬件连接图
程序清单
;password.asm
IOA EQU 8000H ;8255A端口A地址
IOB EQU 8002H ;8255A端口B地址
IOC EQU 8004H ;8255A端口C地址
IOCON EQU 8006H ;8255A控制寄存器地址
DATA SEGMENT
NUM DB 00H ;记录密码错误次数,起始为零
PWO DB 01H,02H,03H,04H,05H,06H ;初始密码为123456
PW DB 6 DUP(0) ;记录密码
FG DB 00H ;标识,0为开锁,1为修改密码
DATA ENDS
STACK1 SEGMENT
DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK1
START:
MOV AX, DATA
MOV DS, AX
MOV DX, IOCON
MOV AL, 83H ;初始化8255A,方式0,A、C上部输出,B、C下部输入
OUT DX, AL
MOV NUM, 00H ;错误次数初始为零
STATE:
MOV DX, IOC ;初始LED灭,扬声器不发声
MOV AL, 0FH
OUT DX, AL
MOV DX, IOA ;数显管显示“--”闪烁
MOV AL, 40H
OUT DX, AL
CALL DALLY
MOV AL, 00H
OUT DX, AL
CALL DALLY
MOV DX, IOC ;循环读取确认键或开锁键按下
IN AL, DX
AND AL, 0CH
CMP AL, 0CH
JZ STATE
CMP AL, 04H
JZ KENTER ;按确认件进入开锁流程
CMP AL, 08H
JZ KMOD ;按修改键进入修改流程
KENTER:
MOV FG, 00H ;标识设为0,表明开锁
LOOPSET:MOV DX, IOA ;显示下划线
MOV AL, 08H
OUT DX, AL
MOV CX,6 ;循环六次,读六位密码
MOV DI,OFFSET PW
LOOP1:CALL INPUT ;将六位密码写入PW
MOV [DI], AH
INC DI
MOV DX, IOA
MOV AL, 08H
OUT DX, AL
LOOP LOOP1
CP: LEA SI, PWO ;将PW与PWO串比较
LEA DI, PW
MOV CX, 06H
CLD
REPE CMPSB
JZ RIGHT ;密码正确跳转
JNZ ERROR ;密码错误跳转
KMOD:
MOV FG, 01H ;标识设为0,表明修改密码
MOV DX, IOA ;显示上划线
MOV AL, 01H
OUT DX, AL
CALL DALLY
MOV NUM, 00H ;设错误次数为零
JMP LOOPSET ;跳转至从键盘获取密码
RMODSET:MOV DX, IOA
MOV AL, 01H
OUT DX, AL
CALL DALLY
MOV CX,6
MOV SI,OFFSET PWO ;获取PWO偏移地址
RMOD:CALL INPUT ;将AH送入PWO
MOV [SI], AH
INC SI
MOV DX, IOA ;显示上划线
MOV AL, 01H
OUT DX, AL
LOOP RMOD ;循环六次
JMP STATE ;改完密码跳回起始
RIGHT: ;输入正确流程
MOV DX, IOC ;绿灯亮
MOV AL, 1FH
OUT DX, AL
MOV DX, IOA
MOV AL, 3FH ;显示“00”
OUT DX, AL
MOV NUM, 0
CALL DALLY
CALL DALLY
CMP FG, 00H ;判断开锁还是改码
JZ QUIT ;跳至结束
JNZ RMODSET ;跳至改码
ERROR: ;输入错误流程
MOV DX, IOA ;显示“FF”
MOV AL, 71H
OUT DX, AL
MOV DX, IOC ;红灯亮,扬声器短鸣
MOV AL, 2FH
OUT DX, AL
CALL DALLY
ADD NUM, 01H ;错误次数加1
CMP NUM, 06H ;判断错误次数是否等于
JZ ALARM ;相等则跳至报警流程
JNZ KENTER ;不相等则继续输入
ALARM: ;报警流程
MOV DX, IOA ;显示“EE”
MOV AL, 79H
OUT DX, AL
MOV DX, IOC ;红灯亮,扬声器短鸣
MOV AL, 2FH
OUT DX, AL
CALL DALLY
CALL DALLY
JMP QUIT ;跳至结束程序
INPUT PROC NEAR ;从键盘获取密码子程序
L1: MOV DX, IOC ;扫描C口
IN AL, DX
MOV AH, AL
AND AH, 0FH ;C高四位置零,低四位不变
CMP AH, 0DH ;与9键的扫描电平比较
JZ K9
CMP AH, 0EH ;与8键的扫描电平比较
JZ K8
L2: MOV DX, IOB ;扫描A口
IN AL, DX
CMP AL, 0FEH ;与0键的扫描电平比较,下同
JZ K0
CMP AL, 0FDH
JZ K1
CMP AL, 0FBH
JZ K2
CMP AL, 0F7H
JZ K3
CMP AL, 0EFH
JZ K4
CMP AL, 0DFH
JZ K5
CMP AL, 0BFH
JZ K6
CMP AL, 7FH
JZ K7
JNZ L1
K9: MOV DX, IOA ;按下9键显示“9”
MOV AL, 6FH
OUT DX, AL
MOV AH, 09H ;将9送给AH
CALL DALLY
JMP R1 ;跳至子程序结束
K8: MOV DX, IOA ;类似K9
MOV AL, 7FH
OUT DX, AL
MOV AH, 08H
CALL DALLY
JMP R1
K7: MOV DX, IOA
MOV AL, 07H
OUT DX, AL
MOV AH, 07H
CALL DALLY
JMP R1
K6: MOV DX, IOA
MOV AL, 7DH
OUT DX, AL
MOV AH, 06H
CALL DALLY
JMP R1
K5: MOV DX, IOA
MOV AL, 6DH
OUT DX, AL
MOV AH,05H
CALL DALLY
JMP R1
K4: MOV DX, IOA
MOV AL, 66H
OUT DX, AL
MOV AH, 04H
CALL DALLY
JMP R1
K3: MOV DX, IOA
MOV AL, 4FH
OUT DX, AL
MOV AH, 03H
CALL DALLY
JMP R1
K2: MOV DX, IOA
MOV AL, 5BH
OUT DX, AL
MOV AH, 02H
CALL DALLY
JMP R1
K1: MOV DX, IOA
MOV AL, 06H
OUT DX, AL
MOV AH, 01H
CALL DALLY
JMP R1
K0: MOV DX, IOA
MOV AL, 3FH
OUT DX, AL
MOV AH, 00H
CALL DALLY
JMP R1
R1: NOP
INPUT ENDP
DALLY PROC NEAR ;延时子程序
PUSH CX
MOV CX, 00FFH
D1: DEC CX
JNZ D1
POP CX
RET
DALLY ENDP
QUIT:MOV DX, IOA ;结束程序
MOV AL, 00H ;数显管全灭
OUT DX, AL
MOV DX, IOC ;LED灭,扬声器不发声
MOV AL, 0FH
OUT DX, AL
MOV AX, 400CH
INT 21H
CODE ENDS ;结束
END START
改进
- 使用外部储存芯片保存密码,避免断电丢失信息。
- 使用8259中断控制器,控制密码锁的工作和休眠状态,提高效率,降低功耗。