//四位七段数码管显示
//一次只能控制一个数码管,所以要多个一起显示,那只能提高频率
//从-9开始,间隔为1,升序显示到-1
//完成这个过程需要先拿两个数码管3和4,3显示-,4显示9,3然后显示-,4显示8…………3显示-,4显示1;
//三个函数,一个用来选择数码管3和4,一个用来显示-,一个用来显示数字,后两个循环9次
//选择数码管,输入想要用的数码管int数字,对应设置com1到com4的4个电平,无输出 要求改函数能够实现1到4号管的选择
//显示-号函数,无输入,设置a到g的对应电平信号,无输出
//显示数字函数,从9到1共9个数字,每个数字需要a到dp的8个电平信号,每个循环需要做一次选择,由所需要显示的对应数字,取出其8个电平信号,然后设置
//即,这个函数是输入一个想要显示的int数字,然后设置该数字对应的a到dp电平信号,无输出 要求该函数能实现数字1到9的设置
//a b c d e f g (dp) COM1 C2 C3 C4
//2 3 4 5 6 7 8 9 10 11 12 13
int choose_LED();//打开数码管
int negative_sign();//符号
int dot_sign();//小数点
int choose_num();//数字显示
int setzero();//a到dp电平全部恢复到低电平,避免干扰
int judge_primenum();//判断素数
#define timedelay 300
void setup()
{
int i = 0 ;
for(i = 2; i<=13;i++)
{
pinMode(i, OUTPUT);
}
}
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();//显示负号
//delay(300);
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();//显示负号
//delay(300);
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(timedelay);
if(k>1)
{
answer = judge_primenum(k);
if(answer == 1)//如果是质数则重复闪烁
{
choose_LED(4);
choose_num(numtoshow_2);
setzero();
delay(timedelay);
choose_num(numtoshow_2);
setzero();
delay(timedelay);
}
}
}
else
{
choose_LED(3);//如果是10以及以上到99的数字,其十位用数码管3显示
choose_num(numtoshow_1);
setzero();
choose_LED(4);//其个位用数码管4显示
choose_num(numtoshow_2);
setzero();
delay(timedelay);
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(timedelay);
choose_LED(3);
choose_num(numtoshow_1);
setzero();
choose_LED(4);
choose_num(numtoshow_2);
setzero();
delay(timedelay);
}
}
}
setzero();
delay(timedelay);
}
}
//定义的函数
int choose_LED(int LED_wanted)//激活想要的数码管
{
switch(LED_wanted)
{
case 1 :
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
break;
case 2 :
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
break;
case 3 :
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
break;
case 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);
}
}
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表示是素数
{
//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;
}