c51程序 关于ACC累加器的使用?

voidds1302_InputByte(uchardat){uchari;ACC=dat;for(i=0;i<8;i++){P0_0=ACC_0;//defineACC... void ds1302_InputByte(uchar dat)
{
uchar i;
ACC=dat;
for(i=0;i<8;i++)
{
P0_0=ACC_0;//define ACC_0 ACC^0

ACC>>=1;
}
}上面的函数用ACC送数据,经我验证这样写是错误的。for(i=0;i<8;i++)这8次循环语句我猜测它编译出的汇编程序用到了ACC。然后循环体里我又用它传送数据。我没有意识到循环体也用到ACC所以实际送出的ACC_0的值是错的、或者for循环也出错。

经改动如下:
void InputByte(uchar dat)
{
uchar i,temp;
temp=dat;
for(i=0;i<8;i++)
{
P0_0=(bit)(temp&0x01);

temp>>=1;
}
}这样改后,程序就能正确运行。。证明用到for(i=0;i<8;i++)的时候,循环体内部能用ACC.
void ds1302_InputByte(uchar dat)
{
uchar i;
ACC=dat;
for(i=8;i>0;i--)
{
P0_0=ACC_0;//define ACC_0 ACC^0

ACC>>=1;
}
}这样改也是正确的。。for(i=8;i>0;i--)是不是说明这个语句就没有用到ACC?for(i=0<8;i++)这个语句用到了。

是不是for(i=8;i>0;i--)这个语句要比for(i=0<8;i++)要好呀?我没用过汇编,不太了解汇编

想请高手指导下相关问题。。不知我说的对不?
展开
 我来答
高山入云
2011-05-23 · TA获得超过1073个赞
知道小有建树答主
回答量:204
采纳率:0%
帮助的人:173万
展开全部
我也曾遇到你说的这个问题,巧的很,也是写DS1302的程序,我觉得与ACC关系不大。因为
我当时并没有使用ACC的位变量,而是你第二种方式(temp&0x01)。当用for(i=0;i<8:i++)时就是不行(怕写错,反复写了几次,都不行),只有改为for(i=8;i>0:i--)时就正常。当时也是百思不得其解。当我把整个程序写完以后,再回头研究这个问题时,发现改为for(i=0;i<8:i++)时竟然又正常了。到现在我也不明白开始为何不行,也记不清其间又改动了什么。
理论上讲两个应该完全等效。一般情况下效果应该完全相同。但我确确实是遇到上述现象,这也是我写程序历史唯一碰到的一次。
我后来在某些书上看到,使用for(i=8;i>0:i--)比for(i=0;i<8:i++)优化,速度也更快。
这里回答你,主要做个关注,看看有没有人也遇到同样的问题,并知道问题的所在。

补充:网上搜了一下,我更同意时序的观点。供参考
http://bbs.21ic.com/icview-44006-1-1.html
另外,我觉得还可能与MCU 芯片有关,我出现问题时用的是STC89C52。你可以写到华邦的78E51试试,因为我好几次发现将文件写到STC芯片有问题时,而华邦的芯片却完全正常。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式