2017년 5월 18일 목요일

아두이노 실습] QDSP6064 Bubble Display (4 digit FND)

QDSP6064는 일명 Bubble display라고도 불리는데 4개의 FND가 하나의 패키지에 들어 있는 Common-Cathode 타입의 디스플레이이다.



크기는 크지 않아도 숫자 부분이 뽈록 튀어나와 렌즈 역할을 해 주기 때문에 숫자는 꽤 크게 보인다.


핀 배치는 위의 그림과 같고 Common-Cathode 타입이기 때문에 active high 구동을 하면 된다.


동작을 확인하기 위해 아두이노에는 위의 그림처럼 연결 해 주었다. 그리고 표시되는 카운트를 up/down 하기 위해 두개의 스위치를 추가했다. 우노의 경우 0,1번 핀은 시리얼 포트가 사용하고 있기 때문에 스위치를 추가할 핀이 모자르다. 그래서 아날로그 입력 A0, A1을 디지털 핀으로 사용하였다.


회로도 그림대로 브레드보드에 연결하고 스케치를 실행한 상태이다. 초기 카운트 값이 0이라 QDSP6064에 0000이 표시되고 있다.

video

동작 동영상은 위와 같다.

위에 사용한 스케치 코드는 다음과 같다.

#define UP A0
#define DN A1

const byte gDgtFont[] = {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x72,0x7f,0x7b};
int gCnt = 0;

void setup() {
  int i;

  for (i=0;i<7;i++) pinMode(i+2, OUTPUT);
  for (i=0;i<4;i++) pinMode(i+9, OUTPUT);
  pinMode(UP,INPUT_PULLUP);
  pinMode(DN,INPUT_PULLUP);
  Serial.begin(115200);
}

void loop() {
  dispVal(gCnt);
  checkUpSw();
  checkDnSw();
}

void checkUpSw()
{
  static unsigned long last;
  static boolean prev = HIGH;
  unsigned long now = millis();
  boolean curr;

  if ((now-last)>10) {
    curr = digitalRead(UP);
    if ((HIGH==prev) && (LOW==curr)) {
      gCnt = (gCnt+1)%10000;
    }
    prev = curr;
    last = now;
  }
}

void checkDnSw()
{
  static unsigned long last;
  static boolean prev = HIGH;
  boolean curr;
  unsigned long now = millis();

  if ((now-last)>10) {
    curr = digitalRead(DN);
    if ((HIGH==prev) && (LOW==curr)) {
      gCnt = gCnt-1;
      if (-1 == gCnt) gCnt = 9999;
    }
    prev = curr;
    last = now;
  }
}

void dispVal(int val)
{
  static byte pos = 0;
  static unsigned long last = 0;

  if ((millis()-last)>2) {
    switch(pos) {
      case 0: dispDgt((val/1000),0); break;
      case 1: dispDgt((val/100)%10,1); break;
      case 2: dispDgt((val/10)%10,2); break;
      case 3: dispDgt((val%10),3); break;
    }
    pos = (pos+1) & 3;
    last = millis();
  }
}

void dispDgt(byte dgt, byte pos)
{
  int i;

  for (i=0;i<4;i++) digitalWrite(i+9, HIGH);
  for (i=0;i<7;i++) digitalWrite(i+2, (gDgtFont[dgt]&(1<<(6-i))));
  digitalWrite(pos+9, LOW);
}