XC8 Code for PIC10F322 – Trigger Activated Dual Alternating Flasher – Model Train Level Crossing Lights

I am also in the process of releasing a new PIC10F322 Board, designed for people who want a platform to explore LED effects with the PIC10F322.  More to come on that later.

For the trigger Activated Dual Alternating Flasher – Model Train Level Crossing Lights circuit –  LEDs are connected for PORTA.0 and PORTA.1 – with PORTA.2 set as input.  When PORTA.2 is brought LOW, the LEDs will alternate.  When PORTA.2 goes back HIGH, the LEDS will turn off.

Here is the XC8 code for the Trigger Activated Dual Alternating Flasher – Model Train Level Crossing Lights

#include <xc.h>
#include <stdint.h>

//Device Configuration
#pragma config FOSC = INTOSC  // Oscillator Selection 
#pragma config BOREN = ON    // Brown-out Reset
#pragma config WDTE = OFF    // Watchdog Timer
#pragma config PWRTE = ON    // Power-up Timer
#pragma config MCLRE = OFF   // MCLR Pin Function Select bit->MCLR pin function is digital input, MCLR internally tied to VDD
#pragma config CP = OFF      // Code Protection 
#pragma config LVP = OFF     // Low-Voltage Programming 
#pragma config LPBOR = ON    // Brown-out Reset Selection bits
#pragma config BORV = LO    // Brown-out Reset Voltage Selection
#pragma config WRT = OFF    // Flash Memory Self-Write Protection

//Used to calculate the delay time - Change depending on processor Speed
#define _XTAL_FREQ 16000000  //16Mhz

void setup(void);
uint8_t input_debounce_A2(void);
void alternate_leds(void);

void main(void)
        uint8_t switch_status = 0;
        switch_status = input_debounce_A2();
        //The above is more long hand, it can be simplied down to.. 
        //if (input_debounce_A2()) - instead of creating a variable, reading the results into it - and compairing that variable, 
        if (switch_status == 1)
            LATAbits.LATA0 = 0; 
            LATAbits.LATA1 = 0;

void setup(void)
    //Disable analog for A.0, set as Output, Set to Low
    ANSELAbits.ANSA0 = 0;
    TRISAbits.TRISA0 = 0; //A.0 Output
    LATAbits.LATA0 = 0;  //Put A.0 low
        //Disable analog for A.1, set as Output, Set to Low
    ANSELAbits.ANSA1 = 0;
    TRISAbits.TRISA1 = 0; //A.1 Output
    LATAbits.LATA1 = 0;  //Put A.1 low
    //Setup A.2 as input with WPU
    ANSELAbits.ANSA2 = 0;
    TRISAbits.TRISA2 = 1;
    WPUAbits.WPUA2 = 1; //Enable Weakpull up on A.2   
    OPTION_REGbits.nWPUEN = 0; //Requires being enabled in option reg as well
    //Set the System Clock - You can change this to match the setting you are looking for
    OSCCONbits.IRCF = 0b111;  //Set System Clock to 16Mhz FOSC/4 = 4Mhz

/*reads the input on A.2 to see if it is low - we have a pullup here
 *so a low input would indicate that the switch that is tied to ground is being pressed
 *If low - we wait 50ms and read the status again
 *If low after 50ms, we return 1 to be true the switch is being pressed, otherwise 0 is returned. 
 *You also can adjust the value of the delay and do something like 1 second, which would require
 *the switch to be held for 1 second before something happens. */
uint8_t input_debounce_A2(void)
    if (PORTAbits.RA2 == 0)
        if (PORTAbits.RA2 == 0)
            return 1;
    return 0;  
    return 0;    

void alternate_leds(void)
    LATAbits.LATA0 = 0; //A.0 off
    LATAbits.LATA1 = 1; //A.1 on
    LATAbits.LATA1 = 0; //A.1 off
    LATAbits.LATA0 = 1; //A.0 on

Something You Might Be Intrested In


10F32X Rapid Prototype Board

Make The PIC10F322 and other PIC10F Processors Breadboard Friendly for Quick and Easy Prototyping.

{Click to learn more}

PIC10F322- XC8 Code - Trigger Activated Dual Alternating Flasher - Model Train Level Crossing Lights