第一种方案 从1-12引脚分别如图所示这样接
下面五个脚从左到右分别是1 2 3 4 5,上面六个脚从右到左分别是7 8 9 10 11 12,13是LED灯
实现方案一:将数码管从1变成99 两位数字相同时会使得LED灯亮
#define open(num) digitalWrite(num,LOW)
#define close(num) digitalWrite(num,HIGH)
int e=1;
int d=2;
int dp=3;
int c=4;
int g=5;
int b=7;
int BT3=8;
int BT2=9;
int f=10;
int a=11;
int BT1=12;
int LED=13;///LED变成高电平时会亮
void digital_1()
{
open(b);
open(c);
delay(10);
}
void digital_2()
{
open(a);
open(b);
open(g);
open(e);
open(d);
delay(10);
}
void digital_3()
{
open(a);
open(b);
open(g);
open(c);
open(d);
delay(10);
}
void digital_4()
{
open(b);
open(f);
open(g);
open(c);
delay(10);
}
void digital_5()
{
open(a);
open(f);
open(g);
open(c);
open(d);
delay(10);
}
void digital_6()
{
open(a);
open(f);
open(g);
open(e);
open(c);
open(d);
delay(10);
}
void digital_7()
{
open(a);
open(b);
open(c);
delay(10);
}
void digital_8()
{
open(a);
open(f);
open(g);
open(e);
open(c);
open(d);
open(b);
delay(10);
}
void digital_9()
{
open(a);
open(f);
open(g);
open(c);
open(d);
open(b);
delay(10);
}
void digital_0()
{
open(a);
open(f);
open(e);
open(c);
open(d);
open(b);
delay(10);
}
void setup()
{
unsigned char i;
for(i=1;i<=13;i++)
{
pinMode(i,OUTPUT);
digitalWrite(i,HIGH);
}
digitalWrite(13,LOW);
open(8);
open(9);
open(12);
}
void resetup()
{
int i;
for(i=1;i<=12;i++)
{
digitalWrite(i,HIGH);
}
open(8);
open(9);
open(12);
}
void digital_up(int num)
{
int num1=num/10;
int num2=num%10;
int i=20;
while(i--)
{
switch(num1)
{
case 0:digital_0();break;
case 1:digital_1();break;
case 2:digital_2();break;
case 3:digital_3();break;
case 4:digital_4();break;
case 5:digital_5();break;
case 6:digital_6();break;
case 7:digital_7();break;
case 8:digital_8();break;
case 9:digital_9();
}
close(BT2);
delay(1);
resetup();
open(BT2);
switch(num2)
{
case 0:digital_0();break;
case 1:digital_1();break;
case 2:digital_2();break;
case 3:digital_3();break;
case 4:digital_4();break;
case 5:digital_5();break;
case 6:digital_6();break;
case 7:digital_7();break;
case 8:digital_8();break;
case 9:digital_9();
}
close(BT3);
delay(1);
resetup();
open(BT3);
}
open(BT2);
open(BT3);
return;
}
void flash()//使LED闪烁
{
digitalWrite(13,HIGH);
delay(200);
digitalWrite(13,LOW);
delay(200);
digitalWrite(13,HIGH);
delay(200);
digitalWrite(13,LOW);
delay(200);
}
void loop()
{
unsigned char i,j;
for(i=0;i<=9;i++)
{
for(j=0;j<=9;j++)
{
digitalWrite(13, i == j);
digital_up(10*i+j);
}
}
}
思路:将数码管从1-99 两位数码管亮起时使用交错亮灯的方式实现,因为数码管内部电路的原因使其在短时间内执行,发生的延时效果人眼无法观察到,因此形成了两位数码管所显示的数字不同。当两位数码管亮起相同数字时会使得LED亮起,LED在两位数码管亮出不同数字时结束。
注意点:1.数码管数字在逐次递增过程中一定要注意BT和初始化的顺序,因为不注意顺序的话换位之后就会使得另一位亮出上一位的数字操作快的话基本上就会闪一下,不会平稳度过。2.在LED亮起的时候使用分时操作,这样就相当于在同一时间同时进行两个操作,如果仅仅用简单的过程堆积来做的话就会卡克(等到LED亮起函数执行时会消耗时间)。数码管执行时同样消耗时间,两个操作是不可能同时执行的,但是延时是可以同时执行的,因此消耗公共的时间会使得程序执行更加流畅,代码中有分时操作。
实验二:将数码管从1到99 两位数字相同时使LED灯执行闪烁两次
#define open(num) digitalWrite(num,LOW)
#define close(num) digitalWrite(num,HIGH)
int e=1;
int d=2;
int dp=3;
int c=4;
int g=5;
int b=7;
int BT3=8;
int BT2=9;
int f=10;
int a=11;
int BT1=12;
int LED=13;///LED变成高电平时会亮
void digital_1()
{
open(b);
open(c);
delay(10);
}
void digital_2()
{
open(a);
open(b);
open(g);
open(e);
open(d);
delay(10);
}
void digital_3()
{
open(a);
open(b);
open(g);
open(c);
open(d);
delay(10);
}
void digital_4()
{
open(b);
open(f);
open(g);
open(c);
delay(10);
}
void digital_5()
{
open(a);
open(f);
open(g);
open(c);
open(d);
delay(10);
}
void digital_6()
{
open(a);
open(f);
open(g);
open(e);
open(c);
open(d);
delay(10);
}
void digital_7()
{
open(a);
open(b);
open(c);
delay(10);
}
void digital_8()
{
open(a);
open(f);
open(g);
open(e);
open(c);
open(d);
open(b);
delay(10);
}
void digital_9()
{
open(a);
open(f);
open(g);
open(c);
open(d);
open(b);
delay(10);
}
void digital_0()
{
open(a);
open(f);
open(e);
open(c);
open(d);
open(b);
delay(10);
}
void setup()
{
unsigned char i;
for(i=1;i<=13;i++)
{
pinMode(i,OUTPUT);
digitalWrite(i,HIGH);
}
digitalWrite(13,LOW);
open(8);
open(9);
open(12);
}
void resetup()
{
int i;
for(i=1;i<=12;i++)
{
digitalWrite(i,HIGH);
}
open(8);
open(9);
open(12);
}
void digital_up(int num)
{
int num1=num/10;
int num2=num%10;
int i=20;
while(i--)
{
switch(num1)
{
case 0:digital_0();break;
case 1:digital_1();break;
case 2:digital_2();break;
case 3:digital_3();break;
case 4:digital_4();break;
case 5:digital_5();break;
case 6:digital_6();break;
case 7:digital_7();break;
case 8:digital_8();break;
case 9:digital_9();
}
close(BT2);
delay(1);
resetup();
open(BT2);
switch(num2)
{
case 0:digital_0();break;
case 1:digital_1();break;
case 2:digital_2();break;
case 3:digital_3();break;
case 4:digital_4();break;
case 5:digital_5();break;
case 6:digital_6();break;
case 7:digital_7();break;
case 8:digital_8();break;
case 9:digital_9();
}
close(BT3);
delay(1);
resetup();
open(BT3);
}
open(BT2);
open(BT3);
return;
}
int FlashTimes = 0;
void flash()//使LED闪烁
{
if(FlashTimes % 2 == 0)
{
digitalWrite(13,HIGH);
}
else
{
digitalWrite(13,LOW);
}
if(FlashTimes < 3)
{
FlashTimes ++;
}
}
void digitalShow(int num1, int num2)
{
switch(num1)
{
case 0:digital_0();break;
case 1:digital_1();break;
case 2:digital_2();break;
case 3:digital_3();break;
case 4:digital_4();break;
case 5:digital_5();break;
case 6:digital_6();break;
case 7:digital_7();break;
case 8:digital_8();break;
case 9:digital_9();
}
close(BT2);
delay(1);
resetup();
open(BT2);
switch(num2)
{
case 0:digital_0();break;
case 1:digital_1();break;
case 2:digital_2();break;
case 3:digital_3();break;
case 4:digital_4();break;
case 5:digital_5();break;
case 6:digital_6();break;
case 7:digital_7();break;
case 8:digital_8();break;
case 9:digital_9();
}
close(BT3);
delay(1);
resetup();
open(BT3);
}
void loop()
{
unsigned char i,j;
for(i=0;i<=9;i++)
{
for(j=0;j<=9;j++)
{
if(i == j)
{
FlashTimes = 0;
}
flash();
for(int a = 0; a < 7; a++)
{
digitalShow(i,j);
}
}
}
}
思路:和第一个一样,只不过LED亮灯方法发生了改变
注意点:LED亮灯方法改变不只是简单地函数操作改变,与上一个一样,要使得该功能能够正常进行并且不会影响数码管的节奏,因此还要用到分时结构
总结:1.解决数码管闪烁:注意执行顺序以及延时跳过电压不稳定期
2.解决LED亮灭影响数码管节奏:延时是可以同时进行的,将延时同时进行不拖慢数码管节奏
3.其他问题:将程序写成分时结构更加利于进行其他操作