// BLIP_LED.C
//
// When PORTB.4 is at ground, LED on PORTB.0 winks 5 times with a delay of one
// second.  When PORTB.4 is open, no flashing LED.
//
// copyright, Peter H. Anderson, Baltimore, MD, April, '16

#case

#device PIC16F1827 ICD=TRUE

#include <defs_1827.h>
#include <string.h>

#rom 0x8007 = {0x09e4, 0x0003}  // Manual Section 4.0

void delay_10us(byte t);
void delay_ms(long t);

#define TRUE 1
#define FALSE 0

#define MINUS 0
#define POSITIVE 1

#define SUCCESS 1
#define FAILURE 0

void blip_led(int num, byte t);

int main()
{
   ANSELB = 0x00;
   OSCCON = 0x6b; // 4.0 MHz interal
   wpub4 = 1;     // use internal pullup
   trisb4 = 1;
   wpuen_ = 0; 
   
   while(1)
   {
      if (portb4 == 0)
      {
          blip_led(5, 100);
          delay_ms(1000); 
      }
      else
      {
          portb0 = 0;
          delay_ms(100);
      }
   }
}

void blip_led(int num, byte t)
{
   int n;
   portb0=0;
   trisb0=0;
   for(n=0; n<num; n++)
   {
      portb0=1;
      delay_ms(t);
      portb0=0;
      delay_ms(t);
   }
}

void delay_10us(byte t)
{
#asm
//      BCF STATUS, RP0
DELAY_10US_1:
      CLRWDT
      NOP
      NOP
      NOP
      NOP
      NOP
      NOP
      DECFSZ t, F
      GOTO DELAY_10US_1
#endasm
}

void delay_ms(long t)   // delays t millisecs
{
   do
   {
     delay_10us(100);
   } while(--t);
}