// Example_3.C
//
// Illustrates Pulsein and displaying quantities to the LCD.
//
// copyright, Peter H. Anderson, Baltimore, MD, April 9, '08
//

#case

#device PIC16F887 *=16 ICD=TRUE

#include <defs_887.h>

#define TRUE !0
#define FALSE 0

#define SUCCESS !0
#define FAILURE 0

byte pulse_in_1(unsigned long *p);

void ser_char(char ch);
void ser_init();
void delay_10us(byte t);
void delay_ms(long t);


void main(void)
{

   unsigned long us_5;
   float x;
   OSCCON = 0x61;
   not_rbpu = 0;  // insert pullups on PORTB
   ANSELH = 0x00;  // disable high six A/D
   ser_init();
   ser_char('?');
   ser_char('f');

   printf(ser_char, "Hello?");
   while(1)
   {
       if (pulse_in_1 (&us_5) == FAILURE)
       {
           printf(ser_char, "Failure?n");
       }
       else
       {
           x = 1.38 * us_5;
           printf(ser_char, "%lu?t%5.1f?n", us_5, x);

       }
       delay_ms(2000);
   }

}

byte pulse_in_1(unsigned long *p)
{
     unsigned long _0_ticks = 0,  _1_ticks = 0;

     while(portb0 == 0)
     {
        ++ _0_ticks;
        if (_0_ticks > 50000);
        return(FAILURE);
     }

     while(portb0 == 1)
     {
        ++ _1_ticks;
        if (_1_ticks > 50000)
        {
           return(FAILURE);
        }
     }
     *p = _1_ticks;
     return(SUCCESS);
}

void delay_10us(byte t)
// provides delay of t * 10 usecs (4.0 MHz clock)
{
#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 (4.0 MHz clock)
{
   do
   {
     delay_10us(100);
   } while(--t);
}

void ser_init(void)
{
    trisc6 = 0;
    portc6 = 1;
    delay_ms(200);
}

void ser_char(char ch) // 9600 baud
{

   byte dly, num_bits, gie_status;
     // start bit + 8 data bits
   gie_status = gie;
   while(gie)
   {
      gie = 0;
   }
   num_bits = 9;
#asm
   CLRWDT
   BCF STATUS, RP0
   BCF STATUS, C

LCD_CHAR_1:
   BTFSS STATUS, C
   BCF PORTC, 6
   BTFSC STATUS, C
   BSF PORTC, 6
   MOVLW 32
   MOVWF dly

LCD_CHAR_2:
   DECFSZ dly, F
   GOTO LCD_CHAR_2
   RRF ch, F
   DECFSZ num_bits, F
   GOTO LCD_CHAR_1

   BSF PORTC, 6
   CLRWDT
   MOVLW 100
   MOVWF dly

LCD_CHAR_3:
   DECFSZ dly, F
   GOTO LCD_CHAR_3
   CLRWDT
#endasm
   gie = gie_status;
}