Arduino 4位7段,带74HC595,倒计时

Arduino 4位7段,带74HC595,倒计时,arduino,countdown,Arduino,Countdown,我正在进行一个arduino项目,我想增加一个59:59倒计时 我用的是一个4位数的7段和74HC595 使用下面的代码,我有以下问题: 没有1000的延迟,倒计时工作正常,但速度比我需要的要快得多 如果我加上延迟,数字每秒显示一个,因为“display_number”每个循环只运行一个。倒计时很有效,但这不是表现它的方式 当我尝试运行每个循环4倍的“display_number”时,计数器应该以正确的方式显示4个数字,它只显示4位中的最后一个 我不能显示数字,所以它们代表倒计时 我的代码很简单

我正在进行一个arduino项目,我想增加一个59:59倒计时

我用的是一个4位数的7段和74HC595

使用下面的代码,我有以下问题:

没有1000的延迟,倒计时工作正常,但速度比我需要的要快得多

如果我加上延迟,数字每秒显示一个,因为“display_number”每个循环只运行一个。倒计时很有效,但这不是表现它的方式

当我尝试运行每个循环4倍的“display_number”时,计数器应该以正确的方式显示4个数字,它只显示4位中的最后一个

我不能显示数字,所以它们代表倒计时

我的代码很简单,它只有变量、设置、数字分割函数和显示数字本身

谢谢

#include "Timer.h" //include timer library
Timer t; // craete a timer object
long number = 0; //declear the variables
int first_digit = 0;
int second_digit = 0;
int third_digit = 0;
int fourth_digit = 0;
int timer_event = 0;
int CA_1 = 3;
int CA_2 = 2;
int CA_3 = 4;
int CA_4 = 5;
int clk = 10;
int latch = 9;
int data = 8;
int count = 0;
int digits[4] ;
int CAS[4] = {3, 2, 4, 5};
byte numbers[10] {B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110};
//byte combinations for each number 0-9

int minutos=59;
int segundos=59;

int past_number=0;


void setup() {
  Serial.begin(9600); //serial start and pin config
  pinMode(CA_1, OUTPUT);
  pinMode(CA_2, OUTPUT);
  pinMode(CA_3, OUTPUT);
  pinMode(CA_4, OUTPUT);
  pinMode(clk, OUTPUT);
  pinMode(latch, OUTPUT);
  pinMode(data, OUTPUT);
  digitalWrite(CA_1, HIGH);
  digitalWrite(CA_2, HIGH);
  digitalWrite(CA_3, HIGH);
  digitalWrite(CA_4, HIGH);

}

void loop() {
  
 number=minutos*100+segundos;
 if (number!= past_number){
  delay(1000);}
 

  Serial.println(number);

  cathode_high();
  break_number(number);


  display_number();

 
   
  segundos=segundos-1;
    if (segundos == 0){
    minutos = minutos-1;
    segundos=59;}


  past_number=number;  
   
}


void break_number(long num) { // seperate the input number into 4 single digits

  first_digit = num / 1000;
  digits[0] = first_digit;

  int first_left = num - (first_digit * 1000);
  second_digit = first_left / 100;
  digits[1] = second_digit;
  int second_left = first_left - (second_digit * 100);
  third_digit = second_left / 10;
  digits[2] = third_digit;
  fourth_digit = second_left - (third_digit * 10);
  digits[3] = fourth_digit;
}


void cathode_high() { //turn off all 4 digits
  digitalWrite(CA_1, HIGH);
  digitalWrite(CA_2, HIGH);
  digitalWrite(CA_3, HIGH);
  digitalWrite(CA_4, HIGH);
}


void display_number() { //scanning

  cathode_high(); //black screen
  digitalWrite(latch, LOW); //put the shift register to read
  shiftOut(data, clk, LSBFIRST, numbers[digits[count]]); //send the data
  digitalWrite(CAS[count], LOW); //turn on the relevent digit
  digitalWrite(latch, HIGH); //put the shift register to write mode
  count++; //count up the digit
  if (count == 4) { // keep the count between 0-3
    count = 0;
  }
  
}

即使内容没有更改,也必须至少每10毫秒刷新一次显示。参见BlynkWithoutDelay示例,了解如何在时间点执行操作o,我应该运行display_number函数4次,每次循环运行之间的延迟为10毫秒?您需要阅读显示部件的数据表,而不是在这里乞求数据表肯定会回答的问题。阅读公共阳极或公共阴极是如何工作的。你的最后一个数字之所以会出现,是因为在你的回路中,如果你切换了4次数字,那么你很快就切换了前3次,那么最后一个数字就会为你的延迟打开。您需要以大致相同的速率在数字之间循环。@TomServo,什么数据表?它只是一个移位寄存器和LED