c语言 怎么对位进行替换

  •    234游戏网友 提出于 2019-07-27 01:02:40
  • 就是在单片机keil编程中,有sbitCY=PSW^7,sbitK=P1^0,要想把这两个位所贮存的二进制数值进行替换,应该怎么替换?或者请告诉我怎么利用左移指令与逻辑运算指令怎样实现循环左移...

    请注意:本网坚决拥护中国共产党领导,坚决打击任何违规违法内容,若您发现任何有害信息,请E-Mail:q@qimei168.com举报,我们核实后将给予现金奖励!爱国是每个中国人应尽的责任,爱国从我做起!为实现中国梦,实现中国腾飞而努力!

    2019-04-24 10:15:45

    最佳回答 就是交换两个变量是吧。另设一个中间变量即可实现。
    sbit CY=PSW^7;
    sbit K= P1^0;
    sbit temp;
    temp=CY;
    CY=K;
    K=temp;
    这个思想您应该能明白吧。呵呵。

    实现循环左移是吧,就是最高位移到最低位,然后顺次左移。
    左移指令是把最高位移到C(进位/借位标志)里面,所以需要把这个标志放到最低位,也就是说使最低位和进位标志一样。
    设最高位为A,最低位为B,可得最低位应该为 A非*B+A*B
    因此不能用一个独立的逻辑运算(与、或、非、异或)实现,按照上面给出的公式即可运算,注意最高位A是在C进位标志中的。

    呵呵,这个明白了吗?更多追问追答
    追问:我刚试过,但是运行不成功。希望帮我纠正其中的错误,万分感谢!(是否是寄存器PSW的CY有什么特殊的原因,还是位与位之间不能用赋值“=”运算)
    追答:嗯。首先aa是uchar类型的,不能使用操作符“^”,这个操作符只对P0到P3有效,而且得定义在main函数之前,也就是宏定义之后的位置。

    改正:把所有sbit类型的变量声明在主函数之前,并且赋初值。
    可以先定义 sbit K=P0^0; 然后在调用函数中修改P0的值,这时候K的值也可以改变的。

    所以您的corl函数中只需要写以下语句:
    aa=aa<<1;
    P0=aa;
    temp=K;
    K=CY;
    CY=temp; //其实这里不需要这么复杂,您只是需要把最低位变为和CY的值一样,所以直接
    //K=CY 即可,不需要交换他们的值,交换之后没用。
    这时P0口中已经是循环左移之后的值了,所以不需要返回值,main函数中也不需要再对P0口赋值了。但是要修改aa的值,要保证进入corl函数时,aa的值是当前P0的值。

    您再试试,还不行的话,把源程序粘贴过来,我给您调试。您是要实现循环亮灯?
    追问:还是得麻烦你帮我调试一下了!
    #include
    #define uint unsigned int
    #define uchar unsigned char
    sbit K=P1^0;
    void delayms(uint);
    uchar crol();
    uchar aa;
    void main()
    {aa=0xfe;
    while(1)
    {P1=aa;
    delayms(50000);
    aa=crol();}
    }
    void delayms(uint xms)
    {uint i,j;
    for(i=xms;i>0;i--)
    for(j=110;j>0;j--);}
    uchar crol()
    {aa=aa<<1;
    P1=aa;
    K=CY;}
    追答:OK,给您调试好了。您自己对应一下哪里还不清楚,程序能正确执行,得到正确结果。

    #include //我用的是89c51做的仿真
    #define uint unsigned int
    #define uchar unsigned char
    sbit K=P1^0;
    void delayms(uint);
    void crol(); //这里不需要返回值 aa是全局变量
    uchar aa;
    void main()
    {aa=0xfe;
    P1=aa; //只需要最开始给P1口赋初值即可 while里面不需要再赋值 在crol函数中改变P1的值
    while(1)
    {
    delayms(500);
    crol();}
    }
    void delayms(uint xms)
    {uint i,j;
    for(i=xms;i>0;i--)
    for(j=10;j>0;j--);}
    void crol()
    {aa=aa<<1; //aa左移 记住aa始终保存的是P1口的上一个状态
    P1=aa; //左移之后给P1 这时P1.0还是0
    K=CY; //修改P1.0的值为刚刚移出来的那个值在CY中
    aa=P1; //修改aa的值 以便下一次利用
    }

    这回明白了吧。呵呵

    若未找到您需要的回答,请添加微信公众号每日时讯榜(搜索公众号234游戏网或者,第一个公众号即是)留言即可,管理员会在第一时间内给予答复。

    2019-04-24 10:15:45


      • 分类:网游

      网友的 0 个回答

      相似问题



      精彩推荐


      相关标签