Atmega128 7세그먼트 2자리 카운터 - atmega128 7segeumeonteu 2jali kaunteo

	

안녕하세요. 아래의 코드는 FND 실행 코드입니다. 몇일전에 질문드린 아트메가128 LED 신호등과 사용하기 위해서 FND를 공부하고 코드를 짜고 있습니다.

원하는건 카운트입니다. ( 예를들어 10 -> 9 -> 8.... 0에서 다시 10으로 돌아가 반복) 

초록불에서  12초 // 주황불에서 3초 // 붉은불에서 10초   ==  총 25초 카운터기를 만들고 싶습니다.

아래 코드는 반복을 실험하기 위해서 19 부터 0까지 카운트 되도록 만들어봤는데, 0에서 19가 아닌 99가 되면서 다시 99부터 카운터가 되더라구요.

어떻게하면 25초를 표현하여 25 -> 0 다시 25->0을 반복적으로 사용할 수 있을까요?

DDRB와 PORTB는 LED가 사용하고 있습니다.

#include <avr/io.h>

#include <avr/interrupt.h>

#define DIG1 0

#define DIG2 1

#define DIG3 2

#define DIG4 3

#define T1_START 7936

int sec, min;

char dig_table[4] = {0x10, 0x20, 0x40, 0x80};

  //DIG1  DIG2  DIG3  DIG4

char fnd_table1[2] =  {0x06, 0x3F};  //십의자리

                                  // 1        0

char fnd_table2[10] = {0x6F, 0x7F, 0x07, 0x7D, 0x6D, 0x66, 0x4F, 0x5B, 0x06, 0x3F};  //일의자리

                                   // 9       8         7       6        5        4          3         2        1       0

ISR(TIMER1_OVF_vect){

TCNT1 = T1_START;

if(++sec >=60) {

sec = 0;

if(++min >= 60){

min=0;

}

}

}

void Delay(int idata)

{

int i,j;

for(i=0; i<idata; i++){

for(j=0; j<5000; j++);

}

}

void Init_IOport(void)

{

DDRC=0xFF;

PORTC = 0xFF;

DDRD = 0xFF;

PORTD = 0x0F;

}

void Init_Interrupt(void)

{

TCCR1A = 0x00;

TCCR1B = 0x04; // Normal timer , clk/256 분주비 설정

TIMSK =  0x04;  // Timer0 Overflow Interrupt 설정

TCNT1 = T1_START;  // Timer0 초기값 설정

SREG = 0x80;

}

void Init_Variable(void)

{

sec = 0;

}

int main(void)

{

Init_IOport();

Init_Interrupt();

Init_Variable();

    /* Replace with your application code */

    while (1) 

    {

PORTD = dig_table[DIG3];

PORTC = ~fnd_table1[sec/10];

Delay(1);

PORTD = dig_table[DIG4];

PORTC = ~fnd_table2[sec % 10];

Delay(1);

    }

}

	

안녕하세요. 아래의 코드는 FND 실행 코드입니다. 몇일전에 질문드린 아트메가128 LED 신호등과 사용하기 위해서 FND를 공부하고 코드를 짜고 있습니다.

원하는건 카운트입니다. ( 예를들어 10 -> 9 -> 8.... 0에서 다시 10으로 돌아가 반복) 

초록불에서  12초 // 주황불에서 3초 // 붉은불에서 10초   ==  총 25초 카운터기를 만들고 싶습니다.

아래 코드는 반복을 실험하기 위해서 19 부터 0까지 카운트 되도록 만들어봤는데, 0에서 19가 아닌 99가 되면서 다시 99부터 카운터가 되더라구요.

어떻게하면 25초를 표현하여 25 -> 0 다시 25->0을 반복적으로 사용할 수 있을까요?

DDRB와 PORTB는 LED가 사용하고 있습니다.

#include <avr/io.h>

#include <avr/interrupt.h>

#define DIG1 0

#define DIG2 1

#define DIG3 2

#define DIG4 3

#define T1_START 7936

int sec, min;

char dig_table[4] = {0x10, 0x20, 0x40, 0x80};

  //DIG1  DIG2  DIG3  DIG4

char fnd_table1[2] =  {0x06, 0x3F};  //십의자리

                                  // 1        0

char fnd_table2[10] = {0x6F, 0x7F, 0x07, 0x7D, 0x6D, 0x66, 0x4F, 0x5B, 0x06, 0x3F};  //일의자리

                                   // 9       8         7       6        5        4          3         2        1       0

ISR(TIMER1_OVF_vect){

TCNT1 = T1_START;

if(++sec >=60) {

sec = 0;

if(++min >= 60){

min=0;

}

}

}

void Delay(int idata)

{

int i,j;

for(i=0; i<idata; i++){

for(j=0; j<5000; j++);

}

}

void Init_IOport(void)

{

DDRC=0xFF;

PORTC = 0xFF;

DDRD = 0xFF;

PORTD = 0x0F;

}

void Init_Interrupt(void)

{

TCCR1A = 0x00;

TCCR1B = 0x04; // Normal timer , clk/256 분주비 설정

TIMSK =  0x04;  // Timer0 Overflow Interrupt 설정

TCNT1 = T1_START;  // Timer0 초기값 설정

SREG = 0x80;

}

void Init_Variable(void)

{

sec = 0;

}

int main(void)

{

Init_IOport();

Init_Interrupt();

Init_Variable();

    /* Replace with your application code */

    while (1) 

    {

PORTD = dig_table[DIG3];

PORTC = ~fnd_table1[sec/10];

Delay(1);

PORTD = dig_table[DIG4];

PORTC = ~fnd_table2[sec % 10];

Delay(1);

    }

}