51 汇编语言编程--输入密码
扫描二维码
随时随地手机看文章
;某些触屏手机上,有个滑动开锁的操作。
;笔记本电脑,一般都是用键盘输入密码。
;也有人把密码设置成:ASDFGHJKL;'Enter,当开机时,只需用手指在键盘上划一下,即可。
;单片机,也可以设置这样形式的密码,依次按下某些键,即可成功进入下一步的操作。
;下图电路,就是依次按键,进行输入开机密码的:
;P1.0 到 P1.5 是密码键,P1.7 是确认键,
;P2.1 到 P2.6 对应 5 个密码键,平常点亮,--原文如此,应该是6个
;按下对应的密码后对应的LED熄灭,松开再次点亮,
;P2.7 上的蓝色 LED 对应的是确认键。
;密码顺序是依次按 P1.0 到 P1.5,
;密码数值和顺序都正确才点亮 P1.6 上的LED,否则点亮 P2.0 上的红色 LED。
;题目中的原程序,不可用。
;仿照原程序的思路,做而论道编写的程序如下:
;--------------------------------------
ORG 0000H
JMP START
START:
MOV R0, #7 ;将R0作为计数器,检验密码顺序
CLR P1.6 ;关闭正确指示灯
MOV P2, #01111110B ;P2.1到P2.6对应6个密码键,平常点亮,
LOOP:
MOV A, P1 ;读入
MOV B, A ;暂存
ORL A, #01000000B ;屏蔽指示灯
CPL A
JZ LOOP ;无键按下,循环检测
CALL DL20MS ;延时
MOV A, P1 ;再读一次
CJNE A, B, LOOP;消抖
;--------------------------------------
;已经确认有键按下:
MOV C, ACC.7 ;P1.7的键
CPL C
RL A
MOV ACC.7, C ;送到P2.7去
CLR ACC.0 ;关闭错误指示灯
MOV P2, A ;驱动各个按键的指示灯
;--------------------------------------
;下面等待释放
LOP2:
MOV A, P1 ;读入
ORL A, #01000000B ;屏蔽指示灯
CPL A
JNZ LOP2 ;循环检测,等待释放
;--------------------------------------
;按键已经释放,
MOV P2, #01111110B ;P2.1到P2.6对应6个密码键,平常点亮,
;--------------------------------------
;下面处理刚才的按键
JNB B.0, KEY0
JNB B.1, KEY1
JNB B.2, KEY2
JNB B.3, KEY3
JNB B.4, KEY4
JNB B.5, KEY5
JNB B.7, KEY7
JMP LOOP
;--------------------------------------
KEY0:
CJNE R0, #7, LOOP
DEC R0
JMP LOOP
KEY1:
CJNE R0, #6, LOOP
DEC R0
JMP LOOP
KEY2:
CJNE R0, #5, LOOP
DEC R0
JMP LOOP
KEY3:
CJNE R0, #4, LOOP
DEC R0
JMP LOOP
KEY4:
CJNE R0, #3, LOOP
DEC R0
JMP LOOP
KEY5:
CJNE R0, #2, LOOP
DEC R0
JMP LOOP
KEY7:
CJNE R0, #1, ERROR
MOV P2, #0 ;关闭按键指示灯
SETB P1.6 ;正确指示
SJMP $ ;停机
ERROR:
MOV P2, #0 ;关闭按键指示灯
SETB P2.0 ;错误指示
SJMP $ ;停机
;--------------------------------------
DL20MS:
MOV R6, #40
DJNZ R7, $
DJNZ R6, $ - 2
RET
;--------------------------------------
END