아두이노

아두이노와 7세그먼트를 이용한 16진수 카운터

디다새 2021. 5. 16. 19:20

회로구성

7 세그먼트와 버튼을 아두이노 디지털 핀에 연결

 

동작 요구사항

아두이노에 전원이 인가되면 7 세그먼트는 꺼져있다.

버튼을 누르면 숫자가 1씩 증가한다. 16진수로 나타내며 F 다음에는 다시 0으로 표시된다. (카운터 기능)

 

7 세그먼트 동작

7 세그먼트(7 Segment)7개의 획으로 숫자나 문자를 나타낼 수 있는 표시장치로 FND (Flexible Numeric Display)라고도 한다

각각의 획은 LED로 구성되어 있으며, 이들의 일부를 켜고 끄는 것으로 숫자나 문자를 표시할 수 있다.

그림출처 : https://dokkodai.tistory.com/89
그림출처 : https://dokkodai.tistory.com/89
그림출처 : https://wikidocs.net/30887

 

아두이노 제어 함수

아두이노 보드의 디지털 핀을 제어하기위한 함수

   • pinMode()

   • digitalWrite()

   • digitalRead()

 

데이터를 비트 단위로 읽어 오기 위한 함수

   • bitRead()

bitread()함수 사용법

 

아두이노 시뮬레이션

 

위 그림에서는 저항을 7세그먼트의 모든 핀에 연결했지만, 일반적으로는 전원핀에 하나만 저항을 연결하고 나머지 핀에는 저항을 연결하지 않는다.

 

 

0번 핀과 1번 핀은 아두이노에 프로그램을 업로딩할 때 사용하기때문에 일반적인 용도의 디지털 핀으로 잘 사용하지 않는다. 꼭 사용해야 하는 경우라면, 프로그램을 업로딩할 때는 핀 연결을 해제하고 업로딩하고, 업로딩이 완료된 후에 다시 연결하여 사용한다.

 

코드 작성

전체코드

int btn = 10;
int cur_btn_state = 0;  // 현재 버튼 상태
int pre_btn_state = 0;  // 이전 버튼 상태
int num = 0;
int FND[7] = {0,1,2,3,4,5,6};  //abcedfg  
int FND_data[16] = {0xC0, 0xF9, 0xA4, 0xB0, 
                    0x99, 0x92, 0x82, 0xF8, 
                    0x80, 0x90, 0x88, 0x83,
                    0xC6, 0xA1, 0x86, 0x8E};

int get_btn_state()
{
  while(1)
  {
    if(!digitalRead(btn))  // 버튼이 눌러진 상태 == LOW
    {
      while(!digitalRead(btn))
      { // 버튼이 눌러진 동안 아무것도 하지 않는다.
      }
      return !cur_btn_state;
    }
  }
}

void setup()
{
  pinMode(btn, INPUT_PULLUP);
  for(int i=0; i<7; i++)
  {
    pinMode(FND[i], OUTPUT);
    digitalWrite(FND[i], HIGH);
  }
}

void loop()
{
  cur_btn_state = get_btn_state();
  
  if((pre_btn_state == 0 && cur_btn_state == 1)||
     (pre_btn_state == 1 && cur_btn_state == 0))
  {
    for(int i=0; i<7; i++)
      digitalWrite(FND[i], bitRead(FND_data[num], i));
    
    num++;
    
    if(num>=16)
      num = num%16;
  }
  
  pre_btn_state = cur_btn_state;
}

 

Tinkercad 시뮬레이션 결과