×
嵌入式 > 嵌入式开发 > 详情

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

发布时间:2020-08-27 发布时间:
|
一: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言实现循环移位

在KeilC51中有这样一个库,其头文件为在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;



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

热门文章 更多
基于CAN总线与以太网的嵌入式网关电路设计