×
单片机 > 单片机程序设计 > 详情

KeilC51下的带进位循环右移指令是什么

发布时间:2020-06-16 发布时间:
|
一:C语言实现循环移位:

比如将a=0x45循环左移二位。a循环左移n位,即将原来右面(8-n)位左移n位,而将原来左端的n位移到最右面n位。

实现步骤:

1、将a的左端n位先放到b中的高n位中   
  b=>>(8-n);   
2、将a左移n位,其右面高n位被补0   
  c=< 3、将b,c进行或运算   
  a=c|b;   
程序如下:   
  main()   
  {   
    unsigned   char   a=0x45,b,c;   
    unsigned   int   n=2;   
    b=a>>8-n)   
    c=a<     a=c|b;   
  }  

二:Keil C言实现循环移位

在Keil C51中有这样一个库,其头文件为在C51\INC目录下,有以下几个操作,它不是函数,但象函数,它们有入口出口,但是,没有返回RET语句,如果有这些操作,用disassembly窗口可以看到是将代码直接嵌入到你的代码中,其效率很高,比如一个空操作,_nop_()   嵌入的代码就是一个NOP指令。   在这个库中,有如下操作:   
  unsigned   char   _chkfloat_(float   val)   检查浮点数状态   
  返回值:0:   standard   floating-point   numbers   
                1:   Floating-point   value   0   
                2:+INF   (positive   overflow)   
                3:-INF   (Not   a   number)   error   status   
  unsigned   char   _crol_(         //字节的多次循环左移   
                          unsigned   char   c,   //C左移的字符   
                          unsigned   char   b);//b左移的位数   
  unsigned   char   _cror_(         //字节的多次循环右移   
                          unsigned   char   c,   //C右移的字符   
                          unsigned   char   b);//b右左移的位数   
  unsigned   int     _irol_   (         //字的循环左移   
                          unsigned   int   c,     //c左移的字   
                          unsigned   char   b);//b左移的次数   
  unsigned   int     _iror_   (         //字的循环右移   
                          unsigned   int   c,     //c右移的字   
                          unsigned   char   b);//b右移的次数   
  unsigned   long   _lrol_   (         //4字节(双字)的循环左移   
                          unsigned   long   c,//c左移的双字   
                          unsigned   char   b);//b左移的次数   
  unsigned   long   _lror_   (         //4字节(双字)的循环右移   
                          unsigned   long   c,//c右移的双字   
                          unsigned   char   b);//b右移的次数   
  void   _nop_     (void);         //NOP   8051中的空操作   
  bit     _testbit_   (bit   b);//8051中的JBC指令,测试b,然后清0,返回b的值。

下面是我自己以前写的东西   
      汇编的移位操作很容易   RR   RRC   RL   RLC   
      C51中,移出很容易,<<   >>   ;移入操作中的左移入也容易,困难在右移入   
  一:IC读写应用   
  1:送数   
  送两个单独字节的数据的程序,左送   &0x80             右送   &0x01       
                  bit   out;   
                  out   =   low   &   0x01;                 
                  low   >>=   1;   
                  low   |=   (high   &   0x01)<<7;   
                  high   >>=   1;   
            
    2:取数(不管怎么移入,第一次操作之后获取的那一位数据必须在接受数据的最高位或   者最低位上,从而选择是先取数还是先移位)    a:如果是先接受高位后接受低位   则先左移一位后接受一位数据(i2c总线)   
          uchar   i;   
          uchar   temp   =   0;   
          uchar     date   =   0x82;   
          for   (i   =   0;   i   <   8;   i++)   
          {   
                  temp   <<=   1;                           //左移   
                  temp   |=   (bit)(date   &   0x80);     
                  date   <<=   1;   
          }   
            
        b:如果是先接受低位,后接受高位   则先接受一位数据后循环右移一位   
          uchar   i;   
          uchar   temp   =   0;   
          uchar   date   =   0x82;   
          for   (i   =   0;   i   <   8;   i   ++)   
          {                 
                  temp   |=   (bit)(date   &   0x01);   
                  date   >>=   1;             
                  temp   =   _cror_(temp,1);   
                  //循环右移,应用_cror_()需要包含头文件     
          }   
          如果不用函数   
          则for循环应该这样写   
          for   (i   =   0;   i   <   8;   i   ++)   
          {                 
                  temp   >>=   1;   
                  temp   |=   (date   &   0x01)   <<   7;   
                  date   >>=   1;             
                    
          }   
    三:任意一位的置位或者取反运算   
      置位运算   
  low   |=   0x01;     (置最低位为1)   
  取反运算   
                low   |=   ~low   &   0x01;   
  四:合并和拆分数据   
  1:合并两个单字节数据为一个双字节数据   
          int   len;   
          uchar   low;   
          uchar   high;   
          Len   |=   high;   
          Len   <<=   8;   
          Len   |=   low;   
  2:   拆分一个双字节数据为两个单字节数据   
          int   len;   
          uchar   low;   
          uchar   high;   
          low   |=   len;   
          high   |=   len   >>   8;      

关键字:Keil  C51  带进位循环  右移指令

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式