아두이노와 7세그먼트를 이용한 16진수 카운터
회로구성
• 7 세그먼트와 버튼을 아두이노 디지털 핀에 연결
동작 요구사항
• 아두이노에 전원이 인가되면 7 세그먼트는 꺼져있다.
• 버튼을 누르면 숫자가 1씩 증가한다. 16진수로 나타내며 F 다음에는 다시 0으로 표시된다. (카운터 기능)
7 세그먼트 동작
• 7 세그먼트(7 Segment)는 7개의 획으로 숫자나 문자를 나타낼 수 있는 표시장치로 FND (Flexible Numeric Display)라고도 한다.
• 각각의 획은 LED로 구성되어 있으며, 이들의 일부를 켜고 끄는 것으로 숫자나 문자를 표시할 수 있다.
아두이노 제어 함수
아두이노 보드의 디지털 핀을 제어하기위한 함수
• pinMode()
• digitalWrite()
• digitalRead()
데이터를 비트 단위로 읽어 오기 위한 함수
• 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 시뮬레이션 결과