- //
	http://eugenemcu.ucoz.ru
- 
	#include              
	<inavr.h>
- 
	#include              
	<iom16.h>
- 
	#include           "dv16100.h"                                        
	//
	Драйвер
	символьного LCD-модуля
	DV16100.
- 
	#define                 
	LED        0
- 
	 
- 
	long                      
	SYS_FREQ = 1000000;                  
	//
	Тактовая частота.
- 
	unsigned
	char    
	Num1000;                                          
	//
	Разряд тысяч.
- 
	unsigned
	char     Num100;
	                                            
	//
	Разряд сотен.
- 
	unsigned
	char     Num10;
	                                              
	//
	Разряд десятков.
- 
	unsigned
	char     Num1;
	                                                
	//
	Разряд единиц.
- 
	unsigned
	char     Num01;
	                                              
	//
	Разряд десятых.
- 
	double                 
	FrqHz;                                                  
	// Частота
	в герцах.
- 
	double                 
	FrqMn;
	                                               
	// Частота в об/мин.
- 
	unsigned
	char    
	FreqOk=1;                                          
	// Признак
	«Получено новое значение частоты»
- 
	unsigned
	long    
	Period=0xFFFFFFF;                       
	// Длительность
	периода в тактах таймера.
- 
	union                    
	{unsigned int
	PRD0;  unsigned
	char PRD1[2];}  
	PRD; //
	Вспомогательное объединение.
- 
	               
		
- 
	 
- 
	void
	main (void)
- 
	{
	
	
- 
	   
	INI_LCD();                                                                      
	//
	Инициализировать
	LCD.
- 
	    DDRB
	|= (1<<LED);      
	
	
- 
	    MCUCR
	|= (1<<ISC00)|(1<<ISC01);                        
	//
	Прерывание 
	INT0
	формировать по фронту сигнала.
- 
	    TCCR1B
	|= (1<<CS10)|(1<<CS11);                         
	//
	Тактировать
	T0
	системной частотой.
- 
	    GICR
	|= (1<<INT0);                                                     
	//
	Разрешить
	прерывание INT0.
- 
	    GIFR
	|= (1<<INTF0);
	                                                  
	//
	Сбросить
	флаг INT0.
- 
	    SREG
	|=
	(1<<7);                                                           
	//
	Разрешить
	прерывания в программе.
- 
	    while
	(1)
- 
	               
	{
- 
	        if
	(FreqOk==1)                                                          
	//
	Если
	получено новое значение частоты…
- 
	        {
- 
	           
	FrqMn=(60/(Period*64e-6));         
	
	
- 
	           
	FrqHz=FrqMn/60;
- 
	           
	//
	Выделяем десятичные разряды числа.
- 
	           
	Num100=Num10=Num1=Num01=0;                                                                            
	
	
- 
	           
	while
	(FrqHz>=100)                                             
	{Num100++; 
	FrqHz
	-= 100;} 
	
- 
	           
	while
	(FrqHz>=10)                                               
	{Num10++;  
	FrqHz
	-= 10;} 
	
- 
	           
	while
	(FrqHz>=1)                                                  
	{Num1++;   
	FrqHz
	-= 1;}
- 
	           
	while
	(FrqHz>=0.1)                                              
	{Num01++;  
	FrqHz
	-= 0.1;}
- 
	           
	LCD_VIEW(7,'z');                                                   
	//
	Отображаем
	частоту на LCD.
- 
	           
	LCD_VIEW(6,'H');
- 
	           
	LCD_VIEW(4,(Num01+0x30));
- 
	           
	LCD_VIEW(3,'.');           
	
	
- 
	           
	LCD_VIEW(2,(Num1+0x30));
- 
	           
	LCD_VIEW(1,(Num10+0x30));
- 
	           
	LCD_VIEW(0,(Num100+0x30));
- 
	            
- 
	           
	Num1000=Num100=Num10=Num1=0;
	
	
- 
	           
	while
	(FrqMn>=1000)                                         
	{Num1000++; FrqMn -= 1000;}
- 
	           
	while
	(FrqMn>=100)   
	                                        
	{Num100++;  FrqMn -= 100;} 
	
- 
	           
	while
	(FrqMn>=10)    
	                                         
	{Num10++;   FrqMn -= 10;} 
	
- 
	           
	while
	(FrqMn>=1)      
	                                         
	{Num1++;    FrqMn -= 1;} 
	
- 
	           
	LCD_VIEW(15,'M');
- 
	           
	LCD_VIEW(14,'p');
- 
	           
	LCD_VIEW(12,(Num1+0x30));
- 
	           
	LCD_VIEW(11,(Num10+0x30));
- 
	           
	LCD_VIEW(10,(Num100+0x30));           
	
	
- 
	           
	LCD_VIEW(9,
	(Num1000+0x30));           
	
	
- 
	           
	FreqOk=0;                                                             
	//
	Частота
	отображена. Ждать новой.
- 
	        }
- 
	        DELAY_MS
	(300);                                                    
	//
	Задержка
	для читаемости на LCD.
- 
	    }
- 
	}   
	
	
- 
	/*______________________________________________________
- 
	                              
		
- 
	 FUNCTIONS
- 
	______________________________________________________*/
- 
	 
- 
	void
	DELAY_MS (int
	Xms)                                              
	// Задержка
	на Xms
	миллисекунд .
- 
	{
	
	
- 
	               
	long  
	DELMS=(Xms*(SYS_FREQ/(10*1000))-65);
- 
	               
	while
	(DELMS!=0) DELMS--; 
	
- 
	}
- 
	 
- 
	#pragma
	vector=INT0_vect
- 
	__interrupt 
	void INT0_INTPT()                                    
	//
	Прерывание INT0.
- 
	{
	
	
- 
	    PRD.PRD1[0]=TCNT1L;   
	
	
- 
	    PRD.PRD1[1]=TCNT1H;
- 
	    TCNT1H=0;
- 
	    TCNT1L=0;
- 
	    Period=PRD.PRD0;
- 
	    FreqOk=1;  
	
	
- 
	    PORTB
	^= (1<<LED);
- 
	    GIFR
	|= (1<<INTF0);
- 
	}
-