int bdata ibase; /* Bit-addressable int */
char bdata bary [4]; /* Bit-addressable array */
sbit mybit0 = ibase ^ 0; /* bit 0 of ibase */
sbit mybit15 = ibase ^ 15; /* bit 15 of ibase */
sbit Ary07 = bary[0] ^ 7; /* bit 7 of bary[0] */
sbit Ary37 = bary[3] ^ 7; /* bit 7 of bary[3] */
The above example represents declarations, not assignments to the bits of the ibase and bary variables declared above. The expression following the carat symbol (^) in the example, specifies the position of the bit to access with this declaration. This expression must be a constant value. The range depends on the type of the base variable included in the declaration. The range is 0 to 7 for char and unsigned char, 0 to 15 for int, unsigned int, short, and unsigned short, and 0 to 31 for long and unsigned long.
extern bit mybit0; /* bit 0 of ibase */
extern bit mybit15 /* bit 15 of ibase */
extern bit Ary07; /* bit 7 of bary[0] */
extern bit Ary37; /* bit 7 of bary[3] */
Declarations involving the sbit type require that the base object be declared with the memory type bdata. The only exception to this are the variants for special function bits as discussed in the section entitled Special Function Registers later in this chapter.
Ary37 = 0; /* clear bit 7 in bary[3] */
bary[3] = 'a'; /* Byte addressing */
ibase = -1; /* Word addressing */
mybit15 = 1; /* set bit 15 ibase */
The bdata memory type is handled like the data memory type except that variables declared with bdata reside in the bit-addressable portion of the internal data memory. Note that the total size of this area of memory may not exceed 16 bytes.
union lft
{
float mf;
long ml;
};
bdata struct bad
{
char m1;
union lft u;
} tcp;
sbit tcpf31 = tcp.u.ml ^ 31; /* bit 31 of float */
sbit tcpm10 = tcp.m1 ^ 0;
sbit tcpm17 = tcp.m1 ^ 7;
NOTES
You may not specify bit variables for the bit
positions of a float. However, you may include the float and
a long in a union. Then, you may declare
bit variables to access the bits in the long type.
The sbit data type uses the specified variable as a
base address and adds the bit position to obtain a physical bit
address. Physical bit addresses are not equivalent to logical bit
positions for certain data types. Physical bit position 0 refers
to bit position 0 of the first byte. Physical bit position 8
refers to bit position 0 of the second byte. Since int
variables are stored high-byte first, bit 0 of the integer is
located in bit position 0 of the second byte. This is physical
bit position 8 when accessed using an sbit data type.