how to write a program to control switch and LED

This program is based on How to Program Switch and LED Connected with PIC16F877A.
  
The following code demonstrate, how to write a program that scan the switch status and turn on and off LED. The switch is connected at PORTE bit-0 and LED connected on PORTB bit-0. When switch is read as high state, the LED is turn-on and when switch state is low, LED is turn-off. The switch debouncing rate is 5msec. The code is written in “mikroC PRO for PIC v.5.6.1” IDE and simulation is done with Proteus 8.0 SP0. 
PIC16F877A-I/L Datasheet
Code in mikroC
[code] // switch connected on porte
#define SW_AT_PORT PORTE
// debounce rate 5msec
#define DBOUNCE_RATE 5
// direction signal
sbit LED_dir at TRISB.B0;
sbit SW_dir at TRISE.B0;
// bit labels portb
sbit LED at PORTB.B0;
sbit SW at PORTE.B0;
// old state save flag
bit oldstate_one_to_zero;
bit oldstate_zero_to_one;
void main(void)
{
// set porta and porte as digital
ADCON1 = 0x06;
// set direction as output
LED_dir = 0;
// set direction as input
SW_dir = 1;
// init LED
LED = 0;
// init old state flag
oldstate_one_to_zero = 0;
oldstate_zero_to_one = 0;
while(1)
{
// Detect logical one
if(Button(&SW_AT_PORT, 0, DBOUNCE_RATE, 1))
{
// Update flag
oldstate_one_to_zero = 1;
}
// Detect one-to-zero transition
if (oldstate_one_to_zero && Button(&SW_AT_PORT, 0, DBOUNCE_RATE, 0))
{
// Update flag
oldstate_one_to_zero = 0;
// LED ON
LED = SW;
}

// Detect logical zero
if(Button(&SW_AT_PORT, 0, DBOUNCE_RATE, 0))
{
// Update flag
oldstate_zero_to_one = 1;
}
// Detect zero-to-one transition
if (oldstate_zero_to_one && Button(&SW_AT_PORT, 0, DBOUNCE_RATE, 1))
{
// Update flag
oldstate_zero_to_one = 0;
// LED OFF
LED = SW;
}
}} [/code]

narne (author) 3 months ago

Picture is as following

9.4.7.png