程序不理解 请赐教 一定要帮我看看

[复制链接]
2577|12
 楼主| 许世霞 发表于 2007-11-30 21:50 | 显示全部楼层 |阅读模式
AC, AD, dc, rc, ADC
#define _rrca_() CY = ACC & 0x01 //产生RRC A指令
#define _rlca_() CY = ACC & 0x80 //产生RLC A指令
ACC & 0x01 的结果怎么能赋值给CY呐?
 for(cycle = 8; cycle > 0; cycle-- )
         {
         

        //bADcl = 0;//pulse 
           bADcl = 1;
         CY = bADda;
       _rlca_();    //RRC A
         bADcl = 0;//pulse
         }
     data1= ACC;
怎么能实现循环左移或右移 我很是费解希望高手指点
bs1234 发表于 2007-11-30 23:44 | 显示全部楼层

KEILC51中有现成的左移和右移函数.在intrins.h文件中

hotpower 发表于 2007-12-1 00:55 | 显示全部楼层

哈哈~~~不知楼主的_rrca_()和_rlca_()从何而来~~~

shishaojun 发表于 2007-12-1 01:51 | 显示全部楼层

这是c的强制类型转换啊

不过建议不要这么个搞法,编译器未必会聪明到自动将其用一条rlc指令来代替
你还是仔细看看编译器的帮助吧
ayb_ice 发表于 2007-12-1 09:33 | 显示全部楼层

这都看不懂

沈老 发表于 2007-12-1 10:07 | 显示全部楼层

It seems ...

#define uchar unsigned char
#define _rrca_() CY = ACC & 0x01 
#define _rlca_() CY = ACC & 0x80 
//
main()
{
    uchar bADda;
    bADda=0x55;
    CY = bADda; //if (bADda==0) CY=0 else CY=1 
    _rlca_();   //RLC A =0x54
//if #define _rlca_() CY = ACC & 0x40 // A2E6 MOV  C,0xE0.6    ;2bytes
//if #define _rlca_() CY = ACC & 0x80 // 33   RLC  A        ;1byte
// attention !
    bADda=_crol_(bADda,1);//RL =0xAA
}
 楼主| 许世霞 发表于 2007-12-1 11:46 | 显示全部楼层

有耐心的高手请再给我解释一下吧

沈老您能说得明白一点吗?
(1)ACC & 0x80的结果是八位怎么能赋值给只有一位的CY呐?
(2)我在程序里怎么就没有看到循环的影子呀,哪里体现了它带进位循环了?
(3)为什么一开始要给bADda=0x55或其他的值呀
 CY = bADda; //if (bADda==0) CY=0 else CY=1 这句我理解就是把采来的数放到了CY里。


ayb_ice 发表于 2007-12-1 14:11 | 显示全部楼层

人家已经说了“这是c的强制类型转换啊”

你也太不开窍了。
还可以1位送到8,16,32呢,还有8位送16,32。。。。
沈老 发表于 2007-12-1 16:48 | 显示全部楼层

Second thought

1."CY = bADda; //if (bADda==0) CY=0 else CY=1"
因为CY是bit而bADda是byte 把byte类型的变量赋给bit变量需要类型转换,其方法为:if (bByte==0) bitBit=0 else bitBit=1".
2.编译器再根据具体情况进行优化.
a.//if #define _rlca_() CY = ACC & 0x40
这时结果中只有一位,所以用: A2E6 MOV C,0xE0.6 ;要2个指令字节
b.//if #define _rlca_() CY = ACC & 0x80
这时结果中只有一位,并且正好是第7位(E0.7),所以移入CY即可:33 RLC A ;只要一个指令字节
c.//if #define _rlca_() CY = ACC & 0xXX
这时结果中可以有1到8位,编译器又回到:if (bByte==0) bitBit=0 else bitBit=1"的准则下.
例如:
define _rlca_() CY = ACC & 0x88 则编译结果为:
//4588 ANL      A,#0x88
//24FF ADD      A,#0xFF
要4个指令字节.
古道热肠 发表于 2007-12-1 17:03 | 显示全部楼层

楼主的Demo不规范

循环左移,保留最高位内容,再左移一位,最后将最高位的内容装配到最低位,循环右移与此相反。
C语言没有标准的循环移位,俺做控制时很不满意,只有想办法尽量避开它。

Demo

Bool bData_D7;

uchar ucSrcData;

uchar RLC_Data(uchar ucSrcData)
{
    bData_D7 = ucSrcData & 0x80;
    ucSrcData <<= 1;
    ucSrcData |= bData_D7;
    return(ucSrcData);
}
hotpower 发表于 2007-12-4 01:53 | 显示全部楼层

答案出自---《KeilC51红杏出墙记》节选

哈哈~~~估计这种"红杏出墙"好听的名称只有菜农能想出来~~~
相关链接:http://www.**/blog/hotpower/11894/message.aspx
ayb_ice 发表于 2007-12-4 08:05 | 显示全部楼层

回10L

”C语言没有标准的循环移位,俺做控制时很不满意,只有想办法尽量避开它。“
KEIL的内嵌函数_crol_,_cror_就是循环移位,好象还有几个也是。
xwj 发表于 2007-12-4 09:10 | 显示全部楼层

呵呵,LS正解,

经常听到没用这个、没用那个的

其实都是不看帮助也不仔细研究的:-)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

439

主题

3781

帖子

4

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