저번시간에 FND 하나짜리를 컨트롤했었다.
이번에는 4개짜리 FND를 컨트롤 해보자.
1개짜리 FND는 9개 핀, 74595 IC를 이용했을 때 5개의 핀이 필요하다.
이번엔 4개짜리니까 36개 혹은 20개가 필요할까?
그건 아니다~
4개의 digit이 있는데, 한 번에 하나의 digit만 불을 켤 것이다.
1번digit 켰다가 끄고 2번digit 켰다가 끄고 . ... 4번digit 켰다가 끄는 과정을 매우 빠르게 반복하면
인간의 눈으로는 1,2,3,4번 digit이 모두 켜져있는것 처럼 보인다.(잔상효과 때문)
4digit FND를 사용하여 0000, 1111, 2222 . . .9999 출력하기.
LED A~G를 2~9번 핀에 연결한다.(330옴 저항과 함께 연결한다)
그리고 몇 번째 digit을 켤 건지 받을 DIG1~4를 10~13번 핀에 연결한다.
여기서 DIG1~4를 digitalWrite(DIG,LOW)를 해주었는데
이게 common cathode 방식이라서 LOW가 불을 끄는것으로 된 것 같다.
const byte number[10]={
//dot gfedcba
B00111111,
B00000110,
//나머진나중에적을게;;
};
int count=0; //표시할 숫자
void setup(){
for(int i=2;i<=13;i++){
pinMode(i,OUTPUT);}
for(int i=10;i<=13;i++){
digitalWrite(i,LOW);}//잘 연결됐는지 FND 점등시켜보기.
}
void loop()
{
fndDisplay(count);
if(count>=9)
count =0;
else
count++;
delay(1000);
}
void fndDisplay(int displayValue)
{
boolean bitValue;
for(int i=2;i<=9;i++){
digitalWrite(i,LOW); //우선 모든 LED를 꺼줌
}
for(int i=0;i<=7;i++){
bitValue = bitRead(number[displayValue],i);
digitalWrite(i+2,bitValue);
}
}
1씩 증가하는 숫자를 FND에 표현하기
앞서 했던 실험과 준비과정은 똑같게 하고 코드만 수정하면 된다.
앞의 실험은 4개 digit을 모두 켜놓고, 4개 digit에 똑같은 값이 들어가도록 했었는데,
이번에는 4개의 digit에 각기 다른 숫자가 나오도록 할 것이다.
글 맨 앞에서 설명했던 것처럼, 한번에 하나의 digit만 출력하는데, 매우 빠르게 로테이션 돌려서 마치 모두 다 켜져있는것처럼 보이게 할 것이다.
예를들어 '3 5 2 8' 이라는 값을 출력하는 상황이면,
1) DIG1에 3출력 후 끔
2) DIG2에 5출력 후 끔
3) DIG3에 2출력 후 끔
4) DIG4에 8출력 후 끔
이 과정을 매우 빠르게 반복시키는 것임.
const byte number[10]={
//dot gfedcba
B00111111,
B00000110,
//나머진나중에적을게;;
};
const int digitNumber[4] = {13,12,11,10};
int count=0; //표시할 숫자
int value[4]; //각 자릿수에 맞는 숫자를 저장할 변수
int digitSelect; //4개의 digit에 각각 다른 숫자를 표시하기 위해 사용하는 변수
long sampleTime;
int count5ms;
void setup(){
for(int i=2;i<=13;i++){
pinMode(i,OUTPUT);}
for(int i=10;i<=13;i++){
digitalWrite(i,HIGH);}//FND 모두 소등.
}
void loop()
{
sampleTie = millis(); //현재 시간 저장
fndDisplay(digitSelect,value[digitSelect-1]);
digitSelect++;
if(digitSelect>=5)
digitSelect = 1;
if(count>=9999)
count=0;
else{
while(millis() - sampleTime <5);
count5ms++;
if(count5ms >200)//1초가 되는 경우
{
count++;
value[3] = count/1000;
value[2] = (count%1000)/100;
value[1] = (count%100)/10;
value[0] = count%10;
count5ms =0;
}}
}
void fndDisplay(int digit,int displayValue)
{
bool bitValue;
for(int i=1;i<=4;i++){
digitalWrite(digitNumber[i-1],HIGH);
}//일단 모두 소등시킴
for(int i=0;i<=7;i++){
bitValue = bitRead(number[displayValue],i);
digitalWrite(i+2,bitValue);
}
digitalWrite(digitNumber[i-1],LOW)//해당 digit만 켬
}
8x8 DOT maxtirx
const int colPins[] = {2,3,4,5,6,7,8,9};
const int rowPins[] = {10,11,12,15,16,17,18,19};
void setup(){
for(int i=0;i<8;i++){
pinMode(colPins[i],OUTPUT);
pinMode(rowPins[i],OUTPUT);
}
}
void loop(){
for(int column=0; column<8; column++){
colClear();
digitalWrite(colPins[column],LOW); //현재 열 켬
for(int row=0;row<8;row++){
digitalWrite(rowPins[row],HIGH);//행 켬
delay(100);
}
rowClear();
}
rowClear();
}
void colClear(){
for(int i=0;i<8;i++){
digitalWrite(colPins[i],HIGH);
}
}
void rowClear(){
for(int i=0;i<8;i++){
digitalWrite(rowPins[i],LOW);
}
}
//col => Cathode에 연결돼서 HIGH일 때 꺼짐. 반대로 row는 LOW일 때 꺼짐
'2022-2 > 마이크로프로세서' 카테고리의 다른 글
6. Analog Input (1) | 2022.11.01 |
---|---|
5. Digital Signal Input (0) | 2022.10.23 |
아두이노와 기타등등 알아보기 (0) | 2022.10.14 |
4장 - LED (1) | 2022.10.06 |
3. LCD Display (4) | 2022.09.28 |
댓글