BEGINk:
CALL DIS ;显示刷新 CALL CLEAR ;清屏 CALL CCSCAN ;扫描按键 JNZ GETKEY1 ;有键按下则跳置GETKEY1
GETKEY1:CALL DIS ;显示刷新 CALL CLEAR ;清屏 CALL CCSCAN ;再次扫描按键 JNZ GETKEY2 ; JMP BEGINk ;
GETKEY2:MOV CH,0FEH MOV CL,00H
COLUM: MOV AL,CH ; MOV DX,MY8255_A
OUT DX,AL
MOV DX,MY8255_C ; IN AL,DX
L1: TEST AL,01H ; JNZ L2 ; MOV AL,01H ; JMP KCODE
L2: TEST AL,02H ; JNZ L3 ; MOV AL,02H ; JMP KCODE
L3: TEST AL,04H ; JNZ NEXT ; MOV AL,03H ; JMP KCODE
KCODE: ADD AL,CL
JMP QUITk ;
NEXT: ADD CL,3 MOV AL,CH
TEST AL,08H ; JZ KERR ; ROL AL,1 ; 有键按下则跳置GETKEY2 否则跳回开始继续循环
选取一行 读C口,用于判断是哪一列按键闭合是否为第1列
不是则继续判断
设置第1行第1列的对应的键值 是否为第2列 不是则继续判断
设置第1行第2列的对应的键值 是否为第3列
不是则继续判断
设置第1行第3列的对应的键值 确定按键值 检测是否扫描到第4行 是则跳回到开始处
没检测到第4行则准备检测下一列
16
MOV CH,AL
JMP COLUM KERR: JMP BEGINk QUITk: RET KEYPAD ENDP
CCSCAN PROC NEAR ;扫描是否有按键闭合子程序 MOV AL,00H MOV DX,MY8255_A ;将4行全选通,
OUT DX,AL MOV DX,MY8255_C
IN AL,DX ; NOT AL
AND AL,0FH ; RET CCSCAN ENDP
KEYLS PROC NEAR ; PUSH AX KON:
CALL DIS ; CALL CLEAR ; CALL CCSCAN ; JNZ KON ; POP AX
RET
KEYLS ENDP
CLEAR PROC NEAR ; MOV DX,MY8255_B ; MOV AL,00H OUT DX,AL RET CLEAR ENDP
DIS PROC NEAR ; PUSH AX ; MOV SI,0200H MOV DL,0DFH
MOV AL,DL
AGAIN: PUSH DX
MOV DX,MY8255_A
OUT DX,AL ; 读C口
取出C口值的反值 按键是否弹起子程序 显示刷新 清屏 扫描按键,判断按键是否弹起 未弹起则继续循环等待弹起 清除数码管显示子程序
段位置0即可清除数码管显示 显示键值子程序
以缓冲区存放的键值为键值表偏移找到键值并显示 选通一个数码管
17
MOV AL,[SI] ;取出缓冲区中存放键值 MOV BX,OFFSET DTABLE AND AX,00FFH ADD BX,AX MOV AL,[BX] ;将键值作为偏移和键值基地址相加得到相应的键值
MOV DX,MY8255_B OUT DX,AL ;写入数码管A~Dp CALL DALLY
INC SI ; POP DX MOV AL,DL
TEST AL,01H ; JZ OUT1 ; ROR AL,1
MOV DL,AL
JMP AGAIN ;OUT1: POP AX RET DIS ENDP
PUTBUF PROC NEAR ;
MOV SI,DI MOV [SI],AL DEC DI CMP DI,01FFH JNZ GOBACK
MOV DI,0205H
GOBACK: RET
PUTBUF ENDP
CRCMP PROC NEAR ;密码比对子程序
MOV SI,0205H
MOV DI,OFFSET STRING MOV CX,0 ; MOV AL,[SI] MOV BL,[DI] CMP AL,BL JZ NEXT1 JMP NEXT6
取下一个键值
判断是否显示完? 显示完,返回 未显示完,跳回继续 保存键值子程序 密码正确,则输出CX=00H,为密码正确的标志18
NEXT1: MOV SI,0204H
MOV DI,OFFSET STRING MOV AL,[SI] MOV BL,[DI+1] CMP AL,BL JZ NEXT2 JMP NEXT6 NEXT2:
MOV SI,0203H
MOV DI,OFFSET STRING MOV AL,[SI] MOV BL,[DI+2] CMP AL,BL JZ NEXT3 JMP NEXT6 NEXT3:
MOV SI,0202H
MOV DI,OFFSET STRING MOV AL,[SI] MOV BL,[DI+3] CMP AL,BL JZ NEXT4 JMP NEXT6 NEXT4:
MOV SI,0201H
MOV DI,OFFSET STRING MOV AL,[SI] MOV BL,[DI+4] CMP AL,BL JZ NEXT5 JMP NEXT6 NEXT5:
MOV SI,0200H
MOV DI,OFFSET STRING MOV AL,[SI] MOV BL,[DI+5] CMP AL,BL JZ QUITER JMP NEXT6
NEXT6: MOV CX,0FFH ;QUITER:RET CRCMP ENDP
密码错误,则CX=0FFH为密码错误的标志 19
SHOWO PROC NEAR ;开锁子程序 MOV SI,0200H ;显示00 MOV AL,00H MOV [SI],AL MOV [SI+1],AL MOV AL,10H MOV [SI+2],AL MOV [SI+3],AL MOV [SI+4],AL MOV [SI+5],AL MOV DI,0205H
MOV DX,MY8255_C ; MOV AL,010H OUT DX,AL
LOOP21:
CALL KEYPAD
CMP AL,0CH ; JZ LOOP22
CMP AL,0AH ; JZ LOOP23 JMP LOOP21 LOOP22: CALL KEYLS JMP QUITSHO
LOOP23: CALL KEYLS ; MOV SI,0200H
MOV AL,10H MOV [SI],AL MOV [SI+1],AL MOV DI,0205H
CALL CHANGECR ;QUITSHO: MOV DX,MY8255_C ; MOV AL,00H OUT DX,AL
RET SHOWO ENDP
CHANGECR PROC NEAR ;CHG1: CALL KEYPAD CMP AL,0CH JZ CHG2 CALL PUTBUF CALL PUTBUFCR
输出开锁电平 返回键,退出开锁子程序 修改密码键 修改密码,数码管全灭,用于与输入密码区别 调用修改密码子程序
开锁电平置0 修改密码子程序 20