Untitled

 avatar
user_6406267
c_cpp
4 months ago
2.4 kB
6
Indexable
//Q7-A, Q6-B,...Q0-HЛістинг програми SHIFT
//SC and RC - D7, SER-D6, SHIFT-VCC, OE-GND, Button-A0
#define button A0 // shift register pin definitions
#define latchPin 8
#define clockPin 7 // clock pin
#define dataPin 6 // data pin
// common pins of the four digits definitions
#define D1 5
#define D2 4
#define D3 3
#define D4 2

const int digitPins[] = {D1, D2, D3, D4};

const byte digitSegmentsByte[] = {
  //  ABCDEFG Segments
    0b11111100, // 0
    0b01100000, // 1
    0b11011010, // 2
    0b11110010, // 3
    0b01100110, // 4
    0b10110110, // 5
    0b10111110, // 6
    0b11100000, // 7
    0b11111110, // 8
    0b11110110  // 9
};

byte current_digit;
int count = 9987;
byte digits[4] = {9, 9, 8, 7};

void setup() {
  Serial.begin(9600); // Ініціалізація послідовного порту
  
  // Ініціалізація пінів для розрядів
  pinMode(D1, OUTPUT);
  pinMode(D2, OUTPUT);
  pinMode(D3, OUTPUT);
  pinMode(D4, OUTPUT);
  
  pinMode(button, INPUT_PULLUP);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  
  disp_off();
  current_digit = 0;

cli();//stop interrupts

  TCCR1A = 0;
  TCCR1B = (1 << CS11) | (1 << CS10); // Prescaler 16
  TCNT1 = 0; // set Timer1 preload value to 0 (reset) 
  TIMSK1 = 1; // enable Timer1 overflow interrupt
  

sei();//allow interrupts
}

void loop() {
  if(digitalRead(button) == 0) {
    delay(50);
    count++; // increment 'count' by 1
    Serial.println(count);
    splitNumberToDigits(count);
    if(count > 9999)
      count = 0;    
    delay(200); // wait 200 milliseconds
  }
}

void disp_off(){
  for(int i = 0; i < 4; i++) {
    digitalWrite(digitPins[i], LOW);
  }
}

ISR(TIMER1_OVF_vect) {
  disp(digits[current_digit]);
  digitalWrite(digitPins[current_digit], LOW);
  digitalWrite(digitPins[current_digit], HIGH);

  current_digit = (current_digit % 3) + 1;
}

void splitNumberToDigits(int number) {
    number = abs(number);

    for (int i = 0; i < 4; i++) {
        digits[i] = 0;
    }

    int index = 3;
    while (number > 0 && index >= 0) {
        digits[index--] = number % 10;
        number /= 10;
    }
}

void disp(byte number) {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, digitSegmentsByte[number]);
  digitalWrite(latchPin, HIGH);  // Оновлюємо дані на дисплеї
}
Editor is loading...
Leave a Comment