单片机c语言的问题 有关ACC的 菜鸟求教

我是想通过ACC输出0x05,
sbit ACC7=ACC^7;
uchar read_da1302_byte() //这种写法可以返回0x05;
{
ACC7=1;
ACC=ACC>>1;
ACC7=0;
ACC=ACC>>1;
ACC7=1;
ACC=ACC>>1;
ACC7=0;
ACC=ACC>>1;
ACC7=0;
ACC=ACC>>1;
ACC7=0;
ACC=ACC>>1;
ACC7=0;
ACC=ACC>>1;
ACC7=0;
return ACC;
}

///////////////////////////////////////////////////////
uchar read_da1302_byte() //这样写就不行了呢?
{
uchar i;
for(i=0;i<8;i++)
{

ACC=ACC>>1;
switch(i)
{
case 0:ACC7=1;break;
case 1:ACC7=0;break;

case 2:ACC7=1;break;
case 3:ACC7=0;break;

case 4:ACC7=0;break;
case 5:ACC7=0;break;

case 6:ACC7=0;break;
case 7:ACC7=0;break;

}

}

return(ACC);

}

这两种写法有区别吗? 请指教!
没有人能帮忙吗?
一楼的那位朋友,我只是想知道上面那两种程序写法区别在哪里,为什么第一种写法可以通过位赋值给ACC^7,移位,最后是使ACC变为00000101(0x05);
第二种只是换了种方法赋值给ACC^7,却不能使ACC变为00000101(0x05)呢?
(二楼的,你那种方法移位移了八次,最后的值还是不对,从最高位到最低位只要移动7次就够了)
我想应该从单片机角度着手吧,不能单从C语言........

sbit ACC7=ACC^7; //变量ACC7是ACC寄存器的第7位
知道这句话是什么意思吗?
sbit同位是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。
在80C51单片机系统中,经常要访问特殊功能寄存器中的某些位,用关键字sbit定义可位寻址的特殊功能寄存器的位寻址对象。
定义方法有如下三种:

(1)sbit 位变量名 = 位地址

将位的绝对地址赋给位变量,位地址必须位于0x80H~0xFF之间。

(2)sbit 位变量名 = 特殊功能寄存器名^位位置

当可寻址位位于特殊功能寄存器中时,可采用这种方法。位位置是一个0~7之间的常数。

(3)sbit 位变量名 = 字节地址^位位置

这种方法是以一个常数(字节地址)作为基地址,该常数必须在0x80H~0xFF之间。位位置是一个0~7之间的常数。

uchar read_da1302_byte()
{
uchar i;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:ACC7=1;break;
case 1:ACC7=0;break;

case 2:ACC7=1;break;
case 3:ACC7=0;break;

case 4:ACC7=0;break;
case 5:ACC7=0;break;

case 6:ACC7=0;break;
case 7:ACC7=0;break;

}
ACC=ACC>>1;

}
return(ACC);
}

朋友,应该这么写吧,右移语句的位置谢错地方了,少移了一次。 能明白吧,上面的程序不就是先赋值再右移的吗?这次该选我了吧!!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-10-16
有区别,两个的顺序不一样了。第一种方法是先给ACC7赋值,然后再将ACC右移。而第二种方法你是先右移了,然后再给值。你只要改成:
uchar read_da1302_byte()
{
uchar i;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:ACC7=1;break;
case 1:ACC7=0;break;

case 2:ACC7=1;break;
case 3:ACC7=0;break;

case 4:ACC7=0;break;
case 5:ACC7=0;break;

case 6:ACC7=0;break;
case 7:ACC7=0;break;

}

ACC=ACC>>1;

}

return(ACC);

就一样了。