简介

利用CPU芯片 8086、并行接口8255A、译码器74138、锁存器74HC373等设计一个多功能密码锁。通过8255A读取键盘电平获得输入密码,与预设密码比较,进而实现开锁、报错功能,并控制数显管和指示灯做出相应变化。还可实现密码修改功能。
课程设计使用Proteus7.8绘制电路图,使用EMU8086编译汇编程序,并将编译生产exe可执行文件挂载到Proteus,进行联合调试。

设计方案

设计思路

flowchart
用数显管显示表示键盘输入数字及相应状态,通过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)开锁流程中输入密码时数显管显示下划线 “_”,修改流程中输入密码会显示上划线,以便提醒用户密码锁工作状态。

硬件连接图

circuit

程序清单

;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中断控制器,控制密码锁的工作和休眠状态,提高效率,降低功耗。