int vswitch; | // state of virtual | switch controlled by button | ||
S1 |
|
|
|
|
main(){ | // begin main program | |||
|
| // set up parallel port A as output | ||
| WrPortI(SPCR,NULL,0x84); |
|
| |
| WrPortI(PADR,&PADRShadow,0xff); | // | turn off all LEDs | |
| vswitch=0; |
| // initialize virtual switch off | |
(1) | while (1) { |
| // | Endless loop |
| BigLoopTop(); | // Begin a big endless loop | ||
| // first task flash LED DS4 every second | for 200 milliseconds | ||
(2) | costate { |
| // | begin a costatement |
| BitWrPortI(PADR,&PADRShadow,0,3); | // | LED DS4 on | |
(3) | waitfor(DelayMs(200)); | // | light on for 200 ms | |
| BitWrPortI(PADR,&PADRShadow,1,3); | // | LED DS4 off | |
| waitfor(DelayMs(800)); | // | light off for 800 ms | |
(4) | } |
| // | end of costatement |
//second task - debounce switch #1 and toggle virtual switch vswitch
//check button 1 and toggle vswitch on or off
costate {
(5)if(BitRdPortI(PBDR,2)) abort; // if button not down skip out
waitfor(DelayMs(50)); | // | wait 50 ms |
|
if(BitRdPortI(PBDR,2)) abort; | // | if button not still down skip | |
out |
|
|
|
vswitch=!vswitch; // toggle virtual switch- button | was down 50 | ||
ms |
|
|
|
while (1) { | // wait for button to be off 200 ms | ||
waitfor(BitRdPortI(PBDR,2)); | // | wait for button to | go up |
waitfor(DelayMs(200)); | // | wait for 200 milliseconds | |
if(BitRdPortI(PBDR,2)) break;// | if button up break |
| |
} | // | end of while(1) |
|
} | // | end of costatement |
|
//make LED agree with vswitch if vswitch has changed
(6)if( (PADRShadow & 1) == vswitch) { BitWrPortI(PADR,&PADRShadow,!vswitch,0);
| ) |
(7) } | // end of while loop, go back to start |
} | // end of main, never come here |
The numbers in the left margin are reference indicators and are not a part of the code. Load and run the program. Note that LED DS4 flashes once per second. Push button S1 several times and note how LED DS1 is toggled.
The flashing of LED DS4 is performed by the costatement starting at the line marked (2). Costatements need to be executed regularly, often at least every 25 ms. To accomplish this, the costatements are enclosed in a while loop. The term while loop is used as a handy way to describe a style of
User’s Manual | 49 |