개발자의 생활

2023년 1학기 5주차 (7세그먼트 제어) 본문

과제/아두이노

2023년 1학기 5주차 (7세그먼트 제어)

Developer성현 2023. 4. 7. 13:47

5_4) 1 digit 7 segment, 2개 버튼을 이용하여 상/하향 카운터

int Pin_Map[8] = {11, 10, 9, 8, 7, 6, 5, 4};
int Button_up = 3, Button_down = 2;
bool ButtonCheck_1 = false, ButtonCheck_2 = false;

int number = 0;

bool sgmt[10][8] = {
  {0, 0, 0, 0, 0, 0, 1, 1}, //0
  {1, 0, 0, 1, 1, 1, 1, 1}, //1
  {0, 0, 1, 0, 0, 1, 0, 1}, //2
  {0, 0, 0, 0, 1, 1, 0, 1}, //3
  {1, 0, 0, 1, 1, 0, 0, 1}, //4
  {0, 1, 0, 0, 1, 0, 0, 1}, //5
  {0, 1, 0, 0, 0, 0, 0, 1}, //6
  {0, 0, 0, 1, 1, 0, 1, 1}, //7
  {0, 0, 0, 0, 0, 0, 0, 1}, //8
  {0, 0, 0, 0, 1, 0, 0, 1}, //9
};

void setup() {
  // put your setup code here, to run once:
  for (int i = 0; i < sizeof(Pin_Map) / sizeof(int); i++) { //0 ~ 배열 크기만큼 1씩 증가
    pinMode(Pin_Map[i], OUTPUT);//Pin_Map 배열에 각 핀을 출력으로 설정
    digitalWrite(Pin_Map[i], true);// 모든핀의 초기상태를 5V 출력
  }

  pinMode(Button_up, INPUT);
  pinMode(Button_down, INPUT);

  sgmt_out(number);//세그먼트 출력 함수 정의
}

void loop() {

  if (digitalRead(Button_up) == true && ButtonCheck_1 == false) {
    ButtonCheck_1 = true;

    number++;
    
    if(number >= 9) number = 0;

    sgmt_out(number);//세그먼트 출력 함수 정의
    
  } else if (digitalRead(Button_up) == false) {
    ButtonCheck_1 = false;
  }

  if (digitalRead(Button_down) == true && ButtonCheck_2 == false) {
    ButtonCheck_2 = true;
if(number <= 0) number = 10;

    number--;
    sgmt_out(number);//세그먼트 출력 함수 정의
    
  } else if (digitalRead(Button_down) == false) {
    ButtonCheck_2 = false;
  }


}

void sgmt_out(int num) {//출력할 값을 매개변수를 받아온다
  for (int i = 0; i < sizeof(Pin_Map) / sizeof(int); i++) {//0 ~ 배열 크기만큼 1씩 증가
    digitalWrite(Pin_Map[i], sgmt[num][i]);//각 핀마다 출력값을 sgmt에 매칭시켜준다.
  }
}

 

 

5-6) 4 digit 7 segment, 가변저항을 이용하여 가변저항값 표시

bool sgmt[10][7] = {
  {0, 0, 0, 0, 0, 0, 1}, //0
  {1, 0, 0, 1, 1, 1, 1}, //1
  {0, 0, 1, 0, 0, 1, 0}, //2
  {0, 0, 0, 0, 1, 1, 0}, //3
  {1, 0, 0, 1, 1, 0, 0}, //4
  {0, 1, 0, 0, 1, 0, 0}, //5
  {0, 1, 0, 0, 0, 0, 0}, //6
  {0, 0, 0, 1, 1, 0, 1}, //7
  {0, 0, 0, 0, 0, 0, 0}, //8
  {0, 0, 0, 0, 1, 0, 0} //9
};

int sgmt_PinMap[7] = {12, 11, 10, 9, 8, 7, 6};
int ch_Pin[4] = {5, 4, 3, 2};

void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode(sgmt_PinMap[i], OUTPUT);
  }
  for (int i = 0; i < 4; i++) {
    pinMode(ch_Pin[i], OUTPUT);
    digitalWrite(ch_Pin[i], false);
    //모든체널의 핀 전압을 0V 로 하여
    //전압차가 생기지 않게 하여 off 로 만든다
  }

}

void loop() {
  int value = analogRead(A1);
  hc4_sgmt(value);
}

void hc4_sgmt(int num) {
  int ch_num[4];
  ch_num[0] = (num % 10000) / 1000;
  ch_num[1] = (num % 1000) / 100;
  ch_num[2] = (num % 100) / 10;
  ch_num[3] = (num % 10) / 1;
  
  for (int i = 0; i < 4; i++) {
    digitalWrite(ch_Pin[i], true);//on
    for (int j = 0; j < 7; j++) {
      digitalWrite(sgmt_PinMap[j], sgmt[ch_num[i]][j]);
    }
    delay(4);
    digitalWrite(ch_Pin[i], false);//off
  }
}

 

'과제 > 아두이노' 카테고리의 다른 글

2024년2학기 9주차 과제  (0) 2024.11.09
2023년 1학기 6주차  (0) 2023.04.16
2023년 1학기 4주차 과제  (0) 2023.04.01
2023년 1학기 3주차 과제(millis사용하기)  (0) 2023.03.24
2023년 1학기 2주차 실습과제  (0) 2023.03.17