//定义数码管引脚数组seg
int seg[2][7] =
{ { 2, 3, 4, 5, 6, 7, 8},
{ 9, 10, 11, 12, 13, 14, 15 } };
const int button_pause = 16;
const int button_decrease = 17;
const int button_increase = 18;
const int button_reverse = 19;
const int ledPinRed = 20;
const int ledPinYellow = 21;
const int ledPinGreen = 22;
const int ledPinBlue = 23;
const int ledPinWhite = 24;
int increasePressed = LOW;
int decreasePressed = LOW;
int pausePressed = LOW;
int reversePressed = LOW;
int seconds = 100;
int paused = false;
int reverse = false;
void setup()
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
//初始化按钮引脚为输入模式,并启用内部上拉电阻
pinMode(button_increase, INPUT);
pinMode(button_decrease, INPUT);
pinMode(button_pause, INPUT);
pinMode(button_reverse, INPUT);
pinMode(ledPinRed, OUTPUT);
pinMode(ledPinYellow, OUTPUT);
pinMode(ledPinGreen, OUTPUT);
pinMode(ledPinBlue, OUTPUT);
pinMode(ledPinWhite, OUTPUT);
// 初始化串口通信
Serial.begin(9600);
}
void loop()//循环函数
{
//读取按钮状态
increasePressed = digitalRead(button_increase);
decreasePressed = digitalRead(button_decrease);
pausePressed = digitalRead(button_pause);
reversePressed = digitalRead(button_reverse);
//暂停,继续计时
if ( pausePressed == HIGH )
{
paused = !paused;
if ( paused )
{
digitalWrite(ledPinRed, HIGH);//暂停的时候红灯常亮
} else {
digitalWrite(ledPinRed, LOW);//暂停的时候红灯熄灭
}
delay(500);
}
//增加秒数
if (increasePressed == HIGH )
{
seconds+=10;//+10s
digitalWrite(ledPinGreen, HIGH);
delay(500);
digitalWrite(ledPinGreen, LOW);
}
//减少秒数
if (decreasePressed == HIGH && seconds > 0)
{
seconds-=10;//,-10s
digitalWrite(ledPinYellow, HIGH);
delay(500);
digitalWrite(ledPinYellow, LOW);
}
//展示当今模式所亮的灯,蓝灯代表倒计时,白灯代表正计时
if ( !reverse )
{//代表倒计时的蓝灯常亮
digitalWrite(ledPinWhite, LOW);
digitalWrite(ledPinBlue, HIGH);
} else {//代表正计时的白灯常亮
digitalWrite(ledPinBlue, LOW);
digitalWrite(ledPinWhite, HIGH);
}
//倒计时和正计时互换模式
if ( reversePressed == HIGH )
{
reverse = !reverse;
delay(500);
}
if ( !paused )
{
if ( !reverse )//默认的reverse是false,这个时候是默认倒计时
{
seconds--;
} else {//正计时
seconds++;
}
//输出秒数
displaySeconds();
Serial.println(seconds);
}
}
void displaySeconds()
{
int units = seconds % 10;//个位数
int tens = (seconds / 10) % 10;//十位数
int flash = 5 - (tens/3);//闪烁频率
//数码管显示数字
displayDigit(1,tens);
displayDigit(0,units);
for (int i=0 ; i<flash ; i++ )
{
//十位数的9对应2次闪烁,6-8对应3次,3-5对应4次,0-2对应5次,即倒计数越小LED灯闪烁频率就越高
flash = 5 - (tens/3);
digitalWrite(ledPinRed, HIGH);
delay(500/flash);
digitalWrite(ledPinRed, LOW);
delay(500/flash);
}
}
void displayDigit( int index, int digit )
{
//根据数码管显示数字
switch (digit)
{
case 0:
digitalWrite(seg[index][0], HIGH);
digitalWrite(seg[index][1], HIGH);
digitalWrite(seg[index][2], HIGH);
digitalWrite(seg[index][3], HIGH);
digitalWrite(seg[index][4], HIGH);
digitalWrite(seg[index][5], HIGH);
digitalWrite(seg[index][6], LOW);
break;
case 1:
digitalWrite(seg[index][0], LOW);
digitalWrite(seg[index][1], HIGH);
digitalWrite(seg[index][2], HIGH);
digitalWrite(seg[index][3], LOW);
digitalWrite(seg[index][4], LOW);
digitalWrite(seg[index][5], LOW);
digitalWrite(seg[index][6], LOW);
break;
case 2:
digitalWrite(seg[index][0], HIGH);
digitalWrite(seg[index][1], HIGH);
digitalWrite(seg[index][2], LOW);
digitalWrite(seg[index][3], HIGH);
digitalWrite(seg[index][4], HIGH);
digitalWrite(seg[index][5], LOW);
digitalWrite(seg[index][6], HIGH);
break;
case 3:
digitalWrite(seg[index][0], HIGH);
digitalWrite(seg[index][1], HIGH);
digitalWrite(seg[index][2], HIGH);
digitalWrite(seg[index][3], HIGH);
digitalWrite(seg[index][4], LOW);
digitalWrite(seg[index][5], LOW);
digitalWrite(seg[index][6], HIGH);
break;
case 4:
digitalWrite(seg[index][0], LOW);
digitalWrite(seg[index][1], HIGH);
digitalWrite(seg[index][2], HIGH);
digitalWrite(seg[index][3], LOW);
digitalWrite(seg[index][4], LOW);
digitalWrite(seg[index][5], HIGH);
digitalWrite(seg[index][6], HIGH);
break;
case 5:
digitalWrite(seg[index][0], HIGH);
digitalWrite(seg[index][1], LOW);
digitalWrite(seg[index][2], HIGH);
digitalWrite(seg[index][3], HIGH);
digitalWrite(seg[index][4], LOW);
digitalWrite(seg[index][5], HIGH);
digitalWrite(seg[index][6], HIGH);
break;
case 6:
digitalWrite(seg[index][0], HIGH);
digitalWrite(seg[index][1], LOW);
digitalWrite(seg[index][2], HIGH);
digitalWrite(seg[index][3], HIGH);
digitalWrite(seg[index][4], HIGH);
digitalWrite(seg[index][5], HIGH);
digitalWrite(seg[index][6], HIGH);
break;
case 7:
digitalWrite(seg[index][0], HIGH);
digitalWrite(seg[index][1], HIGH);
digitalWrite(seg[index][2], HIGH);
digitalWrite(seg[index][3], LOW);
digitalWrite(seg[index][4], LOW);
digitalWrite(seg[index][5], LOW);
digitalWrite(seg[index][6], LOW);
break;
case 8:
digitalWrite(seg[index][0], HIGH);
digitalWrite(seg[index][1], HIGH);
digitalWrite(seg[index][2], HIGH);
digitalWrite(seg[index][3], HIGH);
digitalWrite(seg[index][4], HIGH);
digitalWrite(seg[index][5], HIGH);
digitalWrite(seg[index][6], HIGH);
break;
case 9:
digitalWrite(seg[index][0], HIGH);
digitalWrite(seg[index][1], HIGH);
digitalWrite(seg[index][2], HIGH);
digitalWrite(seg[index][3], HIGH);
digitalWrite(seg[index][4], LOW);
digitalWrite(seg[index][5], HIGH);
digitalWrite(seg[index][6], HIGH);
break;
}
}