/*********************************************
000 ~ 999 까지 무한히 반복
PORTA ==> FND1 에 출력
PORTB ==> FND2 에 출력
PORTC ==> FND3 에 출력
PORTD ==> FND4 에 출력
Tools : Codevision
http://watsim.tistory.com
*********************************************/
#include <mega128.h>
// FND 에 출력할 실제 데이터
unsigned int g_iCountData = 0;
// 1초 계산을 위한 변수
int g_iTimer0Counter = 0;
void FndDisplay1(char byteData); // 1 자리 출력
void FndDisplay1(char byteData){
switch( byteData){
case 0: PORTA = 0b10001000; break;
case 1: PORTA = 0b11101011; break;
case 2: PORTA = 0b01001100; break;
case 3: PORTA = 0b01001001; break;
case 4: PORTA = 0b00101011; break;
case 5: PORTA = 0b00011001; break;
case 6: PORTA = 0b00011000; break;
case 7: PORTA = 0b11001011; break;
case 8: PORTA = 0x00| 0x08; break;
case 9: PORTA = 0x01|0x08; break;
default : PORTA = 0b11111000; break;
}
}
void FndDisplay2(char byteData); // 10 자리 출력
void FndDisplay2(char byteData){
switch( byteData){
case 0: PORTB = 0b10001000; break;
case 1: PORTB = 0b11101011; break;
case 2: PORTB = 0b01001100; break;
case 3: PORTB = 0b01001001; break;
case 4: PORTB = 0b00101011; break;
case 5: PORTB = 0b00011001; break;
case 6: PORTB = 0b00011000; break;
case 7: PORTB = 0b11001011; break;
case 8: PORTB = 0x00| 0x08; break;
case 9: PORTB = 0x01|0x08; break;
default : PORTB = 0b11111000; break;
}
}
void FndDisplay3(char byteData); // 100 자리 출력
void FndDisplay3(char byteData){
switch( byteData){
case 0: PORTC = 0b10001000; break;
case 1: PORTC = 0b11101011; break;
case 2: PORTC = 0b01001100; break;
case 3: PORTC = 0b01001001; break;
case 4: PORTC = 0b00101011; break;
case 5: PORTC = 0b00011001; break;
case 6: PORTC = 0b00011000; break;
case 7: PORTC = 0b11001011; break;
case 8: PORTC = 0x00| 0x08; break;
case 9: PORTC = 0x01|0x08; break;
default : PORTC = 0b11111000; break;
}
}
void FndDisplay4(char byteData); // 1000 자리 출력
void FndDisplay4(char byteData){
switch( byteData){
case 0: PORTD = 0b10001000; break;
case 1: PORTD = 0b11101011; break;
case 2: PORTD = 0b01001100; break;
case 3: PORTD = 0b01001001; break;
case 4: PORTD = 0b00101011; break;
case 5: PORTD = 0b00011001; break;
case 6: PORTD = 0b00011000; break;
case 7: PORTD = 0b11001011; break;
case 8: PORTD = 0x00| 0x08; break;
case 9: PORTD = 0x01|0x08; break;
default : PORTD = 0b11111000; break;
}
}
// Timer 0 output compare interrupt service routine
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
g_iTimer0Counter ++;
if(g_iTimer0Counter>2) {
if(++g_iCountData>9999) g_iCountData = 0;
g_iTimer0Counter = 0;
}
}
void main(void)
{
char byteFND1;
char byteFND2;
char byteFND3;
char byteFND4;
g_iTimer0Counter = 0;
g_iCountData = 9998;
DDRA=0xFF;
DDRB=0xFF;
DDRC=0xFF;
DDRD=0xFF;
ASSR=0x00;
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x20;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
ETIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
byteFND4 = (g_iCountData/1000%10);
byteFND3 = (g_iCountData/100%10);
byteFND2 = (g_iCountData/10%10);
byteFND1 = (g_iCountData%10);
FndDisplay4(byteFND4);
FndDisplay3(byteFND3);
FndDisplay2(byteFND2);
FndDisplay1(byteFND1);
}
} |