Выходы 74HC595
- Q0…Q7 – выходы которыми будем управлять. Могут находится в трёх состояниях: логическая единица, логический ноль и высокоимпедансное состояние
- Q7′ – выход предназначенный для последовательного соединения регистров.
Временная диаграмма на которой показано движение логической единицы по всем выходам регистра.
Как говориться лучше один раз увидеть, чем семь раз услышать. Я сам впервые применяя регистр 74HC595 не до конца понимал его работу и чтобы понять смоделировал нужную схему в Proteus.
Вот такая схема подключения семисегментных индикаторов к микроконтроллеру ATMega48 по SPI получилась:
Это схема с динамической индикацией, то есть в каждый момент времени загорается только одна цифра счетверенного семисегментного индикатора, потом загорается следующая и так по кругу. Но так как смена происходит очень быстро, то глазу кажется, что горят все цифры. Кроме того одновременно эта схема и опрашивает 4 кнопки S1-S4. Добавив два сдвоенных диода можно опрашивать 8 кнопок. А добавив 4 транзистора и резистора можно подключить дополнительный 4-х знаковый индикатор. Чтобы динамическая индикация заработала в регистры нужно послать два байта: первый байт определяет, какой из 4-х индикаторов будет работать и какую кнопку будем опрашивать. А второй, какие из сегментов загорятся.
12 thoughts on “ Сдвиговый регистр 74HC595 и семисегментный индикатор ”
По моему — это тот случай, когда объяснение простого может выглядеть сложным, а не наоборот. Что может быть проще, чем два бита переслать? В данном примере, биты, пересылаемые микроконтроллером в последовательном виде — преобразуются регистрами в параллельный. Один подает на матрицу, в роли которой выступает индикатор, данные, другой — адрес. Приведен один из примеров интерфейса периферии, обслуживаемой микроконтроллером. Я бы только добавил, что счетверенный семисегментныйт индикатор, чаще всего, используют в роли часов.
В приведенной схеме динамической индикации светодиоды семисегментного индикатора должны быть на напряжение не более 4 В. В больших индикаторах часто используется последовательное включение нескольких светодиодов: например в индикаторах высотой 5см — 4 светодиода.
Поэтому стоит сделать регистру 74HC595 высоковольтный выход: подключить по MosFET на каждый выход. Затвор на выход микросхемы, исток на землю, а к стоку — «высоковольтную» нагрузку.
А действительно, часто такие схемы обслуживают таблоиды и поболее 5 см. Там может и предложенные MosFET (КМОП, полевики с изолированным затвором) будут рентабельны — цена-то у них, как правило, кусючая. В большинстве-же случаев, достаточно будет DD1, как и DD2 подсоединить к токовым ключам, а не напрямую. Этого не сделано на приведенной схеме, так как на DD2 может падать нагрузка одновременно с семи сегментов, а на DD1 — только с одного. А экономичность схематического решения — далеко не последнее дело, в каждом, конкретном случае.
Datasheet 74HC595 и 74HCT595 от NXP.
Если не нужно каскадирование, регистр хранения и высокоимпедансное состояние на выходах то можно обойтись 74HC164N.
А зачем, если цена фактически одна? Купить сразу несколько сотен 74HC595 по 1,50 за штуку и ставить их везде и всюду, где нужны последовательно-параллельные регистры.
Мне в 74HC595 нравится именно возможность организации статической индикации, с одновременным переключением индикаторов. Так шумов меньше, чем у индикации динамической или у статической индикации без промежуточного (буферного) регистра. К тому же во втором случае имеется паразитная засветка индикатора при частой смене показаний.
А кто и как интересно опрашивает состояние кнопок на такой схеме, регистр же не контроллер он не понимает нажата кнопка или нет, его дело просто подать соответсвующие сигналы навыходных ножках, обратной же связи нет, или я чего-то не понимаю?
Тот микроконтроллер что дает сигнал на включение разрядов индикатора. Например логическим нулем зажигаем разряд который подключен к выводу Q0 микросхемы DD2 , тогда при нажатии кнопки S1 на 9-том контакте X1 разъема появляется логический ноль, этот сигнал и считывает микроконтроллер.
А кто и как будет считывать значения с кнопок?
В этом схеме нет алгоритм для считывание состояние кнопок. Для управление 7сег. индик. лучше включить после 595 микросхему 2003.
Применяйте микросхему TPIC6B595DWR, которая уже содержит полевики с открытым стоком на выходе.
Что такое 4-разрядный 7-сегментный индикатор hs420561k-32
Как можно увидеть на фото, 4-разрядный 7-сегментный индикатор идеально подходит для задуманного прибора. Один разряд будет отвечать за вывод минуса, при необходимости, второй и третий разряд оставим для вывода градусов, а четвертый будет просто для красоты, всегда выводить значок градусов.
В первую очередь нужно разобраться, как работает индикатор. У модуля 12 ног, 4 из них являются катодами, и каждый отвечает за один разряд из четырех – на какую ногу будет подан минус, тот разряд и будет активным. 8 других являются анодами и каждая отвечает за один из 7 сегментов и за точку внизу цифры. Таким образом, мы можем управлять каждым сегментом и разрядом. Единственная проблема кроется в том, что выводить можно одновременно только одну цифру на каждом разряде. Побороть это не сложно, достаточно просто за очень короткий промежуток времени по очереди выводить нужную информацию на каждый из разрядов. Человеческий глаз не сможет уловить переключение и будет казаться, что одновременно горят все разряды. Даже фотокамера не смогла это уловить – это видно по фотографии, которую я прикладывал выше.
Посмотреть какая нога индикатора за что отвечает, можно по картинке ниже.
Для удобства работы и чтобы закрепить знания из прошлой статьи про сдвиговый регистр я решил использовать в схеме микросхему 74HC595. Это снизит количество задействованных пинов ардуино. Ниже я привел схему подключений, она получилось кривая, надеюсь, со временем я научусь рисовать их качественней :). P.S. На схеме я не нарисовал 3 резистора — пропустил, их нужно добавить между пинами arduino и ножками hs420561k-32 с именами A, F и B.
Немного кодирования.
Простейший пример (годится для индикации и медленных устройств типа реле).
Последовательно выдаем каждый бит на порт контроллера куда подключен вход Data и дергаем туда-обратно порт, куда подключен вход Shift регистра.
void Out595Port(uint8_t data) { for (uint8_t i=0;i<8;i++) { // нога PB0 подключена к Shift, сбрасываем строб в 0 PORTB &= ~(1<<PB0); // нога PB1 подключена к Data, выводим туда старший бит из data (устанавливая или сбрасывая соотв. бит на PB1) (data & 0x80) ? PORTB |= (1<<PB1) PORTB &= ~(1<<PB1); // возвращаем строб в 1, заставляя регистр сдвинуться PORTB |= (1<<PB0); // сдвигаем выводимое значение на один бит data <<= 1; } // и так 8 раз }
Вообще такой код на редкость страшен (и кстати не проверен, т.к. я так не пишу), лучше ввести несколько #define:
#define bit_set(p,m) ((p) |= (m)) #define bit_clear(p,m) ((p) &= ~(m)) #define bit_write(c,p,m) (c ? bit_set(p,m) : bit_clear(p,m)) #define BIT(x) (0x01 << (x)) #define PortControl PORTB // #define PCshift PB0 // Shift clock #define PCdata PB1 // Data void Out595Port(uint8_t data) { for (uint8_t i=0;i<8;i++) { bit_clear(PortControl, BIT(PCshift)); bit_write(data & 0x80, PortControl, BIT(PCdata)); bit_set(PortControl, BIT(PCshift)); data <<= 1; } } // и где-то в инициализации не забудем переключить ноги порта на вывод DDRB = 1<<PCshift|1<<PCdata;
* Можно пойти дальше и сделать вложенные #define, что бы избавится от прямого PORTB , DDRB, PB…, но у меня пока нет настолько универсальных библиотек, что бы это стало критичным.
Example 2
In this example you’ll add a second shift register, doubling the number of output pins you have while still using the same number of pins from the Arduino.
The Circuit
1. Add a second shift register.
Starting from the previous example, you should put a second shift register on the board. It should have the same leads to power and ground.
2. Connect the 2 registers.
Two of these connections simply extend the same clock and latch signal from the Arduino to the second shift register (yellow and green wires). The blue wire is going from the serial out pin (pin 9) of the first shift register to the serial data input (pin 14) of the second register.
3. Add a second set of LEDs.
In this case I added green ones so when reading the code it is clear which byte is going to which set of LEDs
The Code
Here again are three code samples. If you are curious, you might want to try the samples from the first example with this circuit set up just to see what happens.
Code Sample 2.1 Dual Binary Counters
There is only one extra line of code compared to the first code sample from Example 1. It sends out a second byte. This forces the first shift register, the one directly attached to the Arduino, to pass the first byte sent through to the second register, lighting the green LEDs. The second byte will then show up on the red LEDs.
Code Sample 2.2 2 Byte One By One
Comparing this code to the similar code from Example 1 you see that a little bit more has had to change. The blinkAll() function has been changed to the blinkAll_2Bytes() function to reflect the fact that now there are 16 LEDs to control. Also, in version 1 the pulsings of the latchPin were situated inside the subfunctions lightShiftPinA and lightShiftPinB(). Here they need to be moved back into the main loop to accommodate needing to run each subfunction twice in a row, once for the green LEDs and once for the red ones.
Code Sample 2.3 — Dual Defined Arrays
Like sample 2.2, sample 2.3 also takes advantage of the new blinkAll_2bytes() function. 2.3’s big difference from sample 1.3 is only that instead of just a single variable called «data» and a single array called «dataArray» you have to have a dataRED, a dataGREEN, dataArrayRED, dataArrayGREEN defined up front. This means that line
becomes
and
becomes
Started by Carlyn Maw and Tom Igoe Nov, 06
Last revision 2018/04/02 by SM
Характеристики
- Модель: Семисегментный индикатор SegM8 AMP-B200-RU
- Источник света: светодиодные сегменты
- Количество сегментов: 7 + точка
- Цвет сегментов: красный
- Модель индикатора: SA40-19 / SM434001D
- Драйвер индикатора: 74HC595 с усилительным каскадом на каждом канале
- Аппаратный интерфейс: клеммники под винт
- Программный интерфейс: SPI
- Режимы яркости: штатный / экономный
-
Напряжение питания:
- Через силовой клеммник: 5–12 В (штатный режим)
- Через сигнальный клеммник: 3,3–5 В (экономный режим)
-
Потребляемый ток:
- В экономном режиме яркости: до 50 мА
- В штатном режиме яркости: до 300 мА
- Напряжение логических уровней: 3,3–5 В
- Размеры модуля: 122×90×26,3 мм
- Размеры экрана: 101,2×59,5 мм
- Масса: 260 г
Использование регистра 74164
Регистр сдвига |
Одной из наиболее простых и распространенных микросхем, реализующих функцию регистра сдвига, считается модель 74164 (555ИР8) и ее технологические варианты. Данная микросхема представляет собой 8-ми разрядный регистр с последовательной загрузкой и параллельным выходом. Используя 74164 можно сравнительно просто получить линейный индикатор из 8-ми светодиодов или односимвольный семисегментный индикатор. При необходимости, допускается последовательное соединение нескольких микросхем, что увеличит количество выходных линий, и подключенных к ним индикаторов.
Выходной ток каждой линии современных вариантов 74ACT164 и 74HCT164 составляет 25мА, что позволяет напрямую подключать маломощные одиночные светодиоды или семисегментные индикаторы. Время цикла этих микросхем может находиться на уровне 15нС, что соответствует возможности работы на частоте 66МГц. Учитывая, что подобная или более высокая частота работы процессоров встречается редко, для формирования тактовых импульсов достаточно просто включить и выключить выход контроллера, без какой-либо задержки.Для загрузки данного регистра сдвига достаточно двух линий: DATA и CLK. Это позволяет задействовать только две линии микроконтроллера, для управления устройством индикации
При этом во многих случаях может оказаться не важно, сколько микросхем будет соединено последовательно, и соответственно сколькими индикаторами управляет контроллер
Подключение индикатора |
Вариантов использования 74164 существует множество. Можно выделить несколько из них. Первый, вышеназванный индикатор на основе нескольких светодиодов. Второй – одиночный семисегментный индикатор или линейка из них. Пример линейки индикаторов показан в статье – Термометр на микроконтроллере PIC12F629.
Программирование индикации с использование регистра сдвига также не отличается высокой сложностью. Особенно если в микроконтроллере реализована такая операция, как сдвиг байта через бит переноса. Проверкой данного бита можно определить уровень, который требуется установить на линии данных. Циклически повторяя такой сдвиг и формируя тактовые импульсы можно полностью загрузить регистр сдвига.Следующим вариантом использования может стать схема динамической индикации, когда для снижения количества используемых линий микропроцессора, параллельный вывод на отдельные сегменты, заменяется на последовательный, с использованием последовательно-параллельного преобразователя. Этот же преобразователь может использоваться в схеме включения ЖК-индикатора на базе HD44780.
Подключение HD44780 с использованием регистра | Каскадное включение регистров | Использование ULN2803 совместно с регистром |
Программная часть:
Основой управления сдвиговым регистром в Arduino является команда shiftOut(), которая выводит на заданный пин байт информации побитно. Использует 2 пина: Пин данных – dataPin и тактовый пин синхронизации clockPin. Для того, чтобы сдвиговый регистр принял данные, на его вывод STcp (Latch) на время передачи должен быть подан сигнал «0».Синтаксис команды ShiftOut() следующий:shiftOut(dataPin, clockPin, bitOrder, value), где:dataPin, clockPin – выводы Arduino, к которым подключены 14(data) и 11(latch) выводы сдвигового регистра 74HC595. Как видно из таблицы, которая была приведена ранее, это 9 и 10 выводы Arduino.bitOtder – может принимать 2 значения и указывает направление вывода бит: слева (MSBFIRST) или справа (LSBFIRST).value – однобайтовое число (0-255) которое нужно вывести на индикатор побитно.Например, нужно вывести на дисплей цифру 3. Для этого сегменты a,b,c,d,g – нужно засветить (подать на них «1»), а сегменты f, e -погасить (подать на них «0»). Схематически это выглядит так :
Другими словами, в сдвиговый регистр нужно записать число 0b11110010 (0b обозначает, что число в двоичной системе исчисления). Делается это так:digitalWrite(8, LOW); // Устанавливаем Latch в «0»shiftOut(9, 10, LSBFIRST, 0b11110010); // Записываем побитно число 11110010 в двоичной системеdigitalWrite(8, HIGH); // Устанавливаем Latch в «1»Все! На дисплее должна засветиться цифра 3. Если нужно засветить единицу в первом разряде (он подключен вместо точки «DP») – тогда к коду цифры нужно добавить 1:0b11110010 + 1 = 0b111100110b11110010 – это «3»0b11110011 – это «13»И напоследок в качестве примера привожу тестовый скетч, который высвечивает на дисплее числа от 0 до 19 с задержкой в 1 секунду:
int latchPin = 8; //STcp int clockPin = 10; // SHcp int dataPin = 9; //Ds // Массив в котором указано, какие сегменты должны зажигаться // например, в "0" должны светиться сегменты abcdef (0b11111100) int num = { b11111100, //цифра 0 b01100000, //цифра 1 b11011010, //цифра 2 b11110010, //цифра 3 b01100110, //цифра 4 b10110110, //цифра 5 b10111110, //цифра 6 b11100000, //цифра 7 b11111110, //цифра 8 b11110110, //цифра 9 b00001101, //знак || }; void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { for (int i=; i<=19; i++){ digitalWrite(latchPin, LOW); // установка синхронизации "защелки" на LOW if (i<10) shiftOut(dataPin, clockPin, LSBFIRST, num); // передаем последовательно на вход данных else shiftOut(dataPin, clockPin, LSBFIRST, num+1); digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, устанавливаем значения на выходах delay(1000);} }
Скачать его можно здесь.
Концепция и внешний вид[править | править код]
Таблица, отображающая все 128 вариантов состояния сегментов
Обозначение сегментов индикатора
Семисегментный индикатор, как говорит его название, состоит из семи элементов индикации (сегментов), включающихся и выключающихся по отдельности. Включая их в разных комбинациях, из них можно составить упрощённые изображения арабских цифр.
Цифры 6, 7 и 9 имеют по два разных представления на семисегментном индикаторе. В ранних калькуляторах Casio и Электроника цифра 0 отображалась в нижней половине индикатора.
Сегменты обозначаются буквами от A до G; восьмой сегмент — десятичная точка (decimal point, DP), предназначенная для отображения дробных чисел.
Изредка на семисегментном индикаторе отображают буквы.
ШИМ
Как же использовать ШИМ, ведь мы же часто управляем при помощи регистра светодиодами, а выходы регистра могут иметь только 3 состояния — логический ноль LOW, логическая единица HIGH и высокоимпедансное состояние (пин не имеет физического контакта с электрической цепью). И действительно ШИМ сдвиговым регистром не поддерживается, но есть одна небольшая хитрость — мы можем использовать выход регистра OE (Output Enable input) — он отвечает за переключение из высокомного состояния в ноль. Выход OE — можно назвать логическим нолем для всех выходов. Таким образом, если мы подключим этот пин к ШИМ-выходу Arduino, то сможем таким образом смещать логический ноль, тем самым имитировать ШИМ на светодиодах.
Читайте на сайте Codius
Минус данного подхода заключается в том, что в этом случае регулируется яркость всех светодиодов, подключённых к одному сдвиговому регистру. А что же делать, если нам нужно показать разную яркость светодиодов, подключённых к одному сдвиговому регистру. Здесь снова нужно будет пойти на хитрость — создать карту яркостей светодиодов, и зажигать каждую группу со своей яркостью по очереди, так быстро, чтобы создавалось ощущение постоянного свечения:
Но если вы начнёте экспериментировать с задержками и большим количеством карт яркости, то столкнётесь с очень неприятным эффектом мерцания — это связно с большим временем исполнения стандартных для языка Arduino функций-обёрток типа digitalWrite, digitalRead, analogWrite, analogRead и т.д.
Другие регистры, например, STP16C596 могут управлять 16 светодиодами одновременно без использования дополнительных резисторов.
74HC595
Самым популярным является восьмиразрядный (8 управляемых выходов) сдвиговый регистр 74HC595 (отечественный аналог КР1564ИР52), который можно встретить в стартовых наборах или купить отдельно.
Схема
- Выводы Q0 — Q7 (15 и 1..7)
- GND (8) — земля
- Q7′ (9) — выход регистра, который необходимо соединить с Q0 следующего регистра для создания цепочки
- MR (10) — сброс значений регистра. Сброс происходит при получении LOW
- SH_CP (SRCLK) (11) — линия синхроимпульса для передачи данных из DS во внутренние ячейки (вход для тактовых импульсов). SH — shift, CP — clock pin
- ST_CP (RCLK) (12) — линия синхроимпульса для передачи данных из внутренних ячеек, во внешние (синхронизация выходов). ST — storage, CP — clock pin
- OE (13) — инверсный, разрешение на вывод данных с внешних ячеек (вход для переключения состояния выходов из высокоомного в рабочее)
- DS (SER) (14) — линия последовательных данных (Data Serial)
- VCC (16) — питание, 5В
74HC595 — восьмиразрядный сдвиговый регистр с последовательным вводом, последовательным или параллельным выводом информации, с триггером-защёлкой и тремя состояниями на выходе. Другими словами этот регистр позволяет контролировать 8 выходов, используя всего несколько выходов на самом контроллере. При этом несколько таких регистров можно объединять последовательно для каскадирования.
74HC595 может отдавать сигналы не только параллельно, но и последовательно. Это необходимо при объединении нескольких регистров, для получения 16 и более выходов. В этом случае первые 8 бит сигнала передаются на следующий регистр для параллельного вывода на нём.
Соберём схему, для которой понадобится сдвиговый регистр и восемь светодиодов с резисторами
При этом обратите внимание, что в нашем распоряжении восемь выводов регистра для светодиодов, а на плате используем только три цифровых вывода (экономия пяти выводов)
Установите сдвиговый регистр в центре макетной платы, чтобы ножки разделяла центральная разделительная дорожка.
Подключим контакты 16 (VCC) и 10 (MR) к выводу 5V на Arduino.
Соединяем контакты 8 (GND) и 13 (OE) с выводом GND на Arduino.
Соединяем три контакта, которыми мы будем управлять сдвиговым регистром:
- Вывод 11 (SH_CP, SRCLK) на вывод 11 на Arduino (синхронизация)
- Вывод 12 (ST_CP, RCLK) на вывод 12 на Arduino (защёлка)
- Вывод 14 (DS, SER) на вывод 9 на Arduino (данные)
Далее подключаем все восемь светодиодов с резисторами
Обратите внимание, что у регистра с одной стороны идут семь выводов подряд, а восьмой находится на выводе 15
Вариант подключения (используются другие выводы платы).
Включаем один светодиод
Попробуем включить один светодиод. Сначала указываем используемые выводы платы (тактовая линия — clockPin, данные — dataPin, защёлка — latchPin).
В setup() устанавливаем для них режим OUTPUT и ставим защёлке высокий уровень, чтобы регистр не принимал сигналов.
В loop() попробуем что-нибудь отправить на регистр. Сначала ставим LOW на защёлку (начинаем передачу данных. Теперь регистр принимает сигналы с Arduino). Далее отправляем данные в двоичном виде. Например, отправим байт 0b10000000 (должен будет загореться первый светодиод). В конце выставляем HIGH на защёлку (заканчиваем передавать данные).
Если в shiftOut() поменять LSBFIRST на MSBFIRST, то включится не первый, а последний светодиод в цепочке схемы.
При работе с несколькими светодиодами не очень удобно постоянно писать три строчки кода для каждого светодиода в отдельности. Поэтому оформим код в виде функции и будем мигать третьим светодиодом.
Устройство
В настоящее время для отображения информации всё чаще используются графические дисплеи, однако, семисегментные индикаторы также не утратили своего значения. Если требуется лишь отображение чисел, то они могут стать более предпочтительным вариантом, т.к. просты в управлении и могут использоваться совместно с любым микроконтроллером с достаточным количеством выводов. Жидкокристаллические семисегментные индикаторы обладают сверхнизким энергопотреблением (например, в электронных часах, вместе со схемой управления работают от одной батарейки в течении нескольких лет).
Рассмотрим пример разработки схемы дешифратора из двоичного кода в десятичный. Десятичный код обычно отображается одним битом на одну десятичную цифру. В десятичном коде десять цифр, поэтому для отображения одного десятичного разряда требуется десять выходов дешифратора. Сигнал с этих выводов можно подать на десятичный индикатор. В простейшем случае над светодиодом можно просто подписать индицируемую цифру.Таблица истинности десятичного дешифратора приведена ниже.
На этой странице будем вести речь о светодиодных семисегментных индикаторах. Они имеют предельно простую конструкцию, дёшевы, надёжны. Обеспечивают высокую яркость и контрастность отображаемой информации. Существует большое разнообразие индикаторов: с разным цветом свечения сегментов, разного размера, отличающиеся схемой подключения светодиодов (с общим катодом или общим анодом). При необходимости отображения нескольких разрядов можно установить несколько одноразрядных индикаторов рядом на печатной плате либо выбрать нужный вариант многоразрядного индикатора.
Своё название семисегментные индикаторы получили в связи с тем, что изображение символа формируется с помощью семи отдельно управляемых (подсвечиваемых светодиодом) элементов – сегментов. Эти элементы позволяют отобразить любую цифру 0..9, а также некоторые другие символы, например: ‘-‘, ‘A’, ‘b’, ‘C’, ‘d’, ‘E’, ‘F’ и другие.
Это даёт возможность использовать индикатор для вывода положительных и отрицательных десятичных и шестнадцатеричных чисел и даже текстовых сообщений. Обычно индикатор имеет также восьмой элемент – точку, используемую при отображении чисел с десятичной точкой. Сегменты индикатора обозначают буквами a, b, …, g (a – верхний элемент, далее буквы присваиваются сегментам по часовой стрелке; g – центральный сегмент; dp – точка). 8 независимых элементов, каждый из которых может находиться в одном из двух состояний – горит или не горит, дают всего 2**8=256 возможных комбинаций. Или 128 комбинаций, каждая из которых может быть с горящей точкой или без неё.
Семисегментный индикатор из четырех элементов
Вывод символов на индикатор (динамическая индикация)
Чтобы осуществить динамическую индикацию нужно дополнительно задействовать выводы для включения/выключения целых разрядов, то есть управлять подачей питания на общий провод (общий К/A).
В моем случае в середине каждого сегмента индикатора целых два СД (красный и зеленый), поэтому настроено на выход аж 4 вывода (2 для красн., 2 для зелен.).
В общем настраиваем выводы как двухтактный выход с подтяжкой к минусу.
SPI в режиме передачи от ведущего к ведомому (SPI1 -> Transmit Only Master).
Отладка через SWD (SYS -> Debug Serial Wire).
Тактирование одного из таймеров (TIM17 -> Activated).
Настраиваем таймер на частоту f > 40 Гц и включаем прерывание от него.
Связь между передаваемыми данными и выводимыми символами:
Для удобства создается массив с числами, при выводе которых будет отображение символов 0-9. Индикатор с общий анодом, то бишь придется инвертировать все значения, либо вызывать число из массива с инвертированием (знак ~ перед числом).
main.c
stm43f0xx_it.c
Непосредственно обновление происходит в обработчике прерывания от таймера:
Ну и в главном цикле:
В итоге:
Проект Keil и STM32CubeMX (бегущие огни): 74hc595_stm32_spi1.zip
Проект Keil и STM32CubeMX (динамическая индикация): 74hc595_stm32_led_indicator.zip