본문으로 바로가기

C언어_펌웨어_주사위 인터럽트 사용.

category 개발자/C 언어 2015. 4. 17. 12:31

#include <stdlib.h>
#include <time.h>
#include "smart.h"

void ito7seg_cal(unsigned int tmp);
unsigned char bitcal(unsigned char c1, unsigned char c2, unsigned char c3, unsigned char c4, unsigned char c5, unsigned char c6, unsigned char c7);

//unsigned char cRand;

void __vector_1(void)__attribute__((signal,used,externally_visible));//int0의 벡터 번호 1

void __vector_1(void)// 처리할 루트를 넣어준다. 끼어드는 조건이 만족하면 실행된다.
{  
  //cRand = (rand()%6 + 1);

  ito7seg_cal(rand()%6 + 1);
  
  EIFR = 0x01;  //반환 값. 그쪽 인터럽트를 사용했다라는 뜻의 반환.
}

int main(void)
{
  unsigned char cFlag = 0;   //확실히 하기 위한 flag 변수 선언

  DDRD = 0xFE;  //인터럽트 핀. 펌웨어 쪽에서는 사용하지 않는 핀들을 전부 출력으로 설정해 준다.

  SREG &= 0x7F;  /*0111 1111, &= 이 의미는 형태 sreg 0x7F 가 앤드 형태로 들어가 있으니 다른 어떤 값이 들어오면 &시켜버린다. 즉 지금의 형태는 모든 인터럽트를 사용 안하겠다가 된다.
      */

  DDRC = 0xFF;  //7세그먼트 쪽 입/출력 핀을 전부 출력으로

  EIMSK = 0x01;  //인터럽트 핀(0) 하나 사용

  EICRA = 0x02;  //falling edge 사용
  
  //SREG |= 0x80;  //현재 인터럽트를 쓰지 않고 main 함수 while문에서 다 끝내려 한다

  while(1)
  {
    if(PIND == 1 && cFlag == 0)
    {
      ito7seg_cal(8);  // 스위치를 누르고 있는 동안 8 출력
      
      cFlag = 1;
    }
    else if(PIND == 0 && cFlag == 1)
    {
      ito7seg_cal(rand() % 6 + 1);

      cFlag = 0;
    }
  
  }

  return 0;
}

void ito7seg_cal(unsigned int tmp)//7세그먼트의 카운트 형태 함수 정의
{
  switch(tmp)
  {
    case 0 : 
      PORTC = bitcal(0,0,0,0,0,0,1);
      break;
    case 1 :
      PORTC = bitcal(1,0,0,1,1,1,1);
      break;
    case 2 :
      PORTC = bitcal(0,0,1,0,0,1,0);
      break;
    case 3 :
      PORTC = bitcal(0,0,0,0,1,1,0);
      break;
    case 4 :
      PORTC = bitcal(1,0,0,1,1,0,0);
      break;
    case 5 :
      PORTC = bitcal(0,1,0,0,1,0,0);
      break;
    case 6 :
      PORTC = bitcal(0,1,0,0,0,0,0);
      break;
    case 7 :
      PORTC = bitcal(0,0,0,1,1,0,1);
      break;
    case 8 :
      PORTC = bitcal(0,0,0,0,0,0,0);
      break;
    case 9 :
      PORTC = bitcal(0,0,0,0,1,0,0);
      break;
  }
}

unsigned char bitcal(unsigned char c1, unsigned char c2, unsigned char c3, unsigned char c4, unsigned char c5, unsigned char c6, unsigned char c7)
{

  //return ( ( !c1 << 0 ) |( !c2 << 1 ) |( !c3 << 2 ) |( !c4 << 3 ) |( !c5 << 4 ) |( !c6 << 5 ) |( !c7 << 6 )  );
  
  return ( ( c1 << 0 ) |( c2 << 1 ) |( c3 << 2 ) |( c4 << 3 ) |( c5 << 4 ) |( c6 << 5 ) |( c7 << 6 )  );
}