请大神帮忙看一下程序

ORG0000H;LJMPSTART;MAIN:JBP1.7,$;密码顺序错误,跳转到此段程序,等待确认键按下LCALLDL20MS;确认键按下,延时去抖JNBP1.7,... ORG 0000H;

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对应的是确认键
展开
 我来答
做而论道
高能答主

2013-07-28 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部

某些触屏手机上,有个滑动开锁的操作。

笔记本电脑,是用键盘输入密码。

也有人把密码设置成: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口还是都输出高电平,是不是仿真软件有问题?
wgq930
2013-07-28 · TA获得超过2262个赞
知道大有可为答主
回答量:4926
采纳率:51%
帮助的人:1935万
展开全部
按下键后,对应的端口由红变兰了吗?
追问
按下键后,对应的绿色LED熄灭,松开就点亮,红灯平时熄灭,密码错误并且按下确认键后才点亮,提示密码错误
追答
那到底是有什么问题啊?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式