#define F_CPU 8000000UL

#include <avr/io.h>  
#include <stdio.h>       
#include <stdint.h>
#include <avr/interrupt.h>
#include  <util/delay.h>

uint8_t *PAPORT = (uint8_t *)0x8400;   // 8255 PA port, ouput
uint8_t *PBPORT = (uint8_t *)0x8401;   // 8255 PB port, ouput

const uint8_t digitdata[]  = {0xFB,0xF7,0xFE,0xFD};      // 0xFB : Digit 0, 0xF7 : Digit 1, 0xFE : Digit 2, 0xFD : Digit3
const uint8_t numdata[]    = {0x81,0xCF,0x92,0x86,0xCC,0xA4,0xE0,0x8F,0x80,0x84};  // 0 ~ 9까지의 세그먼트 표현값

volatile int Disp_no=0; // volatile 선언자는 컴파일러가 최적화 옵션의 적용을 받지 않도록 하는 선언자
volatile int Disp_delay=100;           // ms

volatile int TCNT3H_val;
volatile int TCNT3L_val;

SIGNAL( SIG_OVERFLOW3 )  // Timer/Counter 3 Overflow interrupt
{
 cli(); // 인터럽트를 받아들이지 않음
 TCNT3H = TCNT3H_val; // timer/counter3 - TCNT3H and TCNT3L
 TCNT3L = TCNT3L_val; // 컴파일러의 최적화작업을 받지 않음
 Disp_no = Disp_no + 1; // 하나씩 증가
 if(Disp_no == 10000) Disp_no = 0; // 10000이 되면 다시 0으로
 sei(); // 인터럽트를 받아들임
}

void Timer3_init()
{
 uint16_t div; // unsigned short 16bits
 
 TCCR3B = 0x05; // CLK I/O / 1024 = 8KHz pre scaling
 ETIMSK |= 0x04; // TOIE3 = 1, Timer/Counter3 Overflow Interrupt Enable 타이머/카운터3를 사용하므로 ETIMSK 설정
 
 div = Disp_delay * 8;   // 8 counts = 1ms (8KHz 이므로)
 div = 0x10000 - div;
 TCNT3H_val = (div >> 8);  
 TCNT3L_val = (div & 0xff);
 TCNT3H = TCNT3H_val;
 TCNT3L = TCNT3L_val;
}

void WriteExt(uint8_t *addr, uint8_t val)

 *addr = val;
}

void InitExtSram()
{
 MCUCR = MCUCR | 0xC0;  //External SRAM/XMEM Enable // MCUCR 설정에 따라서 포트의 기본기능과 부가기능을 설정해서 사용할 수 있다. 7비트의 SRE와 6비트의 SRW10의 값을 1로 해주는 선언.
 XMCRA = 0x42;          //Lower Sector : 0x1100 ~ 0x7FFF
                        //Upper Sector : 0x8000 ~ 0xFFFF
                        //Lower Wait States : No wait-states
                        //Upper Wait States : Wait two cycle during read/write strobe
 //XMCRB = 0x80;        //External Memory Bus-keeper Enable
}

void Display_num(int digits, int num)
{
 int i,j;
 int num_val;
 
 for(i=0;i<digits;i++) {                 // 정해진 digit 수 만큼 on
  WriteExt(PAPORT,digitdata[i]);
  num_val = num;
  if(i==0) num_val = num_val % 10;
  else {
   for(j=0;j<i;j++) {
    num_val = (int) (num_val / 10);
   }
   num_val = num_val % 10;
  }
  WriteExt(PBPORT,numdata[num_val]);
  _delay_ms(1);
  WriteExt(PAPORT,0xFF);
  WriteExt(PBPORT,0xFF);
 } 
}     

int main()
{
 int i,j;
 int delay_loop = 10;
 
 InitExtSram();
 Timer3_init();          //
 sei();
 
 WriteExt(PAPORT,0xFF);    // Default : All FND OFF
 WriteExt(PBPORT,0xFF);
 
 while(1) {
  Display_num(4,Disp_no);
 }
 
}

 

 

뭐 그냥 7세그먼트 타이머 테스트 소슨데 InitExtSram() 이 함수 잘 모르겠어서 해석할 줄 아는 형님 계심??