㈠ 单片机 移位操作 右移 C语言
先说第一个问题:
比如用查表法将结果保存到变量i中,查表变量为x,则i=table[x],记住c语言里面数组是从0开始的,比如说上面的0x01就是table[0],0x02是table[1],以此类推。
再说第二个问题:
比如说从p1.0口发送出去,则可以写为
sbitout=p1^0;//定义out为p1.0口,这样今后好写程序
chari;
for(i=0;i<8;i++)
{
out=data&0x80;//因为高位在前,将它写成二进制就明白了
data<<=1;
}
上面的程序就能搞定了;
应该是所有的单片机都有cy位(不知道浮点dsp有没有);
c语言中左移和右移之后低位或高位自动补零,cy位也保持为零(视编译器而定,这个得看编译器手册),有些编译器提供了循环移位的函数;
还有什么不明白的补充问题就是
㈡ 单片机C语言中位的运用,
你这样会有问题的,如果你想只操作1bit,可以这样:
P1=
P1^(1<<h);h++;当然要反复循环还要加些循环控制
㈢ 在单片机的C语言程序设计中,如何使用SFR和可寻址位
你好!
在c语言中无法对SFR(特殊寄存器),比如程序状态寄存器(PSW)等寄存器进行操作,也就不能判断它们的标志位了。比如判断Z标志位,C标志位等操作。对于要操作这类寄存器。我们唯一的办法只能用汇编语言。或者在C语言中嵌入汇编语言来解决。所以我们写单片机程序千万不能放弃汇编语言。某些底层的硬件操作只能靠汇编语言来完成。
希望对你有所帮助,望采纳。
㈣ 请问:单片机c语言中如何实现将变量A中某1位赋值给B中某1位的操作
假锋茄并如将A第三位赋给B第二纳销位
对于C51架构单片机,可使用位寻址:
bdata A, B;
sbit a3 = A^3; //位变量指向A第三位
sbit b2 = B^2;
b2 = a3;
对于其他任何类型单片银迹机,可使用位操作宏(同样适用于C51):
#define get_bit(var, n) (var & (1<<n))
#define set_bit(var, n) (var |= (1<<n))
#define clr_bit(var, n) (var &= ~(1<<n))
使用方法
if(get_bit(A, 3))set_bit(B, 2);
else clr_bit(B, 2);
这是速度最快的方法。移位操作在编译的时候已经被优化了。
㈤ 单片机机 中怎样和哪几种字节位操作的方式,最好给点C语言代码并解释
1、ANSIC中,一般采用“读-修改-写”的方法实现单个位的位操作,通过与0“与”操作,将某一位清0。如使i变量的b0位为0,实现方法为i=i&0xfe。通过与1“或”操作,将某一位置1。如使i变量的b0位为1,实现方法为i=i|0x01。通过与1“异或”操作,将某一位取反。如使i变量的b0位取反,实现方法为i=i^0x01。
2 、通过位域的方法实现位操作
标准C提供了一种基于结构体的数据结构--位域(BitField),位域就是把一个存储单元中的二进制划分为几个不同的区域。并说明每个区域的位数。每一个域有一个域名,允许在程序中按域名进行操作,位域的定义格式如下:
struct 位域结构名{
位域列表 };
位域列表格式为:类型说明符 位域名:位域长度如:
struct k{
unsigned int a:1
unsigned int :2
unsigned int b:3
unsigned int :0 //空域
}k1;
说明:
1)各位依次从低位到高位排列,排满一个存储单元,按地址接着排下一单元;
2)位域可以无域名,但不能被引用,如第二域,这时其只用来填充或调整位置;
3)第四行称空域,目的是将目前存储单元的剩余部分分为一个域,且填充0。
位域的引用很简单,如:
k1.a=1; //置k1的b0位为1
k1.b=7; //将k1的b3-5位置111
通过位域定义位变量,是实现单个位位操作的重要途径和方法,采用位域定义位变量,产生的代码紧凑、高效。
㈥ 单片机程序中数组中的值怎么实现位左(右)移(C语言)
data
=
nBitmapDot[i]
>>
1;
//
nBitmap[i]右移一个二进制位,与
data
=
nBitmapDot[i]
/
2;
同效。
data
=
nBitmapDot[i]
<<
1;
//
nBitmap[i]左移一个二进制位,与
data
=
nBitmapDot[i]
*
2;
同效。
要说明的是移位操作(<<
或
>>)效率更高。
㈦ 单片机 移位操作 右移 C语言
aa=_crol_(aa,1); //左移一位
aa=_cror_(aa,1); //右移一位
可以打开:intrins.h,查看。