#include <12F629.h>
#fuses LP,NOWDT,NOPROTECT,NOBROWNOUT
#use delay(clock=4000000)
#define ZERO_CROSSING pin_A5
#define OUTPUT pin_A4
void detect_zero(void);
void fireTriac(void);
void Pulse(unsigned int); // Sends pulse after int value
unsigned char dimmer = 0;
unsigned char ZC = 0;
unsigned char stat = 0;
void main (void)
{
SET_TRIS_A(0b101111); //All input and one output
OUTPUT_A(0x00);
while(TRUE)
{
dimmer = 0x00;
if(input(pin_A3) == 1){dimmer = 0x08;}
if(input(pin_A2) == 1){dimmer = dimmer | 0x04;}
if(input(pin_A1) == 1){dimmer = dimmer | 0x02;}
if(input(pin_A0) == 1){dimmer = dimmer | 0x01;}
detect_zero();
}
}
void detect_zero(void)
{
if(input(ZERO_CROSSING) == 1 && stat == 0)
{
stat = 1;
fireTriac();
}
if (input(ZERO_CROSSING) == 0 && stat == 1)
{
stat = 0;
fireTriac();
}
}
void fireTriac(void)
{
output_low(OUTPUT);
ZC++;
switch(dimmer)
{
case 0:
ZC = 0;
break;
case 1:
if(ZC == 5){Pulse(1);}
break;
case 2:
if(ZC == 2){Pulse(1);}
break;
case 3:
Pulse(175);
break;
case 4:
Pulse(150);
break;
case 5:
Pulse(125);
break;
case 6:
Pulse(100);
break;
case 7:
Pulse(75);
break;
case 8:
Pulse(50);
break;
case 9:
Pulse(25);
break;
case 10:
Pulse(1);
break;
}
}
void Pulse(unsigned int del)
{
delay_ms(del);
output_high(OUTPUT);
ZC = 0;
delay_ms(2);
output_low(OUTPUT);
}