为何不亮

[复制链接]
3219|14
 楼主| huise2008 发表于 2010-5-5 17:49 | 显示全部楼层 |阅读模式
刚刚用KEIL编写了流水灯,请问我编写的流水灯程序那里出了问题,为何程序运行到P0.3就不运行了,低电平发光管亮,谢谢!
程序如下:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:MOV 54H,#3
     MOV A,#07FH
   S:MOV P0,A
     LCALL DELAY
     RR A
     RR A
     DJNZ 54H, S
     SJMP $
ORG 0100H
DELAY:MOV R0,#10
   L:MOV R1,#0FFH
   M:MOV R2,#0FAH
      DJNZ R2,$
      DJNZ R1,M
      DJNZ R0,L
      RET
END
xushouxue999 发表于 2010-5-5 18:11 | 显示全部楼层
SJMP $!
是什么意思呢?你知道吗???
弄明白它先!
 楼主| huise2008 发表于 2010-5-5 18:28 | 显示全部楼层
死循环,但是应该是p0.1亮,但是却是p0.3亮
xushouxue999 发表于 2010-5-5 18:43 | 显示全部楼层
呵呵那就对了!你程序的意思不就是P0.7亮了然后6,5亮,再一圈4,3亮吗??
P0.2,1,0怎么会亮呢?虽然你移位的时候把21都移为0了,但是还没给ACC就等在那了!
你如果还不明白把54H中的3换为4就出现你要的结果了!
xushouxue999 发表于 2010-5-5 18:44 | 显示全部楼层
对不起说错了,不是没给ACC是给了ACC了但没给P0!
 楼主| huise2008 发表于 2010-5-5 18:58 | 显示全部楼层
我只想将P0.7,P0.5,P0.3,P0.1点亮,但到p0.1却不良了
xuyiyi 发表于 2010-5-5 19:11 | 显示全部楼层
再加一条指令即可
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:MOV 54H,#3
     MOV A,#07FH
   S:MOV P0,A
     LCALL DELAY
     RR A
     RR A
     DJNZ 54H, S
     MOV P0,A     
     SJMP $
ORG 0100H
DELAY:MOV R0,#10
   L:MOV R1,#0FFH
   M:MOV R2,#0FAH
      DJNZ R2,$
      DJNZ R1,M
      DJNZ R0,L
      RET
END
xushouxue999 发表于 2010-5-5 19:19 | 显示全部楼层
呵呵那就得改改程序了!你试试这样做,看是不是你想要的!
MAIN:
         MOV 54H,#4
         MOV A,#07FH
   S:   
         MOV P0,A
         LCALL DELAY
         RRC     A
         RR       A
         DJNZ   54H, S
         SJMP $
xushouxue999 发表于 2010-5-5 19:25 | 显示全部楼层
似乎楼主说“我只想将P0.7,P0.5,P0.3,P0.1点亮,但到p0.1却不良了”,意思似乎是其他不点亮!
也可能是我的理解有误!对不起!
 楼主| huise2008 发表于 2010-5-5 20:09 | 显示全部楼层
很感谢大家的回帖,我想的是只有8个发光管,由p0口控制,低电平时点亮。程序先点亮p0.7,然后delay点亮p0.5然后delay点亮p0.3,然后delay点亮p0.1。现在运行到p0.3亮变截止了,按程序应该到p0.1点亮后才静止保持p0.1点亮。
chfirst 发表于 2010-5-5 20:29 | 显示全部楼层
要实现lz说的结果:
首先确实应该像xushouxue999说的把程序中RR命令改为RRC命令,不然就变为
点亮p0.7后每次依次点亮6,5再4,3再2,1再以后就保持全亮了。
按说程序没错了,建议检查下硬件吧。
等待强人了。
 楼主| huise2008 发表于 2010-5-5 20:34 | 显示全部楼层
我已经试过了, 把MOV 54H,#3改为 MOV 54H,#4就行了为何呀,不明白呀,讲一下呗大侠们谢啦
chfirst 发表于 2010-5-5 20:55 | 显示全部楼层
改后代码:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:MOV 54H,#4
     MOV A,#07FH
         MOV PSW,#80H
   S:MOV P0,A
     LCALL DELAY
     RRC A
     RRC A
     DJNZ 54H, S
     SJMP $
ORG 0100H
DELAY:MOV R0,#10
   L:MOV R1,#0FFH
   M:MOV R2,#0FAH
      DJNZ R2,$
      DJNZ R1,M
      DJNZ R0,L
      RET
END
首先RR是不带循环的右移
而RRC为带CY进位的右移,使用RRC命令,才能使#07FH在
RRC A
RRC A
后变为#0EFH,从而只点亮P0.5
如果使用RR的话,这是就变为#01FH,P0.7,6,5都会亮的。
DJNZ命令是先减后判断,所以54H为#3时连第一次只循环了3次
即只运行了4次RRC命令,所以啊,就停在了P0.3处。改为#4H后
就变好了。
chfirst 发表于 2010-5-5 21:03 | 显示全部楼层
不对,最后说错了,其实#3H时循环了3次,
不对的原因是最后一次循环时虽然执行了RRC但没有返回到S
执行mov P0 ,A
xuling425300 发表于 2010-5-6 10:28 | 显示全部楼层
P0口作为输出时要上啦电阻!或下拉电阻
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

125

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部