<?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;
}
}
}
하 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
댓글 0