int choose_LED();//打开数码管
int negative_sign();//符号
int dot_sign();//小数点
int choose_num();//数字显示
int setzero();//a到dp电平全部恢复到低电平,避免干扰
int judge_primenum();//判断素数
#define timedelay 1000
void setup()
{
int i = 0 ;
for(i = 2; i<=13;i++)
{
pinMode(i, OUTPUT);//引脚2-13
}
}
void loop()
{
//整数显示
int num[9] = {9,8,7,6,5,4,3,2,1} ;
int j = 0;
for(j=1;j<=9;j++)
{
choose_LED(3);//选择3数码管
negative_sign();//显示负号
setzero();
choose_LED(4);//选择4数码管
choose_num(num[j-1]);//显示数字
setzero();
delay(timedelay);
}
//小数显示
for(j=1;j<=9;j++)
{
choose_LED(2);//选择3数码管
negative_sign();//显示负号
setzero();
choose_LED(3);//选择3数码管
dot_sign();//显示小数点
setzero();
choose_LED(4);//选择4数码管
choose_num(num[j-1]);//显示数字
setzero();
delay(timedelay);
}
//质数显示
int num2[21][2] =
{
{0,0},//把要显示的数字拆成两位
{0,1},
{0,2},
{0,3},
{0,4},
{0,5},
{0,6},
{0,7},
{0,8},
{0,9},
{1,0},
{1,1},
{1,2},
{1,3},
{1,4},
{1,5},
{1,6},
{1,7},
{1,8},
{1,9},
{2,0}
};
int k = 0 ;
int numtoshow_1 = 0;
int numtoshow_2 = 0;
bool answer = false;
for(k=0;k<=20;k++)
{
numtoshow_1=num2[k][0];//十位数字
numtoshow_2=num2[k][1];//个位数字
if(numtoshow_1==0)
{
choose_LED(4);//如果是0到9的数字,其十位为0(不予显示),只需要一个数码管4来显示其数字
choose_num(numtoshow_2);
setzero();
delay(300);
if(k>1)
{
answer = judge_primenum(k);
if(answer == 1)//如果是质数则重复闪烁
{
choose_LED(4);
choose_num(numtoshow_2);
setzero();
delay(300);
choose_num(numtoshow_2);
setzero();
delay(300);
}
}
}
else
{
choose_LED(3);//如果是10以及以上到99的数字,其十位用数码管3显示
choose_num(numtoshow_1);
setzero();
choose_LED(4);//其个位用数码管4显示
choose_num(numtoshow_2);
setzero();
delay(300);
if(k>1)
{
answer = judge_primenum(k);
if(answer == 1)//如果是质数则重复闪烁
{
choose_LED(3);
choose_num(numtoshow_1);
setzero();
choose_LED(4);
choose_num(numtoshow_2);
setzero();
delay(300);
choose_LED(3);
choose_num(numtoshow_1);
setzero();
choose_LED(4);
choose_num(numtoshow_2);
setzero();
delay(300);
}
}
}
setzero();
delay(600);//正数时只能0.6s+0.3s接近到1秒来延迟变化
}
}
//定义的函数
int choose_LED(int LED_wanted)//激活想要的数码管(感觉只需要后三个)
{
switch(LED_wanted)
{
case 1 : //管1亮
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
break;
case 2 : //管2亮
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
break;
case 3 : //管3亮
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
break;
case 4 : //管4亮
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
break;
default:break;
}
return 0 ;
}
int setzero(void)//所有a到dp电平归0
{
int j = 0;
for(j=2;j<=9;j++)
{
digitalWrite(j,LOW);
}//这里2-9对应a-dp
}
int negative_sign(void)//显示负号
{
int neg[9] = {0,0,0,0,0,0,1,0};
int i = 0;
for(i=2;i<=9;i++)
{
digitalWrite(i,neg[i-2]);
}
return 0 ;
}
int dot_sign(void)//显示小数点号
{
int neg[9] = {1,1,1,1,1,1,0,1};
int i = 0;
for(i=2;i<=9;i++)
{
digitalWrite(i,neg[i-2]);
}
return 0 ;
}
//显示数字的二元数组
int numvoltageList[10][8]=
{
{1,1,1,1,1,1,0,0},//0
{0,1,1,0,0,0,0,0},//1
{1,1,0,1,1,0,1,0},//2
{1,1,1,1,0,0,1,0},//3
{0,1,1,0,0,1,1,0},//4
{1,0,1,1,0,1,1,0},//5
{1,0,1,1,1,1,1,0},//6
{1,1,1,0,0,0,0,0},//7
{1,1,1,1,1,1,1,0},//8
{1,1,1,1,0,1,1,0}//9
};
int choose_num(int num)//显示数字
{
int i = 0;
for(i=2;i<=9;i++)
{
digitalWrite(i,numvoltageList[num][i-2]);
}
return 0 ;
}
int judge_primenum(int num)//输入一个数,输出0表示不是素数,输出1表示是素数(也可以2,3,5,7,11,13,17,19)
{
//int k = 0 ;
int i = 0 ;
int answer = 0;
for(i=2;i<num;i++)
{
if(num%i==0)//num能被2到num平方根间的整除,即不是素数
{
break;//提前结束,此时i<k
}
}
if(i<num)
{
answer = 0;
}
else
{
answer = 1;
}
return answer;
}
//这个原代码本身就很标准且完美,我只能改些数据让正数部分变换间隔达到接近1s 装控2403 王俊倪