📄 timer.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 + -