개발자/Arduino

4 Digit 7 Segment Display 아두이노 제어

지구빵집 2022. 3. 31. 14:18
반응형

 

 

시계, 숫자 표시 등 활용 분야가 많은 7 segment 제어를 실습한다. 시계 알람 설정을 다이얼 노브를 사용하여 설정하는 방법을 알아보는 중이다. 

 

회로 연결도는 아래와 같다. 여기서 부저는 연결하지 않아도 되고, 주로 7 segment 연결도를 참고하시면 됩니다.

 

4 Digit 7 Segment Display 아두이노 제어

 

잘 동작하는 소스코드

 

//a,b,c,d,e,f,g 상태값
byte segValue[10][7] = {
   {1,1,1,1,1,1,0}, //0
   {0,1,1,0,0,0,0}, //1
   {1,1,0,1,1,0,1}, //2
   {1,1,1,1,0,0,1}, //3
   {0,1,1,0,0,1,1}, //4
   {1,0,1,1,0,1,1}, //5
   {1,0,1,1,1,1,1}, //6
   {1,1,1,0,0,0,0}, //7
   {1,1,1,1,1,1,1}, //8
   {1,1,1,1,0,1,1}  //9  
};

byte segPin[8]={7,3,A3,A1,A0,6,A4,A2}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임
byte digitPin[4] = {8,5,4,A5}; //segment 위치 핀

unsigned long readTime=0; //현재시간
int d1 = 0; //1의 자리
int d2 = 0; //10의 자리
int d3 = 0; //100의 자리
int d4 = 0; //1000의 자리

void setup() {
  for(int i=0;i<10;i++){
    pinMode(segPin[i], OUTPUT);
  }
  for(int j=0;j<4;j++){
    pinMode(digitPin[j], OUTPUT);   
    digitalWrite(digitPin[j], HIGH); 
  }
}

void loop() {   
  readTime = millis()/10; //10msec -> 1000 : 1sec
  d1 = readTime%10; //1의 자리
  d2 = (readTime/10)%10; //10의 자리
  d3 = (readTime/100)%10; //100의 자리
  d4 = (readTime/1000)%10; //1000의 자리
  
  segOutput(3,d1,0); //1의 자리
  if(readTime>=10) segOutput(2,d2,0); //10의 자리  
  if(readTime>=100) segOutput(1,d3,0); //10의 자리  
  if(readTime>=1000) segOutput(0,d4,0); //10의 자리  
}
//LED 초기화
void segClear(){ 
  for(int i=0;i<8;i++){
    digitalWrite(segPin[i], LOW);        
  }
}
//LED 출력
void segOutput(int d, int Number, int dp){ 
  segClear();
  digitalWrite(digitPin[d], LOW); 
  for(int i=0;i<7;i++){
     digitalWrite(segPin[i], segValue[Number][i]);        
  }
  digitalWrite(segPin[7], dp);
  delayMicroseconds(1000);
  digitalWrite(digitPin[d], HIGH); 
}

 

 

버튼 인터럽트 처리 반영한 소스코드를 참고하세요.

 

//a,b,c,d,e,f,g 상태값

const byte segValue[10][7] = {
   {1,1,1,1,1,1,0}, //0
   {0,1,1,0,0,0,0}, //1
   {1,1,0,1,1,0,1}, //2
   {1,1,1,1,0,0,1}, //3
   {0,1,1,0,0,1,1}, //4
   {1,0,1,1,0,1,1}, //5
   {1,0,1,1,1,1,1}, //6
   {1,1,1,0,0,0,0}, //7
   {1,1,1,1,1,1,1}, //8
   {1,1,1,1,0,1,1}  //9  
};

const byte segPin[8]={7,3,A3,A1,A0,6,A4,A2}; //사용핀{a,b,c,d,e,f,g,dp} 순서대로임
const byte digitPin[4] = {8,5,4,A5}; //segment 위치 핀

const byte interruptPin = 2;//인터럽트핀
extern volatile unsigned long timer0_millis; //타이머변수

boolean state = true; //false //처음 타이머 동작 제어

unsigned long readTime=0; //현재시간
int d1 = 0; //1의 자리
int d2 = 0; //10의 자리
int d3 = 0; //100의 자리
int d4 = 0; //1000의 자리

void setup() {
  pinMode(interruptPin, INPUT_PULLUP); 
  attachInterrupt(digitalPinToInterrupt(interruptPin), switchFn, FALLING);
  
  for(int i=0;i<10;i++){
    pinMode(segPin[i], OUTPUT);
  }
  for(int j=0;j<4;j++){
    pinMode(digitPin[j], OUTPUT);    
    digitalWrite(digitPin[j], HIGH); 
  }
}

void loop() {   
  if(state==true){ //스위치 상태가 true일때 카운트
    readTime = millis()/1000; //1sec, 10: 10milisecond
    d1 = readTime%10; //1의 자리
    d2 = (readTime/10)%10; //10의 자리
    d3 = (readTime/100)%10; //100의 자리
    d4 = (readTime/1000)%10; //1000의 자리 
  }

  //digit 0 display
  segOutput(3,d1,0);
  segOutput(2,d2,0);
  segOutput(1,d3,0);
  segOutput(0,d4,0);

  //digit 0 no display
  //if(readTime>=0)segOutput(3,d1,0); //1의 자리
  //if(readTime>=10) segOutput(2,d2,0); //10의 자리  
  //if(readTime>=100) segOutput(1,d3,0); //10의 자리  
  //if(readTime>=1000) segOutput(0,d4,0); //10의 자리
}

//스위치 버튼 인터럽트 결과 처리
void switchFn(){
  state=!state;
  if(state==true){ // false
    timer0_millis=0; //타이머 변수 리셋  
  }
}
//LED 초기화
void segClear(){ 
  for(int i=0;i<8;i++){
    digitalWrite(segPin[i], LOW);        
  }
}
//LED 출력
void segOutput(int d, int Number, int dp){ 
  segClear();
  digitalWrite(digitPin[d], LOW); 
  for(int i=0;i<7;i++){
     digitalWrite(segPin[i], segValue[Number][i]);        
  }
  digitalWrite(segPin[7], dp);
  delayMicroseconds(1000);
  digitalWrite(digitPin[d], HIGH); 
}

 

 

참고

4-digit 7-segment display 제어

 

 

4 Digit 7 Segment Display 아두이노 제어

 

 

반응형