Нужна помощь с выводом значений на цифровой дисплей 74hc595
- Войдите на сайт для отправки комментариев
Вс, 18/03/2018 - 23:54
Здравствуйте, Подскажите, пожалуйста, как сделать вывод информации на 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;
}
}
А схема подключения?
И кстати, что за дисплей такой 74hc595? Не думаю, что такой существует в природе. Если же это семисегментные индикаторы, включённые через сдвиговые регистры, то без схемы ничего сказать нельзя, мы ведь даже не знаем что у Ваших индикаторов общее.
Так что, давайте схему.
пин 5 - реле / пин 4 - кнопка которая подает питание на реле / пин 3 - значение - / пин 2 - значение +
дисплей как ты и говоришь на сдвиговых регистрах подключение
#define SCLK 12 /#define RCLK 11 /#define DIO 10