You are on page 1of 6

//Reading header file

#include <htc.h>

//Bits Configuration

//Function proto-type declaration;
void Initialize(void);
void LED_Tasking3(void);

//Macro definition
#define SW1 PORTEbits.RE0
#define SW2 PORTEbits.RE1
#define LED2 LATBbits.LATB1
#define LED3 LATBbits.LATB2
#define LED4 LATBbits.LATB3

#define TMR0IF INTCONbits.TMR0IF
#define TMR0IE INTCONbits.TMR0IE
#define PEIE INTCONbits.PEIE
#define TMR0IP INTCON2bits.TMR0IP
#define GIE INTCONbits.GIE

enum TaskCollection //Task Prototype
{MULA,LEDON,LEDOFF,TAMAT,LED4ON} //Task Constant
Task; //Task Variable

//Public variables
unsigned char IntFlag=0;
unsigned int Timer1=0,Timer2=0,Timer3=0,Timer4=0;

//Interrupt Function
void interrupt InterruptHandlerHigh(void)
{
//TIMER0 10ms Interrupt
if(TMR0IF){ //Interrupt flag
TMR0L=100; //set 10ms preload
TMR0IF=0; //Clear Interrupt Flag
IntFlag=1;
//Software Timer
if(Timer1) Timer1--;
if(Timer2) Timer2--;
if(Timer3) Timer3--;
if(Timer4) Timer4--;


}
}

//Program Utama
void main(void)
{
Initialize();
//Init variables
Task=MULA;

//Main Loop
while(1)
{
LED_Tasking3();
}
}

//Init Micro-controller
void Initialize(void)
{
//Initialize I/O
OSCCON=0x52; //INTOSC 4MHz 0b01010010
ANSELA=3; //PIC18F45K22 RA0,RA1 as Analog
ANSELB=0; //PIC18F45K22
ANSELE=0;
TRISB=0b11000000; //PORTB I/O Direction (0:Output 1:Input)
LATB = 0; //Clear PORTB

//Timer0 - 8bit mode, Prescaler 1:64, Interrupt 16.384ms
TMR0IE = 1; // Enable timer0 interrupt
TMR0IP = 1; // Make timer0 interrupt high priority
//8bit mode, 10ms interrupt (100tick/sec)
T0CON = 0b11000101; //4MHz 8bit,T0PS=1:64
PEIE = 1; //Enable perhipheral interrupts
GIE = 1; //Enable global interrupts
}

//Tasking3 Example
void LED_Tasking3(void)
{
switch(Task)
{
case MULA:
if(!SW1) //if(SW1==0)
{
Timer2=200;
Task=LEDON;
}
break;
case LEDON:
if(!Timer2) //if(Timer2==0)
{
LED2=1; //Turn On LED
Timer2=50; //500ms
Task=LEDOFF;//Set next task
}
break;
case LEDOFF:
if(!Timer2) //if(Timer2==0)
{
LED2=0; //Turn Off LED
Timer2=50; //500ms
Task=LEDON; //Set next task
}
break;
case TAMAT:
LED2=0; //Turn Off LED
Timer2=0; //reset timer2
LED3=1;
Timer3=400;
Task=LED4ON; //init task
break;
case LED4ON:
if(!Timer3) //if(Timer2==0)
{
LED3=0; //Turn Off LED
Timer3=0; //500ms
LED4=1;
Task=MULA; //Set next task
}
break;
default: //tiada dalam 'case' di atas
Task=MULA;
break;
}
//
if(!SW2) Task=TAMAT;
}

You might also like