//该数码管是四位,共阴极数码管
// 数码管引脚连接
#define DIGIT_1 2
#define DIGIT_2 3
#define DIGIT_3 4
#define DIGIT_4 5
#define SEG_A 6
#define SEG_B 7
#define SEG_C 8
#define SEG_D 9
#define SEG_E 10
#define SEG_F 11
#define SEG_G 12
#define SEG_DP 13
// 数码管的数字映射表
const byte digitMap[11][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, 0, 0, 1, 1}, // 9
{0, 0, 0, 0, 0, 0, 1} // -
};
void setup() {
// 设置数码管引脚为输出模式
pinMode(DIGIT_1, OUTPUT);
pinMode(DIGIT_2, OUTPUT);
pinMode(DIGIT_3, OUTPUT);
pinMode(DIGIT_4, OUTPUT);
pinMode(SEG_A, OUTPUT);
pinMode(SEG_B, OUTPUT);
pinMode(SEG_C, OUTPUT);
pinMode(SEG_D, OUTPUT);
pinMode(SEG_E, OUTPUT);
pinMode(SEG_F, OUTPUT);
pinMode(SEG_G, OUTPUT);
digitalWrite(SEG_A, LOW);//防止开头闪一下
digitalWrite(SEG_B, LOW);
digitalWrite(SEG_C, LOW);
digitalWrite(SEG_D, LOW);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_G, LOW);
digitalWrite(DIGIT_1, HIGH);
digitalWrite(DIGIT_2, HIGH);
digitalWrite(DIGIT_3, HIGH);
digitalWrite(DIGIT_4, HIGH);
}
void loop() {
//显示-9~-1
for(int i = 9; i>= 1; i--){
for (int j = 1; j <= 500; j++){//让显示时间更长,代码谁让你能实现功能,但是还是存在遗憾,代码不能根据数据位数来调整显示时间,数据位数越多,显示时间越长。
//显示“-”
digitalWrite(DIGIT_3, LOW);
digitalWrite(SEG_G, HIGH);
delay(1);
digitalWrite(SEG_G, LOW);
digitalWrite(DIGIT_3, HIGH);
displayNumber(i);
}
delay(100);
}
//显示—0.9~-0.1
for(int i = 9; i>= 1; i--){
for (int j = 1; j <= 500; j++){//让显示时间更长,代码谁让你能实现功能,但是还是存在遗憾,代码不能根据数据位数来调整显示时间,数据位数越多,显示时间越长。
//显示“-”
digitalWrite(DIGIT_2, LOW);
digitalWrite(SEG_G, HIGH);
delay(1);
digitalWrite(SEG_G, LOW);
digitalWrite(DIGIT_2, HIGH);
//显示“0.“
digitalWrite(DIGIT_3, LOW);
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, HIGH);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_DP, HIGH);
digitalWrite(SEG_A, LOW);
digitalWrite(SEG_B, LOW);
digitalWrite(SEG_C, LOW);
digitalWrite(SEG_D, LOW);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_DP, LOW);
digitalWrite(DIGIT_3, HIGH);
displayNumber(i);
}
delay(100);
}
// 显示数字0到20
for (int i = 0; i <= 20; i++) {
if ( isPrime(i) ){
for (int k = 0; k <= 2; k++) {
for (int j = 1; j <= 500; j++){//让显示时间更长,代码谁让你能实现功能,但是还是存在遗憾,代码不能根据数据位数来调整显示时间,数据位数越多,显示时间越长。
displayNumber(i);
}
delay(1000);
}
}
else{
for (int j = 1; j <= 500; j++){
displayNumber(i);
}
}
delay(1000); // 每0.1秒更新一次显示
}
}
void displayNumber(int num) {
// 将数字转换成数组,每个数组元素代表一个数位的数字
int digits[4] = {0};
int index = 3;
while (num > 0 && index >= 0) {
digits[index] = num % 10;
num /= 10;
index--;
}
int pass=0;
// 显示数字
digitalWrite(DIGIT_1, LOW);
//if语句用来跳过开头0的显示
if (digits[0]!=0){
displayDigit(digits[0]);
delay(1);
}
digitalWrite(DIGIT_1, HIGH);
digitalWrite(DIGIT_2, LOW);
if (digits[1]!=0||digits[0]!=0){
displayDigit(digits[1]);
delay(1);
}
digitalWrite(DIGIT_2, HIGH);
digitalWrite(DIGIT_3, LOW);
if (digits[2]!=0||digits[1]!=0||digits[0]!=0){
displayDigit(digits[2]);
delay(1);
}
digitalWrite(DIGIT_3, HIGH);
digitalWrite(DIGIT_4, LOW);
displayDigit(digits[3]);
delay(1);
digitalWrite(DIGIT_4, HIGH);
}
void displayDigit(int digit) {
// 控制每个数码管段的亮灭
digitalWrite(SEG_A, digitMap[digit][0]);
digitalWrite(SEG_B, digitMap[digit][1]);
digitalWrite(SEG_C, digitMap[digit][2]);
digitalWrite(SEG_D, digitMap[digit][3]);
digitalWrite(SEG_E, digitMap[digit][4]);
digitalWrite(SEG_F, digitMap[digit][5]);
digitalWrite(SEG_G, digitMap[digit][6]);
digitalWrite(SEG_A, LOW);//用来清除上次显示带来的影响
digitalWrite(SEG_B, LOW);
digitalWrite(SEG_C, LOW);
digitalWrite(SEG_D, LOW);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_G, LOW);
}
int isPrime(int num) {
// 如果数字小于等于1,则不是质数
if (num <= 1) {
return 0;
}
// 对2进行特殊处理
if (num == 2) {
return 1;
}
// 如果能被2整除,那么不是质数
if (num % 2 == 0) {
return 0;
}
// 循环检查是否能被奇数整除
for (int i = 3; i * i <= num; i += 2) {
if (num % i == 0) {
return 0;
}
}
// 如果都不能整除,则是质数
return 1;
}