#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() 이 함수 잘 모르겠어서 해석할 줄 아는 형님 계심??
메모리 달아놓은 포트 쓰려고 기동시에 레지스터 셋팅하나보디
오 그거 맞는듯\
엌ㅋㅋㅋ맛나욬ㅋㅋㅋㅋㅋ