PIC16C505 - LED Flash


This is one of some 75 routines in a collection of routines for "Little PICs" including the PIC12C509, PIC12CE519, PIC16C505, PIC16HV540, PIC12C672, PIC12CE674.

// FLSH_Q.C (PIC16C505), CCS PCB
//
// Intended for possible use with frost alarm in place of serial output
// to serial LCD or to PC Com Port.
//
// When input PORTB3 is at ground, T_threshold is output to LED on PORTC0.
// When input PORTB3 is not at ground, the current value of T_C is output on
// the LED.  Note that readings are dummied in a constant array.
//
// In outputting the quantity, a long flash indicates a minus.  Each digit is
// output as a series of 250 ms flashes.  Interdigit time of 1 sec.  Five seconds
// between outputting each quantity.
//
//
//  GRD --- \---- PORTB3 (term 4) (internal weak pull-up enabled)
//
//                PORTC0 (term 10)  --------- 330 --->|--- GRD
//
// Use internal RC oscillator.   Internal /MCLR.  Tested using RICE-17, July 19, '01
//
// copyright, Peter H. Anderson, Elmore, VT, July, '01

#case

#device PIC16C505 *=8

#include <defs_505.h>
#include <delay.h>

#define TRUE !0
#define FALSE 0

void flash_q(byte q, byte minus_flag);

void main(void)
{
   byte T_threshold = 34, T_C, minus_flag, n;
   byte const T_C_array[5] = {-5, 0, 1, 25, 70};  // dummy values of temperature

   DIRB = 0x3f;
   DIRC = 0x3f;

   not_rbpu = 0;	// enable internal weak pullups
#asm
    OPTION
#endasm

   while(1)
   {

     if(!portb3) // if switch at ground
     {
        flash_q(T_threshold, FALSE);	// assumed to never be false
        delay_ms(5000); // five secs between displays
     }

     else
     {
        for (n = 0; n< 5; n++)		// for each of five temperatures
        {
           T_C = T_C_array[n];
           if (T_C & 0x80)		// if its negative
           {

              minus_flag = TRUE;
              T_C = (~T_C) + 1;
           }
           else
           {
              minus_flag = FALSE;
           }
           flash_q(T_C, minus_flag);
           delay_ms(5000);
        }	// end of for
     }	// end of else
  }  // end of while
}

void flash_q(byte q, byte minus_flag)
{
   byte n, digit;

   dirc0 = 0;
#asm
   MOVF DIRC, W
   TRIS PORTC
#endasm

   if (minus_flag)
   {
       portc0 = 1;
       delay_ms(500); // long delay to indicate minus
       portc0 = 0;
       delay_ms(1000); // delay between digits
   }

   digit = q/10; // number of tens
   if (digit)     // if non zero
   {
      for (n=0; n<digit; n++)
      {
         portc0 = 1;
         delay_ms(250);
         portc0 = 0;
         delay_ms(250);
      }

      delay_ms(1000); // separation between digits
   }

   digit = q%10;
   if (!digit)
   {
       digit = 10;
   }

   for (n=0; n<digit; n++)
   {
       portc0 = 1;
       delay_ms(250);
       portc0 = 0;
       delay_ms(250);
   }

   delay_ms(500); // separation between digits
}

#include <delay.c>