Vous êtes sur la page 1sur 2

Accessing Individual Bits

Page 1 of 2

Accessing Individual Bits


mikroC PRO for PIC Specifics >

Accessing Individual Bits


The mikroC PRO for PIC allows you to access individual bits of 8-bit variables. It also supports sbit and bit data types.
Lets use the Global Interrupt Bit (GIE) as an example. This bit is defined in the definition file of the particular MCU as :
const register unsigned short int GIE = 7;
sbit GIE_bit at INTCON.B7;

To access this bit in your code by its name, you can write something like this:
// Clear Global Interrupt Bit (GIE)
INTCON.GIE = 0;

In this way, if GIE bit changes its position in the register, you are sure that the appropriate bit will be affected.
But, if GIE bit is not located in the designated register, you may get errors.
Another way of accesing bits is by using the direct member selector (.) with a variable, followed by one of identifiers B0, B1, , B7, or F0, F1, F7, with F7
being the most significant bit, to access the desired bit :
// predefined globals as bit designators
// Clear bit 0 in INTCON register
INTCON.B0 = 0;
// Set bit 0 in INTCON register
INTCON.F0 = 1;

In this way, if the target bit changes its position in the register, you cannot be sure that you are invoking the appropriate bit.
This kind of selective access is an intrinsic feature of mikroC PRO for PIC and can be used anywhere in the code. Identifiers B0B7 are not case sensitive and
have a specific namespace.
You may override them with your own members B0B7 within any given structure.
When using literal constants as bit designators instead of predefined ones, make sure not to exceed the appropriate type size.
Also, you can access the desired bit by using its alias name, in this case GIE_bit :

// Set Global Interrupt Bit (GIE)


GIE_bit = 1;

In this way, if the GIE bit changes its register or position in the register, you are sure that the appropriate bit will be affected.
Note : If aiming at portability, avoid this style of accessing individual bits, use the bit fields instead.
See Predefined Globals and Constants for more information on register/bit names.

sbit type
The mikroC PRO for PIC compiler has sbit data type which provides access to registers, SFRs, variables, etc.
You can declare a sbit variable in a unit in such way that it points to a specific bit in SFR register:
extern sfr sbit Abit; // Abit is precisely defined in some external file, for example in the main program unit

In the main program you have to specify to which register this sbit points to, for example:
sbit Abit at PORTB.B0; // this is where Abit is fully defined
...
void main() {
...
}

In this way the variable Abit will actually point to PORTB.0. Please note that we used the keyword sfr for declaration of Abit, because we are pointing it to
PORTB which is defined as a sfr variable.
Note : Declaring a sbit variable is not possible via F0, F1, F15 identifiers.
In case we want to declare a bit over a variable which is not defined as sfr, then the keyword sfr is not necessary, for example:
extern sbit AnotherBit; // AnotherBit is precisely defined in some external file, for example in the main program unit

char MyVar;
sbit AnotherBit at MyVar.B0; // this is where AnotherBit is fully defined
...

mk:@MSITStore:C:\Users\Public\Documents\Mikroelektronika\mikroC%20PRO%20f... 3/11/2015

Accessing Individual Bits

Page 2 of 2

void main() {
...
}

at keyword
You can use the keyword "at" to make an alias to a variable, for example, you can write a library without using register names, and later in the main program
to define those registers, for example :
extern char PORTAlias; // here in the library we can use its symbolic name

char PORTAlias at PORTB; // this is where PORTAlias is fully defined


...
void main() {
...
}

Note : Bear in mind that when using at operator in your code over a variable defined through a extern modifier, appropriate memory specifer must
be appended also.

bit type
The mikroC PRO for PIC compiler provides a bit data type that may be used for variable declarations. It can not be used for argument lists, and functionreturn values.
bit bf;

// bit variable

There are no pointers to bit variables:


bit *ptr;

// invalid

An array of type bit is not valid:


bit arr [5];

// invalid

Note :
n
n
n

Bit variables can not be initialized.


Bit variables can not be members of structures and unions.
Bit variables do not have addresses, therefore unary operator & (address of) is not applicable to these variables.

Related topics: Bit fields, Predefined globals and constants, Extern modifier

Copyright (c) 2002-2014 mikroElektronika. All rights reserved.


What do you think about this topic ? Send us feedback!

Want more examples and libraries?


Find them on

mk:@MSITStore:C:\Users\Public\Documents\Mikroelektronika\mikroC%20PRO%20f... 3/11/2015