Accessing Individual Bits

The mikroC PRO for FT90x allows you to access individual bits of registers, variables or constants. It also supports sbit and bit data types.

Lets use the bit 0 from the GPIO_PORT_00_07 as an example. This register is defined in the definition file of the particular MCU as :

sfr unsigned short volatile GPIO_PORT_00_07 absolute 0x00010084;

To access this bit in your code, you can write something like this :

// Clear GPIO_PORT_00_07 Bit 0
GPIO_PORT_00_07.0 = 0;

Another way of accesing bits is by using the direct member selector (.) with a variable, followed by one of identifiers (predefined global constants) B0, B1, … , B31, or F0, F1, … F31, with F31 being the most significant bit, to access the desired bit :

// predefined globals as bit designators
// Clear bit 0 in GPIO_PORT_00_07 register
GPIO_PORT_00_07.B0 = 0;

// Set GPIO_PORT_00_07.0 bit
GPIO_PORT_00_07.F0 = 1;

This kind of selective access is an intrinsic feature of mikroC PRO for FT90x and can be used anywhere in the code. Identifiers B0B31 are not case sensitive and have a specific namespace.

You may override them with your own members B0B31 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 :

// Set GPIO PIN0 Bit 
GPIO_PIN0_bit = 1;

In this way, if the GPIO_PIN0_bit changes its register or position in the register, you are sure that the appropriate bit will be affected.

sbit type

The mikroC PRO for FT90x 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 GPIO_PORT_00_07.B0; // this is where Abit is fully defined
...
void main() {  
...
}
  Note : Declaring a sbit variable is not possible via F0, F1, … F31 identifiers.

In this way the variable Abit will actually point to GPIO_PORT_00_07.0. Please note that we used the keyword sfr for declaration of Abit, because we are pointing it to GPIO_PORT_08_15 which is defined as a sfr variable.


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
...
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 GPIO_PORT_00_07; // 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 FT90x compiler provides a bit data type that may be used for variable declarations. It can not be used for argument lists, and function-return 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 :
Copyright (c) 2002-2015 mikroElektronika. All rights reserved.
What do you think about this topic ? Send us feedback!
Want more examples and libraries? 
Find them on LibStock - A place for the code