⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 Der Aufbau eines kleinen Frequenzz&auml hers ist dank der heutigen Atmel AVR Controller oder aber au
💻 C
字号:
/*#######################################################################################

Copyright (C) 2004 Ulrich Radig

#######################################################################################*/

#include "timer.h"
volatile unsigned long display = 0;
volatile unsigned char dot = 5;
const char SEGMENTE[] = {183,130,59,171,142,173,189,131,191,175};
unsigned char segcounter = 0;
unsigned int  lowovf = 0;
unsigned char highovf = 0;
unsigned char sekcnt = 0;
unsigned char mkhz = 0;


//############################################################################
//Timer3 Interrupt
ISR (TIMER2_OVF_vect)
//############################################################################
{
	sekcnt++;
	if (sekcnt > 244) //(OSC_CLK / 256/ 256)
		{
		TCCR1B = 0;
		TCCR0 = 0; 
		unsigned long tmp1,tmp2;
		tmp1 = (((unsigned long) lowovf * 256) + TCNT0);
		tmp2 = (((unsigned long) highovf * 65536) + TCNT1) * 16;
		TCNT0 = 0;
		TCNT1 = 0;
		lowovf = 0;
		highovf = 0;
		sekcnt = 0;
		TCCR1B = (1<<CS10 | 1<<CS11 | 1<<CS12);
		TCCR0 = (1<<CS00 | 1<<CS01 | 1<<CS02); 
		if (tmp2<1000000)
			{
				if (tmp1 < 1000)
				{
				display = tmp1;
				dot = 6;
				mkhz = 0;
				}
				else if (tmp1 < 100000)
				{
				display = tmp1;
				dot = 5;
				mkhz = 1;
				}
				else
				{
				display = tmp1/10;
				dot = 4;
				mkhz = 1;
				}
			}
			else
			{
				if (tmp2< 10000000)
				{
				display = tmp2/100;
				dot = 0;
				mkhz = 2;
				}
				else
				{
				display = tmp2/1000;
				dot = 5;
				mkhz = 2;
				}
			}
		}
		
	PORTC = 0;
	PORTA = (1<<(segcounter+2));
	switch (segcounter++)
	{
		case 0:
			if (mkhz == 0) PORTC = 32;
			if (mkhz == 1) PORTC = 8;
			if (mkhz == 2) PORTC = 1;
			break;
		
		case 1:
			if (display >= 1) PORTC = SEGMENTE[(display % 10)];
			break;
		
		case 2:
			if (display >= 10) PORTC = SEGMENTE[(display % 100 / 10)];
			break;
		
		case 3:
			if (display >= 100) PORTC = SEGMENTE[(display % 1000 / 100)];
			break;
		
		case 4:
			if (display >= 1000) PORTC = SEGMENTE[(display % 10000 / 1000)];
			break;
		
		case 5:
			if (display >= 10000) PORTC = SEGMENTE[(display % 100000 / 10000)];
			segcounter = 0;
			break;
	};
	if (dot == segcounter){PORTC += 64;};
}

//############################################################################
//Timer1 Interrupt
ISR (TIMER1_OVF_vect)
//############################################################################
{
	highovf++;
}

//############################################################################
//Timer0 Interrupt
ISR (TIMER0_OVF_vect)
//############################################################################
{
	lowovf++;
}

//############################################################################
//Diese Routine startet und inizialisiert den Timer
void init_timer3 (void)
//############################################################################
{
	usart_write_str("Start Clock");
	//Interrupt for the Clock enable  
    TIMSK |= (1 << TOIE2)|(1 << TOIE0)|(1 << TOIE1);
	//Setzen des Prescaler auf 1024 
	TCCR2 |= (0<<CS20 | 1<<CS21 | 1<<CS22); 
	TCCR1B = (1<<CS10 | 1<<CS11 | 1<<CS12);
	TCCR0 = (1<<CS00 | 1<<CS01 | 1<<CS02); 
	TCNT2 = 0; 
	TCNT1 = 0;
	TCNT0 = 0;
	return;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -