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