打印

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

[复制链接]
1684|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指令来代替
你还是仔细看看编译器的帮助吧

使用特权

评论回复
5
ayb_ice| | 2007-12-1 09:33 | 只看该作者

这都看不懂

使用特权

评论回复
6
沈老| | 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
}

使用特权

评论回复
7
许世霞|  楼主 | 2007-12-1 11:46 | 只看该作者

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

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


使用特权

评论回复
8
ayb_ice| | 2007-12-1 14:11 | 只看该作者

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

你也太不开窍了。
还可以1位送到8,16,32呢,还有8位送16,32。。。。

使用特权

评论回复
9
沈老| | 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个指令字节.

使用特权

评论回复
10
古道热肠| | 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);
}

使用特权

评论回复
11
hotpower| | 2007-12-4 01:53 | 只看该作者

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

哈哈~~~估计这种"红杏出墙"好听的名称只有菜农能想出来~~~
相关链接:http://www.**/blog/hotpower/11894/message.aspx

使用特权

评论回复
12
ayb_ice| | 2007-12-4 08:05 | 只看该作者

回10L

”C语言没有标准的循环移位,俺做控制时很不满意,只有想办法尽量避开它。“
KEIL的内嵌函数_crol_,_cror_就是循环移位,好象还有几个也是。

使用特权

评论回复
13
xwj| | 2007-12-4 09:10 | 只看该作者

呵呵,LS正解,

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

其实都是不看帮助也不仔细研究的:-)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

439

主题

3781

帖子

4

粉丝