I connected 2 digit 7-segment display to Arduino. In the end I observe on the screen 00, although in general the program works, the data in the methods come. Debugged using the serial port.
The main code is called in the timer
ISR(TIMER1_OVF_vect) // Timer1 interrupt service routine (ISR)
{
mySeg.isrHandler();
}
The file with the main code looks like this
#include "7segments.h"
Segments::Segments(int digitsCount, int segmentPins[], int digitPins[]) {
this->digitsCount = digitsCount;
this->segmentPins = segmentPins;
this->digitPins = digitPins;
init();
}
void Segments::init() {
#define SegA A2
#define SegB A3
#define SegC A4
#define SegD A5
#define SegE A6
#define SegF A7
#define SegG A8
// common pins of the four digits definitions
#define Dig1 A0
#define Dig2 A1
#define Dig3 A9
#define Dig4 A10
for(int i=0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT); // set segment and DP pins to output
}
for(int i=0; i < digitsCount; i++) {
pinMode(digitPins[i], OUTPUT);
}
displayOff(); // turn off the display
// Timer1 module overflow interrupt configuration
TCCR1A = 0;
TCCR1B = 1; // enable Timer1 with prescaler = 1 ( 16 ticks each 1 µs)
TCNT1 = 0; // set Timer1 preload value to 0 (reset)
TIMSK1 = 1; // enable Timer1 overflow interrupt
}
void Segments::isrHandler()
{
displayOff(); // turn off the display
int value = getCounter();
switch (current_digit)
{
case 1:
disp(value / 1000); // prepare to display digit 1 (most left)
if (is_common_cathod == 1) {
digitalWrite(Dig1, HIGH); // turn on digit 1
}
else {
digitalWrite(Dig1, LOW); // turn on digit 1
}
break;
case 2:
disp( (value / 100) % 10); // prepare to display digit 2
if (is_common_cathod == 1) {
digitalWrite(Dig2, HIGH); // turn on digit 2
}
else {
digitalWrite(Dig2, LOW); // turn on digit 2
}
break;
case 3:
disp( (value / 10) % 10); // prepare to display digit 3
if (is_common_cathod == 1) {
digitalWrite(Dig3, HIGH); // turn on digit 3
}
else {
digitalWrite(Dig3, LOW); // turn on digit 3
}
break;
case 4:
disp(value % 10); // prepare to display digit 4 (most right)
if (is_common_cathod == 1) {
digitalWrite(Dig4, HIGH); // turn on digit 4
}
else {
digitalWrite(Dig4, LOW); // turn on digit 4
}
}
current_digit = (current_digit % 4) + 1;
}
void Segments::displayOff()
{
digitalWrite(Dig1, LOW);
digitalWrite(Dig2, LOW);
digitalWrite(Dig3, LOW);
digitalWrite(Dig4, LOW);
}
int Segments::getCounter() {
if (millis() - this->lastRefreshTime >= REFRESH_INTERVAL) {
if (this->counter == LAST_COUNTER_VALUE) {
this->counterDirection = 0;
}
if (this->counter == 0) {
this->counterDirection = 1;
}
if (this->counterDirection == 1) {
this->counter++;
}
else {
this->counter--;
}
this->lastRefreshTime += REFRESH_INTERVAL;
}
return this->counter;
}
void Segments::disp(byte number)
{
switch (number)
{
case 0: // print 0
digitalWrite(SegA, HIGH);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, LOW);
break;
case 1: // print 1
digitalWrite(SegA, LOW);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
break;
case 2: // print 2
digitalWrite(SegA, HIGH);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, LOW);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, LOW);
digitalWrite(SegG, HIGH);
break;
case 3: // print 3
digitalWrite(SegA, HIGH);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, LOW);
digitalWrite(SegF, LOW);
digitalWrite(SegG, HIGH);
break;
case 4: // print 4
digitalWrite(SegA, LOW);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, HIGH);
break;
case 5: // print 5
digitalWrite(SegA, HIGH);
digitalWrite(SegB, LOW);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, LOW);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, HIGH);
break;
case 6: // print 6
digitalWrite(SegA, HIGH);
digitalWrite(SegB, LOW);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, HIGH);
break;
case 7: // print 7
digitalWrite(SegA, HIGH);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, LOW);
digitalWrite(SegE, LOW);
digitalWrite(SegF, LOW);
digitalWrite(SegG, LOW);
break;
case 8: // print 8
digitalWrite(SegA, HIGH);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, HIGH);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, HIGH);
break;
case 9: // print 9
digitalWrite(SegA, HIGH);
digitalWrite(SegB, HIGH);
digitalWrite(SegC, HIGH);
digitalWrite(SegD, HIGH);
digitalWrite(SegE, LOW);
digitalWrite(SegF, HIGH);
digitalWrite(SegG, HIGH);
}
}
Could you please advise me why the screen always shows 00, what did I miss when writing the program?