// BLIP_LED.C  (PIC16F1507)
//
// When PORTB.7 is at ground, LED on PORTB.6 winks 5 times with a delay of one
// second.  When PORTB.7 is open, no flashing LED.
//
// copyright, Peter H. Anderson, Baltimore, MD, Dec, '11

#case

#device PIC16F1507 

#include <defs_1507.h>

#rom 0x8007 = {0x09e4, 0x0003}

#fuses INTRC_IO, WDT,  MCLR, PROTECT, CPD, NOBROWNOUT, NOCLKOUT
#fuses WRT, STVREN, NOLVP


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

void blip_led(int num, byte t);

void main()
{
   ANSELB = 0x00;

   OSCCON = 0x6b; // 4.0 MHz interal

   wpub7 = 1;     // use internal pullup
   trisb7 = 1;
   wpuen_ = 0;

   while(1)
   {
      if (rb7 == 0)
      {
          blip_led(5, 100);
          delay_ms(1000);
      }
      else
      {
          trisb6 = 0;
          latb6 = 0;
          delay_ms(100);
      }
   }
}

void blip_led(int num, byte t)
{
   int n;
   latb6=0;
   trisb6=0;
   for(n=0; n<num; n++)
   {
      latb6=1;
      delay_ms(t);
      latb6=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);
}