Нужна помощь с выводом значений на цифровой дисплей 74hc595

alex196
Offline
Зарегистрирован: 18.03.2018

Здравствуйте, Подскажите, пожалуйста, как сделать вывод информации на 4х цифровой дисплей 74hc595. P.S И еше если не трудно можете помочь дописать кнопку для изменения значений по типу 10,100.

#include<Four7Seg74hc595.h>

#define SCLK 12  // пины ардуины
#define RCLK 11    
#define DIO 10  

int ssr = 5; //ssr pin
enum PinAssignments {
  encoderPinA = 2,   // right 
  encoderPinB = 3,   // left 
  fireButton = 4    // switch 
};
volatile  int encoderPos = 40; 
int lastReportedPos = 1;
static boolean rotating=false;
boolean A_set = false;              
boolean B_set = false;

byte digitBuffer[4];

void showDisplay(){ 
  const byte digit[10] = {0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010,0b10000010,0b11111000,0b10000000, 0b10010000};
  const byte chr[4] = {0b00001000,0b00000100,0b00000010,0b00000001};
  for(byte i = 0; i <= 3; i++){digitalWrite(RCLK, LOW);shiftOut(DIO, SCLK, MSBFIRST, digit[digitBuffer[i]]);shiftOut(DIO, SCLK, MSBFIRST, chr[i]);digitalWrite(RCLK, HIGH);delay(1);}  
}
void setup() {
  Serial.begin(9600);
  pinMode(RCLK, OUTPUT);
  pinMode(SCLK, OUTPUT);
  pinMode(DIO, OUTPUT);  
  
  pinMode(encoderPinA, INPUT_PULLUP); 
  pinMode(encoderPinB, INPUT_PULLUP); 
  pinMode(fireButton, INPUT_PULLUP);
  pinMode(ssr, OUTPUT);

  attachInterrupt(0, doEncoderA, CHANGE);
  attachInterrupt(1, doEncoderB, CHANGE);
  }
void fire() {
  digitalWrite(ssr, HIGH);
  delay (encoderPos);
  digitalWrite(ssr, LOW);
}
void loop() { 
  digitBuffer[0] = 1; 
  digitBuffer[1] = 2;
  digitBuffer[2] = 3;
  digitBuffer[3] = 4;
  showDisplay(); 
  
  rotating = true;
  if (encoderPos <= 10 ){
    encoderPos = 10;
    lastReportedPos = 10;
  }
    if (encoderPos >= 2001 ){
    encoderPos = 2001;
    lastReportedPos = 2001;
  }
  else
  {if (lastReportedPos != encoderPos) {
    Serial.print("Index:");
    Serial.println(encoderPos, DEC);
    lastReportedPos = encoderPos;
  }}
  if (digitalRead(fireButton) == LOW )  {
     Serial.print("Fire");
     Serial.println(DEC);
     fire();
     delay(1000);
  }
}


void doEncoderA(){
  if ( rotating ) delay (1);
  if( digitalRead(encoderPinA) != A_set ) {
    A_set = !A_set;
    if ( A_set && !B_set ) 
      encoderPos += 1;
    rotating = false;
  }
}

void doEncoderB(){
  if ( rotating ) delay (1);
  if( digitalRead(encoderPinB) != B_set ) {
    B_set = !B_set;
    if( B_set && !A_set ) 
      encoderPos -= 1;
    rotating = false;
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А схема подключения?

И кстати, что за дисплей такой 74hc595? Не думаю, что такой существует в природе. Если же это семисегментные индикаторы, включённые через сдвиговые регистры, то без схемы ничего сказать нельзя, мы ведь даже не знаем что у Ваших индикаторов общее.

Так что, давайте схему.

alex196
Offline
Зарегистрирован: 18.03.2018

пин 5 - реле / пин  4 - кнопка которая подает питание на реле / пин 3 - значение - / пин 2 - значение +

дисплей как ты и говоришь на сдвиговых регистрах подключение  #define SCLK 12 / #define RCLK 11 / #define DIO 10