快捷搜索:

PIC单片机位域结构的应用解析

在写法度榜样中碰到要用标志位的环境,以为可以和keil51一样进行位定义,虽知道不停报错,后来才知道MC18编译器是不支持位定义的(PICC18编译器倒是支持的)下面给出一种办理法子—》位域布局体。

有些信息在存储时,并不必要占用一个完备的字节, 而只需占几个或一个二进制位。例如在寄放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处置惩罚简便,C说话又供给了一种数据布局,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不合的区域,并阐明每个区域的位数。每个域有一个域名,容许在法度榜样中按域名进行操作。 这样就可以把几个不合的工具用一个字节的二进制位域来表示。一、位域的定义和位域变量的阐明位域定义与布局定义相仿,其形式为:

struct 位域布局名

{ 位域列表 };

此中位域列表的形式为: 类型阐明符 位域名:位域长度

例如:

struct bs

{

int a:8;

int b:2;

int c:6;

};

位域变量的阐明与布局变量阐明的要领相同。 可采纳先定义后阐明,同时定义阐明或者直接阐明这三种要领。例如:

struct bs

{

int a:8;

int b:2;

int c:6;

}data;

阐明data为bs变量,共占两个字节。此中位域a占8位,位域b占2位,位域c占6位。对付位域的定义尚有以下几点阐明:

1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不敷寄放另一位域时,应从下一单元起寄放该位域。也可以故意使某位域从下一单元开始。例如:

struct bs

{

unsigned a:4

unsigned :0 /*空域*/

unsigned b:4 /*从下一单元开始寄放*/

unsigned c:4

}

在这个位域定义中,a占第一字节的4位,后4位填0表示不应用,b从第二字节开始,占用4位,c占用4位。

2. 因为位域不容许跨两个字节,是以位域的长度不能大年夜于一个字节的长度,也便是说不能跨越8位二进位。

3. 位域可以无位域名,这时它只用来作添补或调剂位置。无名的位域是不能应用的。例如:

struct k

{

int a:1

int :2 /*该2位不能应用*/

int b:3

int c:2

};

从以上阐发可以看出,位域在本色上便是一种布局类型, 不过其成员是按二进位分配的。

二、位域的应用

位域的应用和布局成员的应用相同,其一样平常形式为: 位域变量名·位域名 位域容许用各类款式输出。

main(){

struct bs

{

unsigned a:1;

unsigned b:3;

unsigned c:4;

} bit,*PBit;

bit.a=1;

bit.b=7;

bit.c=15;

printf(“%d,%d,%dn”,bit.a,bit.b,bit.c);

PBit=&bit;

PBit-》a=0;

PBit-》b&=3;

PBit-》c|=1;

printf(“%d,%d,%dn”,PBit-》a,PBit-》b,PBit-》c);

}

上例法度榜样中定义了位域布局bs,三个位域为a,b,c。阐清楚明了bs类型的变量bit和指向bs类型的指针变量PBit。这表示位域也是可以应用指针的。

法度榜样的9、10、11三行分手给三个位域赋值。( 应留意赋值不能跨越该位域的容许范围)法度榜样第12行以整型量款式输出三个域的内容。第13行把位域变量bit的地址送给指针变量PBit。第14行用指针要领给位域a从新赋值,赋为0。第15行应用了复合的位运算符“&=”, 该行相称于: PBit-》b=PBit-》b&3位域b华夏有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为3)。同样,法度榜样第16行中应用了复合位运算“|=”, 相称于: PBit-》c=PBit-》c|1其结果为15。法度榜样第17行用指针要领输出了这三个域的值。

滥觞;21ic

您可能还会对下面的文章感兴趣: