#define pinA 2
#define pinB 3
#define pinC 4
#define pinD 5
#define pinE 7
#define pinF 12
#define pinG 8
#define pinDP 13
#define D1 6
#define D2 9
#define D3 10
#define D4 11
uint8_t pin[12] = { pinA, pinB, pinC, pinD, pinE, pinF, pinG, pinDP, D1, D2, D3, D4 };
void setup() {
for (int i = 0; i < 12; ++i) {
pinMode(pin[i], OUTPUT); // 设为输出电位
}
Serial.begin(9600);
}
// num 为数字,D 为位,共有 4位(个、十、百、千位)
void foo(int num, int D) {
int digits[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
};
for (int i = 0; i < 7; ++i) digitalWrite(pin[i], digits[num][i]);
digitalWrite(pinDP, LOW); // 设为低电位
for (int i = 8; i < 12; ++i) digitalWrite(pin[i], 1);
if(D <= 4) digitalWrite(pin[D + 7], LOW); // 设为低电位
}
void foo3(int num) {
if (num < 10) {
foo(num, 1);
delay(5);
}
else if (num < 100) {
int a, b;
a = num / 10;
b = num % 10;
foo(a, 2);
delay(5);
foo(b, 1);
delay(5);
}
else if (num < 1000) {
int a, b, c, d;
a = num / 100;
b = num % 100 / 10;
c = num % 10;
d = 0;
foo(a, 3);
delay(5);
foo(b, 2);
delay(5);
foo(c, 1);
delay(5);
foo(d, 5);
delay(5);
}
else {
int a, b, c, d;
a = num / 1000;
b = num % 1000 / 100;
c = num % 100 / 10;
d = num % 10;
foo(a, 4);
delay(5);
foo(b, 3);
delay(5);
foo(c, 2);
delay(5);
foo(d, 1);
delay(5);
}
}
int foo2(int num) {
int T = (millis()/1000)%10; // 当程序开始时,millis()函数开始计时(以毫秒为单位),计满50天后,又从0开始一直循环计时
// T 时间线和 foo3() 七段数码管开关函数时间不会互相影响(foo3()只会重复打印当时应该显示的时间)
while (((millis()/1000)%10) - T < 1) {
foo3(num);
}
return T + 1;
}
// 主函数
void loop() {
int x;
for (int num = 0; num < 10000; ++num) {
x = foo2(num);
}
}