User`s manual

82 www.rabbit.com Applications Programming
We will now go through each part of this new while loop in detail:
while (1) {
costate {
// Check if a switch has been pressed
do {
flexDigInGroup16(switches, &switch_values);
} while (switch_values == 0x00);
Like before, we use a costatement to make implementing debouncing easier. Now notice the
flexDigInGroup16() function call. Like flexDigOutGroup16(), this function takes an array
of Flex_IOPin pointers. However, the second parameter is a pointer to an unsigned integer.
flexDigInGroup16() places the values read from the digital inputs into this unsigned integer
(switch_values, in this case). This is done in much the same way that the outputs are used in
flexDigOutGroup16(). That is, the value read from the first input in the group is placed in the least
significant bit in the unsigned integer; the second input value is placed in the next least significant bit; etc.
Note that having a do/while loop in a costatement is not an efficient design for cooperative multitasking,
since the costatement would not yield until a switch has been pressed. In a real-world application, busy
waiting such as this should be replaced with a waitfor statement and a function call to code that would
check for the switch press and return.
Notice that we are reading the switch inputs until one of the switches has been pressed. Because we read
the values in a group, we can check all switches simultaneously.
// Determine which switch was pressed
value = 1;
switch_pressed = switches;
led = leds;
switchnum = 1;
while (!(value | switch_values)) {
value <<= 1;
switch_pressed++;
led++;
switchnum++;
}
// switch_pressed now indicates which pin was pressed
Next, we must inspect the switch_values unsigned integer to determine which switch was pressed. To
do this, we use the value variable to check against each bit of switch_values. That is, we change
the bit that is set within the variable value in each iteration of the loop. By ORing the value variable
against switch_values, we can determine if the corresponding switch has been pressed.