#define F_CPU 1000000UL
#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
#define uchar unsigned char
#define uint unsigned int
#define StartKey (PINC & _BV(PC0))
const uchar DsyCode[]=
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00
};
uchar DsyBuffer[4]={0,0,0,0};
uint capi=0, capj=0;
void Port_Init(void);
void Timer_Init(void);
void Smg_Display(void);
int main(void)
{
Port_Init();
Timer_Init();
sei();
while(1)
{
if(StartKey == 0)
{
TCCR1B |= _BV(CS10);
TIMSK |= _BV(TICIE1);
}
Smg_Display();
}
}
ISR(TIMER1_CAPT_vect)
{
if(capi == 0)
capi = ICR1;
else
{
capj = ICR1 - capi;
capj = 1000000UL/capj;
TIMSK = 0x00;
TCCR1B &= 0xf8;
DsyBuffer[0]=capj / 1000;
DsyBuffer[1]=capj % 1000 / 100;
DsyBuffer[2]=capj % 100 / 10;
DsyBuffer[3]=capj % 10;
TCNT1 = capi = capj = 0;
}
}
void Port_Init(void)
{
DDRA = 0xff;
PORTA = 0x00;
DDRB = 0xff;
PORTB = 0xff;
DDRC = 0x00;
PORTC = 0xff;
DDRD = 0x00;
PORTD = 0x00;
}
void Timer_Init(void)
{
TCCR1B |= _BV(ICNC1)|_BV(ICES1);
}
void Smg_Display(void)
{
uchar i;
for(i=0; i<4; i++)
{
PORTB = ~(1 << i);
PORTA = DsyCode[DsyBuffer[i]];
if(i==0)
PORTA |= 0x80;
_delay_ms(2);
}
}