<!--StartFragment-->

  <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

#define F_CPU 16000000UL

 

#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>

 

#define Fnd_delay 3 // FND Dynamic display 방식의 출력지연(mSec)

 

unsigned int min = 0, sec = 0;

unsigned int min_d1,min_d2,sec_d1,sec_d2,frm_d1,frm_d2;

unsigned int stop_flag = 0;

unsigned int count=0;

 

 

unsigned char Num_output(unsigned char number) //세그먼트연결포트 출력함수

{

if(number == 0) return 0x3F;

else if(number == 1) return 0x06;

else if(number == 2) return 0x5B;

else if(number == 3) return 0x4F;

else if(number == 4) return 0x66;

else if(number == 5) return 0x6D;

else if(number == 6) return 0x7C;

else if(number == 7) return 0x27;

else if(number == 8) return 0x7F;

else if(number == 9) return 0x67;

else return 0x00;

}

 

void Time_data(void) // 시간 데이터를 계산하고 자릿수 산출

{

if (count == 100)

{

count = 0;

sec++;

}

if (sec == 60)

{

sec = 0;

min++;

}

if (min == 60) min = 0;

frm_d1 = count;

frm_d2 = count/10;

min_d1 = min;

min_d2 = min/10;

sec_d1 = sec;

sec_d2 = sec/10;

}

 

ISR(TIMER1_COMPA_vect)

{

count++; // 1/100 Sec 증가

Time_data();

if(count == 1) PORTC = 0x0F; // LED 0.5 Sec마다 깜빡

else if (count == 50) PORTC = 0x00;

}

 

void Fnd_display(void) // FND Dynamic display 출력함수

{

PORTB = 0b00111110;

PORTA = Num_output(frm_d1);

_delay_ms(Fnd_delay);

PORTB = 0b00111101;

PORTA = Num_output(frm_d2);

_delay_ms(Fnd_delay);

PORTB = 0b00111011;

PORTA = Num_output(sec_d1);

_delay_ms(Fnd_delay);

PORTB = 0b00110111;

PORTA = Num_output(sec_d2);

_delay_ms(Fnd_delay);

PORTB = 0b00101111;

PORTA = Num_output(min_d1);

_delay_ms(Fnd_delay);

PORTB = 0b00011111;

PORTA = Num_output(min_d2);

_delay_ms(Fnd_delay);

}

 

 

int main(void)

{

DDRA = 0xFF;

DDRB = 0xFF;

DDRC = 0x0F;

DDRD = 0x00;

PORTB = 0xFF;

PORTD = 0x07; // 내부 pull-up 저항 사용

 

//----------------- Timer/Counter 1 레지스터 설정 ----------------------//

TCCR1A = 0x00;

TCCR1B = (1<<WGM12)|(1<<CS12); //CTC mode, 분주비 256

TCCR1C = 0x00;

TIMSK = (1<<OCIE1A); //T/C1 compare match interrupt A enable

OCR1A = 624;

TCNT1 = 0;

 

sei(); // 인터럽트 허용

while(1)

{

Fnd_display();

switch(PIND)

{

case 0b00000110: // Start sw

sei();

break;

case 0b00000101: // Stop sw

cli();

break;

case 0b00000011: // Reset sw

count = 0; // 데이타 초기화

min = 0;

sec = 0;

Time_data();

Fnd_display(); // FND 출력 초기화

break;

}

}

}

 

하 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ