八、流程图
主程序流程图
否 是否按下确初始化8255 开始 初始化8086 输入密码 认键?
是
密码比对子程序 闭锁子程序
密 码 是 否 否 正
确? 是
开锁子程序 结束 11
修改密码子程序流程图 开锁子程序流程图
开始 键盘扫描 存入密码空间
保存键值 是 否 按 否 下确认 键?
是 调用发声子程序
结束
开始 输出开锁电平,显示“00” 键盘扫描 是 返回键是否按下? 否 否 修改键是否按下? 是 调用修改密码子程序 关开锁电平 结束 12
闭锁子程序流程图是 开始 显示“FF” 发出警告音
密码错误次数增1
是 否 已 达 到 六 否 次错误?
是 输出报警电平 密码错误次数置0 按键扫描
否
返回按键是否按
下? 是 结束
13
九、程序代码
IOY0 EQU 0200H ;8255片选端口始地址 MY8255_A EQU IOY0+00H*2 ;8255的A口地址 MY8255_B EQU IOY0+01H*2 ;8255的B口地址 MY8255_C EQU IOY0+02H*2 ;8255的C口地址
MY8255_MODE EQU IOY0+03H*2 ;8255的控制寄存器地址 IOY1 EQU 0400H ;8253片选端口始地址 MY8253_COUNT0 EQU IOY1+00H*2 ;8253计数器0端口地址 MY8253_COUNT1 EQU IOY1+01H*2 ;8253计数器1端口地址 MY8253_COUNT2 EQU IOY1+02H*2 ;8253计数器2端口地址 MY8253_MODE EQU IOY1+03H*2 ;8253控制寄存器端口地址
DATA SEGMENT
COUNT1 DB 00H
COUNT2 DB 00H ;错误密码次数 DTABLE
DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,3FH,39H,5EH,79H,71H,00H,40H ;键值表,0~F对应的7段数码管的段位值
;DTABLE[11]=3FH对应键值11,显示\
;DTABLE[16]=00H,数码管熄灭
;DATABLE[17]=04H,显示数码管\
STRING DB 01H,02H,03H,04H,05H,06H ;初始密码,密码内存空间 DATA ENDS
STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START: MOV AX,DATA
MOV DS,AX
START1:MOV DX,MY8255_MODE ;初始化8255工作方式
MOV AL,81H ;方式0,A口、B口输出,C口高四位输出,C口低4位输入
14
OUT DX,AL
MOV DX,MY8255_C ;开锁电平、报警电平置0 MOV AL,00H OUT DX,AL
MOV SI,0200H ;建立缓冲区,存放要显示的键值 MOV AL,11H ;先初始化键值为11H,显示“-” MOV [SI],AL MOV [SI+1],AL MOV [SI+2],AL MOV [SI+3],AL MOV [SI+4],AL MOV [SI+5],AL MOV DI,0205H
BEGIN:
CALL KEYPAD ; CMP AL,0CH ; JZ RENZ
CMP AL,0AH ; JZ BEGIN
CALL PUTBUF ; CALL KEYLS ; JMP BEGIN
RENZ: CALL KEYLS
CALL CRCMP ; CMP CX,0FFH JZ SHOW1
JMP SHOW2
SHOW1: CALL SHOWC ; JMP START1
SHOW2: CALL SHOWO ; ; JMP START1
QUIT: HLT
KEYPAD PROC NEAR ; 键盘扫描 确认键
修改密码键,此处不用,返回键盘扫描 保存按键值
按键未弹起则继续循环等待弹起 密码比对 密码错误 密码正确 键盘扫描程序
15