Все микроконтроллеры имеют определенное количество линий ввода/вывода, но в некоторых приложениях, например, для подключения 7-сегментного дисплея, нам потребуется большое количество выводов GPIO, чем может предложить наш контроллер. Для таких случаев, когда требуется несколько выходных контактов, но микроконтроллер имеет ограниченное количество выходных контактов, Регистр сдвига 74HC595 был бы идеальным решением в данном случае. 74HC595 – это сдвиговый регистр, который принимает последовательные данные в качестве входных данных и обеспечивает параллельный вывод. Помимо выводов питания, для работы схемы требуется только 3 контакта, которые должны управлять несколькими регистрами сдвига.
Следовательно, можно использовать три выходных линии микроконтроллера и каскадировать два или более сдвиговых регистра, чтобы получить 16 или более 24 выходных линий. В этом проекте ESP32 с 74HC595 мы подключим три микросхемы 74HC595, используя только три контакта, и подключим три 7-сегментных дисплея, используя только три контакта ESP32. Кроме того, мы будем использовать IDE Arduino для программирования нашего ESP32.
Принципиальная схема подключения ESP32 к сдвиговым регистрам 74HC595 и 7-сегментным дисплеям приведена далее.
74HC595 представляет собой 8-битный сдвиговый регистр. Схема выводов показана на следующем изображении.
Линии от QA до QH от начального контакта 1 до 7 и контакта 15 являются 8-битными выходами регистра сдвига. Входной линией является контакт 14, который работает как контакт ввода данных, который принимает данные последовательно. Другие входные контакты – это 11 и12. Эти два контакта – SCK и RCK. SCK – это вход тактовой частоты, а RCK – вход триггерной защелки. Взятая из документации таблица истинности, необходимая для получения данных и передачи данных в следующий регистр сдвига, приведена далее.
Здесь также контакт 9 является линией последовательного выхода данных, которая будет передавать данные в следующий каскадный сдвиговый регистр. Таким образом, контакт 9 связан с контактом 14 следующего регистра сдвига. Данные последовательно передаются в следующий регистр сдвига
Программа для управления всеми тремя 7-сегментными индикаторами приведена далее.
// установить тип 7-сегментного индикатора (общий катод или анод)
const bool commonCathode = true; // в данном случае общий катод, в противном случае будет false.
// буквенно-цифровой шаблон для 7-сегментного дисплея
const byte digit_pattern[17] =
{
// Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
// a b c d e f g DP
0b11111100, // 0
0b01100000, // 1
0b11011010, // 2
0b11110010, // 3
0b01100110, // 4
0b10110110, // 5
0b10111110, // 6
0b11100000, // 7
0b11111110, // 8
0b11110110, // 9
0b11101110, // A
0b00111110, // b
0b00011010, // C
0b01111010, // d
0b10011110, // E
0b10001110, // F
0b00000001 // .
};
//Контакт подключен к ST_CP 74HC595
int latchPin = 4;
//Контакт подключен к SH_CP 74HC595
int clkPin = 12;
//Контакт подключен к DS 74HC595
int dtPin = 14;
// отображаемое значение
int dispVal = 0;
bool increment = true;
void setup() {
Serial.begin(115200);
delay(1000);
// установите управляющий вывод 74HC595 в качестве выходного
pinMode(latchPin, OUTPUT);
pinMode(clkPin, OUTPUT);
pinMode(dtPin, OUTPUT);
}
void loop() {
int dispDigit1=dispVal/10;
int dispDigit2=dispVal%10;
if(increment==true){
printf("%d%d.\n", dispDigit1,dispDigit2);
digitalWrite(latchPin, LOW);
if(commonCathode == true){
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]);
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);
}else{
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16]));
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));
}
digitalWrite(latchPin, HIGH);
dispVal += 1;
if (dispVal == 99){
increment=false;
}
}else{
printf("%d%d.\n", dispDigit1,dispDigit2);
digitalWrite(latchPin, LOW);
if(commonCathode == true){
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit2]|digit_pattern[16]);
shiftOut(dtPin, clkPin, LSBFIRST, digit_pattern[dispDigit1]);
}else{
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit2]|digit_pattern[16]));
shiftOut(dtPin, clkPin, LSBFIRST, ~(digit_pattern[dispDigit1]));
}
digitalWrite(latchPin, HIGH);
dispVal -= 1;
if (dispVal == 0){
increment=true;
}
}
delay(250);
}
Соберите схему и загрузите код в ESP32. Цифры отлично отображаются на 7-сегментных дисплеях, как вы можете видеть на следующем изображении.
© digitrode.ru