我写了一个单片机的汇编语言,汇编没问题,但是调试的时候效果不理想,求助

目的是,三个按键,按下K1,流水灯左移,按下K2,流水灯右移,同时按下,则不亮,汇编的时候也没问题,但是调试的时候,流水灯只能左移,求救,下面附上语言内容ORG0000H... 目的是,三个按键,按下K1,流水灯左移,按下K2,流水灯右移,同时按下,则不亮,汇编的时候也没问题,但是调试的时候,流水灯只能左移,求救,下面附上语言内容

ORG 0000H
LJMP MAIN
ORG 0060H
MAIN:MOV A,P3
CJNE A,#003H,NO1
LJMP MAIN
NO1:CJNE A,#001H,NO2
LJMP K1
NO2:CJNE A,#002H,MAIN
LJMP K2
K1:MOV A,#0EFH
LOOP:MOV P2,A
LCALL D_1S
RL A
AJMP LOOP
K2:MOV A,#000H
LOOP1:MOV P2,A
LCALL D_1S
RR A
AJMP LOOP1
D_1S:MOV R6,#100
D10MS:MOV R5,#40
DL:MOV R4,#123
NOP
DJNZ R4,$
DJNZ R5,DL
DJNZ R6,D10MS
RET
END
流程图在这

另外题目要求,,K1和K2同时按下的时候两个灯也不亮
展开
 我来答
c3344c
2014-04-13 · TA获得超过2418个赞
知道小有建树答主
回答量:966
采纳率:57%
帮助的人:679万
展开全部
汇编编译通过不等于程序没问题:
1,缺乏两个按键同时按下的程序;
2,由于K1,K2模块死循环,程序没有返回,每次都要重启电源或手动复位单片,才能通过按键 改变程序走向;
3,按键没有去抖动处理容易出现误判断。
4,K1的键值是001H,K2的值是002H,那么两个按键同时按下应该是003H吧,003H不是没有按键按下的状态吗?
按键按下时口线的状态到底是0还是1?
先为你稍作修改如下:

ORG 0000H
LJMP MAIN
ORG 0060H
MAIN: MOV A,P3
CJNE A,#003H,NO1 ;等待按键按下
LJMP MAIN
NO1: CJNE A,#001H,NO2
LJMP K1 ;等于001H跳K1
NO2: CJNE A,#002H,MAIN
LJMP K2 ;等于002H跳K2
;两个按按键同时按下的程序在哪里呢?
K1: MOV A,#0EFH ;K1程序模块
MOV R3,#08H ;增加这一行
LOOP: MOV P2,A
LCALL D_1S
RL A
DJNZ R3,LOOP ;改动这两行
AJMP MAIN ;返回继续检测按键

K2: MOV A,#000H ;K2程序模块
MOV R3,#08H ;增加这一行
LOOP1:MOV P2,A
LCALL D_1S
RR A
DJNZ R3,LOOP1 ;改动这两行
AJMP MAIN ;返回继续检测按键

D_1S: MOV R6,#100 ;延时模块
D10MS:MOV R5,#40
DL: MOV R4,#123
NOP
DJNZ R4,$
DJNZ R5,DL
DJNZ R6,D10MS
RET
END
追问
MAIN : MOV A,P3               ;从P3口读取数据
CJNE A,#003H,NO1 ;A的数据跟003H比较,不相等的话 跳转到NO1
LJMP MAIN ;相等的话 跳转到主程序
(K1和K2同时按下的话,跳转到主程序了啊,不对吗?)
追答
我明白了,“同时按下,则不亮”这句话的意思了。因为发现程序没有对I/O初始化,才提出这个问题的。倘诺程序在循环中有LED亮,即使两个按键同时按下,LED也是不会灭的。另外,K1、K2模块的第一句MOV A,#XXXH好像也有问题,K1改为MOV A,#0FEH,K2改为MOV A,#07FH更合适,请检查一下你的程序。
262796103
2014-04-13
知道答主
回答量:5
采纳率:0%
帮助的人:7.9万
展开全部
ORG 0000H
LJMP MAIN
ORG 0060H
MAIN:
MOV A,P3

NO12: CJNE A,#003H,NO1
LJMP MAIN
NO1: CJNE A,#001H,NO2
LJMP K1
NO2: CJNE A,#002H,MAIN
LJMP K2

K1: MOV B,#0EFH
LOOP: MOV A,B
MOV P2,A
LCALL D_1S
RL A
MOV B,A
MOV A,P3
key12: CJNE A,#003H,key2
JMP MAIN
key2: CJNE A,#001H,LOOP
JMP K2

; AJMP LOOP

K2: MOV B,#000H
LOOP1: MOV A,B
MOV P2,A
LCALL D_1S
RR A
MOV B,A
MOV A,P3
key21: CJNE A,#003H,key1
JMP MAIN
key1: CJNE A,#001H,LOOP1
JMP K1

; AJMP LOOP1

D_1S: MOV R6,#100
D10MS: MOV R5,#40
DL: MOV R4,#123
NOP
DJNZ R4,$
DJNZ R5,DL
DJNZ R6,D10MS
RET
END

;K2: MOV B,#000H????????
;LOOP1: MOV A,B???????

顺着你的思路修改了一下,程序还是有问题的,自己再改改吧,只能帮你到这了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
馒头Demonman
2014-04-13 · 超过18用户采纳过TA的回答
知道答主
回答量:52
采纳率:0%
帮助的人:39.1万
展开全部
你先按右移可以吗?要是可以就是你程序在执行完以后没有回到一开始的地方
追问
我刚才修改了一下,先按右移的话,就只能右移,应该是没有回到开始的地方,你能帮我修改一下吗?谢谢
追答
加个循环吧  好久不看汇编了 有点看不懂   应该是你在每次右移和左移完后加个跳转回到main那里
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友66c5a1e26
2014-04-13
知道答主
回答量:22
采纳率:0%
帮助的人:2.2万
展开全部
自己写个流程图分析一下吧,应该逻辑都有问题
追问

这是流程框图,给你看一下


已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式