在循环内容上做**吗

[复制链接]
5716|26
 楼主| ll_sd 发表于 2008-12-24 22:28 | 显示全部楼层 |阅读模式
rt,对于循环次数小于256次的,可以用如下方法进行循环,但大于256次怎么解决?<br />mov&nbsp;r1,#0ffh<br />循环内容<br />djnz&nbsp;r1&nbsp;循环内容<br />这里循环的内容是输出一个确定的数,需要输出大于256次,例如500次。因为这个数已经确定,所以不能通过判断这个数来确定是否要循环。这种情况怎么实现?
赤铸 发表于 2008-12-24 22:34 | 显示全部楼层

自己做16位整数减法

判断16位数是否为零
E007 发表于 2008-12-24 22:39 | 显示全部楼层

嵌套循环呗

  
 楼主| ll_sd 发表于 2008-12-24 22:58 | 显示全部楼层

2楼说一下思路吧

16位减法没搞过。<br />ps,循环嵌套不可行。
ljm810010 发表于 2008-12-24 23:06 | 显示全部楼层

哈哈,2楼方法就是循环嵌套,本质一样。

  
 楼主| ll_sd 发表于 2008-12-24 23:13 | 显示全部楼层

循环嵌套是不可行的

难道用汇编没戏?
E007 发表于 2008-12-24 23:25 | 显示全部楼层

LZ说出个不可行的原因?

&nbsp;&nbsp;&nbsp;&nbsp;你不就是500次吗?随便1-65535次都是可行的,如果想做更高,还可以再加一层嵌套,比你每次都做16位或更高位的减法快多了.如果你愿意累你的MCU和不嫌麻烦,那就每次都做16位或更高位数的减法好了~~~<br />
ljm810010 发表于 2008-12-24 23:31 | 显示全部楼层

C或汇编方法都一样,LZ说不行,只能说理解有误区

  
E007 发表于 2008-12-24 23:39 | 显示全部楼层

呵呵......

  
 楼主| ll_sd 发表于 2008-12-24 23:39 | 显示全部楼层

举个例子。

mov&nbsp;r0,#0ffh<br />mov&nbsp;r1,#02h<br />loop:&nbsp;mov&nbsp;a,r3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;send&nbsp;&nbsp;;这里假设把a的内容发送512次<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;djnz&nbsp;r0,loop<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;djnz&nbsp;r1,loop<br />这样能实现512次循环吗?<br /><br /><br />
E007 发表于 2008-12-24 23:45 | 显示全部楼层

你看可不可以???

&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r0,0xF4<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,1<br />loop:<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a,r0<br />&nbsp;&nbsp;&nbsp;&nbsp;jz&nbsp;end_loop<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;do&nbsp;something<br />&nbsp;&nbsp;&nbsp;&nbsp;djnz&nbsp;r0,loop<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a,r1<br />&nbsp;&nbsp;&nbsp;&nbsp;jz&nbsp;end_loop<br />&nbsp;&nbsp;&nbsp;&nbsp;djnz&nbsp;r1,loop<br />end_loop:<br />&nbsp;&nbsp;&nbsp;&nbsp;.....<br /><br /><br />直接用变量给r0,r1赋值都没问题.<br />如果是写程序就已经固定了的值,中间判0的4句都可以去掉,就象你那样.
E007 发表于 2008-12-24 23:46 | 显示全部楼层

你的那个

第一句赋个0值不就成了么,DJNZ一执行就成0XFF了.
ljm810010 发表于 2008-12-24 23:50 | 显示全部楼层

呵呵

mov&nbsp;r0,#512<br />mov&nbsp;r1,#(512/256)<br />loop:&nbsp;mov&nbsp;a,r3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;send&nbsp;&nbsp;;这里假设把a的内容发送512次<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;djnz&nbsp;r0,loop<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;djnz&nbsp;r1,loop<br />这样就能实现512次循环。<br /><br />
E007 发表于 2008-12-24 23:54 | 显示全部楼层

老大,赋值越范围了,512>255,被CUT掉,不过结果会是正确的,呵呵..

  
ljm810010 发表于 2008-12-25 00:00 | 显示全部楼层

是呀,结果会出乎意料的正确

这样可读性也强了
E007 发表于 2008-12-25 00:00 | 显示全部楼层

我知道这肯定结果会正确的,不过这样不是严谨的程序写法

  
ljm810010 发表于 2008-12-25 00:03 | 显示全部楼层

要严谨就写成 mov r0,#(512 mod 256) 吧!

  
E007 发表于 2008-12-25 00:08 | 显示全部楼层

Yeah~

  
 楼主| ll_sd 发表于 2008-12-25 08:54 | 显示全部楼层

13楼的还是个死循环

13楼的还是个死循环,跟我刚才发的那个一样的问题。<br />11楼的思路是对的但程序要改一下,还是以循环500次为例,如果r1设为1只能循环244次<br />&nbsp;mov&nbsp;r0,#f4h<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;r1,#02h<br />loop://do&nbsp;something<br />&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;a,r0<br />&nbsp;&nbsp;&nbsp;&nbsp;jz&nbsp;loop2<br />&nbsp;&nbsp;&nbsp;&nbsp;djnz&nbsp;r0,loop<br />loop2:djnz&nbsp;r1,loop&nbsp;&nbsp;&nbsp;&nbsp;<br />不然在执行完内循环后直接跳出外循环了<br />问题总算解决,谢谢2位的帮助<br />&nbsp;&nbsp;&nbsp;
lyjian 发表于 2008-12-25 09:22 | 显示全部楼层

13楼的明明就可以

您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

394

帖子

0

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