/************************************************************/
/* PWM Generator Using Timer2                               */
/* P1.2 Light On & Off                                      */
/* Timer2 : 300us                                           */
/* 300us divide 20 section                                  */
/*                                                          */
/*     10000 00000 00000 00000                              */
/*     11000 00000 00000 00000                              */
/*     11100 00000 00000 00000                              */
/*     ..... ..... ..... .....                              */
/*     11111 11111 11111 11111                              */
/*                                                          */
/*                                                          */
/*        http://www.electoy.net                            */
/*           Timy's Electoy Cafe                            */
/*                                                          */
/************************************************************/

#include "at89x52.h"

#define	MSB_reload_value 0xFD	/* msb reload value exemple	: 24MHz - 300us Generate */
#define	LSB_reload_value 0xA8	/* lsb reload value exemple	: 24MHz - 300us Generate */

#define	LED1	P1_0
#define	LED2	P1_2
#define	LED3	P1_4
#define	LED4	P1_6

#define	ON		1
#define	OFF		0

typedef	unsigned char	u08;
typedef	char 			s08;
typedef	unsigned int 	u16;
typedef	int				s16;

u08	count = 0;
volatile u16 cnt;
u08 B_cnt_pwm;
s08 B_dimer;
bit Direct=1;

void init_T2(void)			// 24MHz X-TAL
{
	T2MOD	&= 0xFC; 		/*	T2OE=0;DCEN=1; */
	T2MOD	|= 0x01;
	EXF2=0;					/* reset flag */
	TCLK=0;RCLK=0; 			/* disable baud rate generator */
	EXEN2=0; 				/* ignore events on T2EX	*/
	TH2=MSB_reload_value;	/* Init msb_value */
	TL2=LSB_reload_value;	/* Init lsb_value */
	RCAP2H=MSB_reload_value;/* reload msb_value	*/
	RCAP2L=LSB_reload_value;/* reload lsb_value	*/
	C_T2=0;					/* timer mode	*/
	CP_RL2=0;				/* reload mode */
	EA=1;					/* interupt	enable */
	ET2=1; 					/* enable timer2 interrupt	*/
	TR2=1; 					/* timer2 run */
}

void it_timer2(void) interrupt 5 /*	interrupt	address	is 0x002b	*/
{
	if(B_cnt_pwm <= B_dimer) LED2 = ON;
		else LED2 = OFF;
	B_cnt_pwm++;
	if(B_cnt_pwm == 20) B_cnt_pwm = 0;

	TF2	=	0; /*	reset	interrupt	flag */
}

void slow_light(void) {
	u16 i;
	for(i=0;i<20000;i++) ;
	if(Direct) B_dimer++;
	else B_dimer--;
	if((B_dimer>=20)||(B_dimer<=0)) Direct = !Direct;
}

void main(void){

	init_T2();

	B_dimer=1;
	while(1){
		slow_light();
	}
}

