// A
// _______
// | |
// F | G | B
// |_______|
// | |
// E | | C
// |_______| o H
//
// D
// 8 DIGIT LED DISPLAY
#define DIGITS 8
// SINK PINS FOR 8 DIGITS
int gPin[DIGITS] = {14,15,16,17,18,19,11,10}; //A0,A1,A2,A3,A4,A5,D11,D10
long digi[DIGITS];
int DTime = 4;
long sNum;
void d_PREP() {
PORTD &= B00000011; // 2 - 7 0'lanıyor, 0,1(TX/RX) değişmiyor
PORTB &= B11111100; // 8 - 9 0'lanıyor, diğerleri değişmiyor
}
void setup(){
DDRD |= B11111100; // 2 - 7 output, 0,1(TX/RX) değişmiyor
DDRB |= B00000011; // 8 - 9 output, diğerleri değişmiyor
d_PREP(); // 2 - 7 0'lanıyor, 8 - 9 0'lanıyor, 0,1(TX/RX) ve diğer pinler değişmiyot
for (int i=0;i<DIGITS;i++){
pinMode(gPin[i], OUTPUT);
}
Serial.begin(9600);
}
void loop(){
if (Serial.available() > 0) {
sNum = Serial.parseInt();
digiCalc(sNum);
}
for (int i=0;i<DIGITS;i++){
int j = (DIGITS - 1) - i;
digitalWrite(gPin[i], LOW);
pickNumber(digi[j]);
digitalWrite(gPin[i], HIGH);
delay(DTime);
digitalWrite(gPin[i], LOW);
}
}
void digiCalc(long num){
// Serial.println(num);
/*for (int i=0;i<DIGITS;i++){
long j = (DIGITS - 1) - i;
long k = 0.5 + pow(10,j);
digi[j] = num / k;
num = num - (digi[j] * k);
}*/
digi[7] = num / 10000000;
num = num - (digi[7] * 10000000);
digi[6] = num / 1000000;
num = num - (digi[6] * 1000000);
digi[5] = num / 100000;
num = num - (digi[5] * 100000);
digi[4] = num / 10000;
num = num - (digi[4] * 10000);
digi[3] = num / 1000;
num = num - (digi[3] * 1000);
digi[2] = num / 100;
num = num - (digi[2] * 100);
digi[1] = num / 10;
num = num - (digi[1] * 10);
digi[0] = num / 1;
}
void d_dot() {
// DIGIT -FEDCBA00
PORTD |= B00000000;
// DIGIT -000000HG
PORTB |= B00000010;
}
void d_zero(boolean bDot){
// DIGIT -FEDCBA00
PORTD |= B11111100;
// DIGIT -000000HG
PORTB |= B00000000;
if(bDot) d_dot();
}
void d_one(boolean bDot){
// DIGIT -FEDCBA00
PORTD |= B00011000;
// DIGIT -000000HG
PORTB |= B00000000;
if(bDot) d_dot();
}
void d_two(boolean bDot){
// DIGIT -FEDCBA00
PORTD |= B01101100;
// DIGIT -000000HG
PORTB |= B00000001;
if(bDot) d_dot();
}
void d_three(boolean bDot){
// DIGIT -FEDCBA00
PORTD |= B00111100;
// DIGIT -000000HG
PORTB |= B00000001;
if(bDot) d_dot();
}
void d_four(boolean bDot){
// DIGIT -FEDCBA00
PORTD |= B10011000;
// DIGIT -000000HG
PORTB |= B00000001;
if(bDot) d_dot();
}
void d_five(boolean bDot){
// DIGIT -FEDCBA00
PORTD |= B10110100;
// DIGIT -000000HG
PORTB |= B00000001;
if(bDot) d_dot();
}
void d_six(boolean bDot){
// DIGIT -FEDCBA00
PORTD |= B11110100;
// DIGIT -000000HG
PORTB |= B00000001;
if(bDot) d_dot();
}
void d_seven(boolean bDot){
// DIGIT -FEDCBA00
PORTD |= B00011100;
// DIGIT -000000HG
PORTB |= B00000000;
if(bDot) d_dot();
}
void d_eight(boolean bDot){
// DIGIT -FEDCBA00
PORTD |= B11111100;
// DIGIT -000000HG
PORTB |= B00000001;
if(bDot) d_dot();
}
void d_nine(boolean bDot){
// DIGIT -FEDCBA00
PORTD |= B10111100;
// DIGIT -000000HG
PORTB |= B00000001;
if(bDot) d_dot();
}
void pickNumber(char x){
d_PREP();
switch(x){
case 0: d_zero(0); break;
case 1: d_one(0); break;
case 2: d_two(0); break;
case 3: d_three(0); break;
case 4: d_four(0); break;
case 5: d_five(0); break;
case 6: d_six(0); break;
case 7: d_seven(0); break;
case 8: d_eight(0); break;
case 9: d_nine(0); break;
default: d_dot(); break;
}
}