/******************************************************************** * FileName: (change filename of template).c * Processor: PIC18F4520 * Compiler: MPLAB C18 v.3.06 * * This file does the following.... * * * Author Date Comment *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ // (Your name here) /** Header Files **************************************************/ #include #include #include #include #include "LCD Module.h" /** Configuration Bits *********************************************/ #pragma config OSC = INTIO67 #pragma config WDT = OFF #pragma config LVP = OFF #pragma config BOREN = OFF #pragma config XINST = OFF /** Define Constants Here ******************************************/ #define SAMPLE 100 #define PRESSED 0 /** Local Function Prototypes **************************************/ void low_isr(void); void high_isr(void); void sampleFunction(void); void updateLCD(void); /** Declare Interrupt Vector Sections ****************************/ #pragma code high_vector=0x08 void interrupt_at_high_vector(void) { _asm goto high_isr _endasm } #pragma code low_vector=0x18 void interrupt_at_low_vector(void) { _asm goto low_isr _endasm } /** Global Variables ***********************************************/ int sampleVariable = 0; int stopwatchCounter = 0; char line1[17]; char counting = 0; /******************************************************************* * Function: void main(void) ********************************************************************/ #pragma code void main(void) { // Set the clock to 4 MHz OSCCONbits.IRCF2 = 1; OSCCONbits.IRCF1 = 1; OSCCONbits.IRCF0 = 0; // Pin IO Setup OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_12_TAD, ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS, 0x0B); // Four analog pins TRISA = 0xFF; // All of PORTA input TRISB = 0xFF; // All of PORTB input TRISC = 0x00; // All of PORTC output TRISD = 0x00; // All of PORTD output PORTC = 0x00; // Turn off all 8 Port C LEDs // Interrupt setup RCONbits.IPEN = 1; // Put the interrupts into Priority Mode // Add specific interrupts here... OpenTimer0( TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_16 ); INTCON2bits.TMR0IP = 1; // Timer 0 is high priority INTCONbits.GIEH = 1; // Turn on high priority interrupts // This area happens once // Good for initializing and things that need to happen once XLCDInit(); XLCDClear(); WriteTimer0(59286); while (1) { if (PORTBbits.RB0 == PRESSED) counting = 1; else if (PORTBbits.RB1 == PRESSED) counting = 0; else if (PORTBbits.RB3 == PRESSED) stopwatchCounter = 0; updateLCD(); // This area loops forever } } /***************************************************************** * Function: void high_isr(void) ******************************************************************/ #pragma interrupt high_isr void high_isr(void) { if (INTCONbits.TMR0IF){ INTCONbits.TMR0IF = 0; if (counting == 1) stopwatchCounter++; WriteTimer0(59286); } // Add code here for the high priority Interrupt Service Routine (ISR) } /****************************************************************** * Function: void low_isr(void) ********************************************************************/ #pragma interruptlow low_isr void low_isr(void) { // Add code here for the low priority Interrupt Service Routine (ISR) } #pragma code /***************************************************************** * Additional Helper Functions ******************************************************************/ /***************************************************************** * Function: void sample(void) * Input Variables: none * Output Return: none * Overview: Use a comment block like this before functions ******************************************************************/ void sampleFunction() { // Some function that does a specific task } void updateLCD(){ int bigno; int decimal; XLCDL1home(); bigno=stopwatchCounter/10; decimal=stopwatchCounter%10; sprintf(line1, "%13d.%1d",bigno,decimal); XLCDPutRamString(line1); }