/********************************************************************   
	TIMER.C			   	    
	prikaz uporabe Timer0 AT89C2051          	        
=====================================================================
Verzija 	Datum					Avtor       
1  		1-2-1999 	                  
=====================================================================
OPIS:                                                                     
	LED1 utripa s periodo 1s. Zakasnitev je generirana s 	    
	podprogramom s pomocjo casovnika0.
********************************************************************/
#pragma SMALL REGISTERBANK(0) ROM(SMALL) CODE 
#include	<AT892051.h>		// konfiguracijska datoteka 

void delay(unsigned char);         	// zakasnitev za char msek.
void bigDelay(unsigned char);		// zakasnitev za char*100 msek
void hugeDelay(unsigned char);	// zakasnitev za char sekund

#define	LED1	P3_0
#define	MILI_SEC	0x033E

/********************************************************************
	glavni program
********************************************************************/

void main(void) {
	TMOD=0x01;			// inicializacija T0 za 16 bitni casovnik
					// notranja kontrola
	while(1) {       		// neskoncna zanka 
		bigDelay(5);	// zakasnitev za 0.5 sek 
		LED1=~LED1;  	// stanje LED1 se invertira 
	}       			// konec neskoncne while zanke 
}       				// konec funkcije main 



/**************************************************************
	void delay(unsigned char cas)

	zakasnitev za cas milisekund
	uporablja stevec T0, ki steje strojne cikle (1,2 usek)
	za cas 1 msek mora presteti 833 strojnih ciklov
	
**************************************************************/

void delay(unsigned char cas) {

	unsigned char stevec;
	unsigned int initTimer;
	initTimer=0xffff-MILI_SEC;		// 65535-830
	TR0=0;                   		// ustavi T0
	TF0=0;        				// brisi morebitno zastavico T0
	for (stevec = cas; stevec > 0 ; stevec--) {
		TL0=(unsigned char)(initTimer & 0x00ff);	  
		TH0=(unsigned char)(initTimer >> 8);// initTimer v L&H zloga T0
   		TR0=1;                   		// start T0
		while (TF0==0) {         		// cakaj na konec stetja  
								// (TF0=1)
			stevec=stevec;
		}
		TF0=0;	
	}
}


/**************************************************************
	void bigDelay(unsigned char cas)

	zakasnitev za cas*100 milisekund
**************************************************************/

void bigDelay(unsigned char cas) {
	
	unsigned char stevec;
	for (stevec=0;stevec++ < cas;delay(50));
	for (stevec=0;stevec++ < cas;delay(50));
}	


/**************************************************************
	void hugeDelay(unsigned char cas)

	zakasnitev za cas sekund
**************************************************************/

void hugeDelay(unsigned char cas) {

	unsigned char stevec;
	for (stevec=0;stevec++ < cas;bigDelay(10));
}