본문 바로가기
과거에 공부했던 것들(저장용)/학부생

Avr studio) atmega128 계산기 프로그램 _ 인터럽트 사용

by under_coverzzz 2015. 7. 23.
반응형

#include<avr/io.h>

#define F_CPU 16000000UL

#include <util/delay.h>

#include <avr/interrupt.h>

#include "led.h"

#include "segment.h"


int add=0;

int num1=0;

int num2=0;

int flag =0;

int temp=0;

int sum=0;


SIGNAL(SIG_INTERRUPT0)

{

sei();

_delay_ms(100);

unsigned char ary[4]={0x77,0x6D,0x37,0x5E};

unsigned char yun[4]={0x5E,0x3E,0x37,0x06};


  _delay_ms(100);

if(add%4==0)

{

PORTC = ary[0];

PORTF = yun[0];

}

else if(add%4==1)

{

PORTC = ary[1];

PORTF = yun[1];

}

else if(add%4==2)

{

PORTC = ary[2];

PORTF = yun[2];

}

else if(add%4==3)

{

PORTC = ary[3];

PORTF = yun[3];

}

_delay_ms(100);   

add++;

EIFR|=0x01;

    cli();

}

SIGNAL(SIG_INTERRUPT1)

{

sei();

_delay_ms(100);


num1++;

_delay_ms(100);

disp_seg(num1);


EIFR|=0x02;

cli();

}

SIGNAL(SIG_INTERRUPT2)

{

sei();

_delay_ms(100);


num2++;

_delay_ms(100);

disp_seg(num2);


EIFR|=0x04;

cli();

}

SIGNAL(SIG_INTERRUPT3)

{

sei();

_delay_ms(100);


if(add==0)

{

sum = num1 + num2;

}

else if(add ==1)

{

sum = num1 - num2;

}

else if(add ==2)

{

sum = num1 * num2;

}

else if(add ==3)

{

sum = num1 / num2;

}

disp_seg(sum);

flag++;

if(flag==2){flag=0;sum=0;}

disp_seg(sum);


EIFR|=0x08;

cli();

}

int main()

{

   DDRD = 0XF0; // Switch 1 2 3 4 를 사용 

   DDRA = 0XFF; // LED 

   DDRF = 0xFF; // right 

   DDRC = 0xFF; // left 


   EICRA = 0xAA;

   EICRB = 0xAA;

   EIMSK = 0x0F;

   EIFR |= 0x0F;


   sei();            //전체 인터럽트 인에이블


   while(1)

   {


   }

   return 0;

}



반응형