请大神帮忙看一下程序
LJMP START;
MAIN:JB P1.7,$; 密码顺序错误,跳转到此段程序,等待确认键按下
LCALL DL20MS; 确认键按下,延时去抖
JNB P1.7,$; 等待按键释放
SETB P2.0;P2.0 输出高电平,红色LED点亮
SJMP $; 暂停
START:MOV SP,#30H; 给堆栈指针赋值
CLR A; 累加器清零
MOV R0,#5; 将R0作为计数器,检验密码顺序
CLR P1.6; P1.6输出低电平
CLR P2.0; P2.0输出低电平
LOOP:MOV A,P1; P1值送入累加器
CJNE A,#11111101B,KEYREAD;是否有键按下
LJMP LOOP; 无键按下,循环检测
KEYREAD:JNB P1.0,KEY1; 查询P1口各个引脚
JNB P1.1,KEY2;
JNB P1.2,KEY3;
JNB P1.3,KEY4;
JNB P1.4,KEY5;
JNB P1.5,KEY6;
LJMP LOOP; 无键按下,返回
KEY1:LCALL DL20MS; P1.0上按键按下,延时去抖
JB P1.0,KEYREAD; 再次查询
CLR P2.1; P2.1输出低电平,熄灭P2.1上的LED
JNB P1.0,$; 等待按键释放
SETB P2.1; P2.1输出高电平,点亮P2.1上的LED
CJNE R0,#5,MAIN; 检测R0中的值,P1.0上的键是否为第一次按下
DEC R0; 是第一次按下,R0中值减1
LJMP KEYREAD; 返回查询其他P1口
KEY2:LCALL DL20MS; P1.1上按键按下,延时去抖
JB P1.1,KEYREAD; 再次查询
CLR P2.2; P2.2输出低电平
JNB P1.1,$; 等待按键释放
SETB P2.2; P2.2输出高电平
CJNE R0,#4,MAIN; P1.1上的键是否为第二次按下
DEC R0; 是第二次按下R0中值减1
LJMP KEYREAD; 返回查询其他P1口
KEY3:LCALL DL20MS; P1.2上按键按下,去抖
JB P1.2,KEYREAD; 再次查询
CLR P2.3; P2.3输出低电平
JNB P1.2,$; 等待按键释放
SETB P2.3; P2.3输出高电平
CJNE R0,#3,MAIN; P1.2上按键是否为第三次按下
DEC R0; 是第三次按下,R0中值减1
LJMP KEYREAD; 返回查询其他P1口
KEY4:LCALL DL20MS; 同上
JB P1.3,KEYREAD;
CLR P2.4;
JNB P1.3,$;
SETB P2.4;
CJNE R0,#2,MAIN;
DEC R0;
LJMP KEYREAD;
KEY5:LCALL DL20MS; 同上
JB P1.4,$;
CLR P2.5;
JNB P1.4,$;
SETB P2.5;
CJNE R0,#1,MAIN;
DEC R0;
LJMP KEYREAD;
KEY6:LCALL DL20MS; P1.5上按键按下,去抖
JB P1.5,KEYREAD; 再次查询
CLR P2.6; P2.6输出低电平
JNB P1.5,$; 等待按键释放
SETB P2.6;P2.6 输出高电平
CJNE R0,#0,MAIN; P1.5上按键是否为第六次按下
JB P1.7,$; 是第六次按下,等待P1.7上的确认键按下
LCALL DL20MS; 确认键按下,延时去抖
CLR P2.7;P2.7 输出低电平
JNB P1.7,$; 等待确认键释放
SETB P2.7;P2.7 输出高电平
SETB P1.6;P1.6 输出高电平,开锁
LJMP START; 返回主程序,准备下一次密码输入
DL20MS:PUSH 01H; 以下为延时去抖子程序
PUSH 00H;
MOV R1,#10;
D0:MOV R2,#250;
D1:NOP;
NOP;
DJNZ R2,D1;
DJNZ R1,D0;
POP 00H;
POP 01H;
RET;
END.
是一段密码锁程序。但仿真时P1口和P2口都输出高电平,不受按键控制P1.0到P1.5是密码键,P1.7是确认键,密码顺序是依次按P1.0到P1.5,密码数值和顺序都正确才点亮P1.6上的LED,否则点亮P2.0上的红色LED,P2.1到P2.6对应5个密码键,平常点亮,按下对应的密码后对应的LED熄灭,松开再次点亮,P2.7上的蓝色LED对应的是确认键 展开
某些触屏手机上,有个滑动开锁的操作。
笔记本电脑,是用键盘输入密码。
也有人把密码设置成: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
很怪啊,用了你的程序,P1口和P2口还是都输出高电平,是不是仿真软件有问题?
2022-03-17 广告