/*
업카운터 동작
0 -> .. -> 9 -> ...
-----------------------------------------------------
FND 7447 button
com10 com01 D C B A button2 button1
9 8 7 6 5 4 3 2
*/
// 전역변수
// 버튼의 현재 상태와 이전상태 값을 저장
int buttonState01 = 1;
int buttonState02 = 1;
int buttonState03 = 1;
int lastButtonState01 =1;
int lastButtonState02 =1;
int lastButtonState03 =1;
//LED 상태 저장
int LED_State01 = 0;
int LED_State02 = 0;
int LED_State03 = 0;
// 업카운트, 다운카운트 값을 저장
int upCountq = 0;
int upCountw = 1;
int downCount = 99;
int count = 0;
// 2digit FND 배열, 함수, common cathode
int bcd_number[10][4] = {
// A, B, C, D
{0,0,0,0}, // 0
{1,0,0,0}, // 1
{0,1,0,0},
{0,1,0,0},
{0,0,1,0},
{1,0,1,0},
{0,1,1,0},
{1,1,1,0},
{0,0,0,1},
{1,0,0,1} // 9
};
void bcd_to_744x(int number) {
// common anode !
digitalWrite(4, bcd_number[number][0]); //A
digitalWrite(5, bcd_number[number][1]); //B
digitalWrite(6, bcd_number[number][2]); //C
digitalWrite(7, bcd_number[number][3]); //D
}
// 2자리 숫자를 FND에 표시
void display_number(int number) {
// 10의 자리
int ten = number/10%10;
// 1의 자리
int one = number%10;
// 100ms delay
for(int i=0; i<1000; i++) {
// 1의 자리 표시
digitalWrite(8, 1);
digitalWrite(9, 0);
bcd_to_744x(one);
delay(1);
//10의 자리 표시
// digitalWrite(8, 0);
// digitalWrite(9, 1);
// bcd_to_744x(ten);
// delay(1);
}
}
void setup() {
// put your setup code here, to run once:
// 핀모드 설정
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, INPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
// 시리얼 초기화
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
buttonState01 = digitalRead(2);
buttonState02 = digitalRead(3);
buttonState03 = digitalRead(9);
// 버튼 1을 눌렀을때
Serial.print(buttonState01);
if(LED_State01 == 0){
if(lastButtonState01 == 0 && lastButtonState01 != buttonState01){
digitalWrite(10, HIGH);
display_number(0);
LED_State01 = 1;
}
}
else if(LED_State01 == 1){
if(lastButtonState01 == 0 && lastButtonState01 != buttonState01){
if(LED_State01 == 1 && LED_State02 == 1 || LED_State03 == 1){
digitalWrite(11, LOW);
digitalWrite(12, LOW);
LED_State02 = 0;
LED_State03 = 0;
display_number(0);
}
else
digitalWrite(8, 0);
digitalWrite(10, 0);
LED_State01 = 0;
}
}
if(LED_State01 == 1 && LED_State02 == 0){
if(lastButtonState02 == 0 && lastButtonState02 != buttonState02){
digitalWrite(11, HIGH);
LED_State02 = 1;
if(LED_State03 == 1){
digitalWrite(11, LOW);
LED_State02 = 0;
}
else for(int i=0; i<1000; i++){
display_number(upCountw);
upCountw = upCountw + 2;
if(upCountw > 9) upCountw = 1;
if(lastButtonState02 == 0 && lastButtonState02 != buttonState02) break;
}
}
}
delay(1);
//display_number(upCount);
//upCount++;
lastButtonState01 = buttonState01;
lastButtonState02 = buttonState02;
lastButtonState03 = buttonState03;
}