#define dataPin 4 /* DS pin 14 74HC595 данные*/
#define clockPin 5 /* SHCP pin 11 74HC595 тактовая частота*/
#define latchPin 6 /* STCP pin 12 74HC595 защелка*/
#define units_DIG4 8 // Единицы берём с пина 8
#define ten_DIG3 9 // Десятки берём с пина 9
#define hundred_DIG2 10 // Сотни берём с пина 10
#define thousand_DIG1 11 // Тысячи берём с пина 11
int my_Period = 0; // Период задержки
byte razryad[] = { thousand_DIG1, hundred_DIG2, ten_DIG3, units_DIG4 }; // Включение начинает бегать с младшего разряда.
byte segmCode[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x80 }; // Коды для отображения чисел от 0 до 9.
int digital = 7235; // Пусть для тренировки будет выведено это число на индикаторы
/*
символ bin hex
0 00111111 3F
1 00000110 06
2 01011011 5B
3 01001111 4F
4 01100110 66
5 01101101 6D
6 01111101 7D
7 00000111 07
8 01111111 7F
9 01101111 6F
dp 10000000 80
*/
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(units_DIG4, OUTPUT);
pinMode(ten_DIG3, OUTPUT);
pinMode(hundred_DIG2, OUTPUT);
pinMode(thousand_DIG1, OUTPUT);
digitalWrite(11, HIGH);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 0b00111111); // Старший бит первый идёт в сдвиговый регистр.
digitalWrite(latchPin, HIGH);
/*
// Проверка светодиодов:
static byte j = 0;
while (j < 4) {
digitalWrite(razryad[j], HIGH);
for (byte i = 0; i < 11; i++) {
digitalWrite(latchPin, LOW); // Подготавливаем latchPin к работе shiftOut, т.к.
// shiftOut сама делает 8 импульсов с LOW на HIGH, проталкивая за 1 команду 1 байт.
shiftOut(dataPin, clockPin, MSBFIRST, segmCode[i]); // Старший бит первый идёт в сдвиговый регистр.
digitalWrite(latchPin, HIGH);
my_Period = 1000;
my_timeOut(my_Period);
}
digitalWrite(razryad[j], LOW);
delay(5);
j++;
}*/
}
//Программа работает неверно.Надо разбираться!
// Здесь написана смесь для управления разрядами через сдвиговый регистр и через транзисторы
void loop() {
//digS_v();
}
/*
// Функция вывода изображения на индикаторы
void digS_v() {
static uint32_t timer;
static byte r = 0b00000001; // Порядковый номер разряда, с которого начинается цикл включения разрядов
static byte s; // Номер активной цифры
byte d; // Цифра в активном разряде
static byte j = 0;
if (timer > millis()) return; // если не прошло 5 мс, ничего не делаем
if (j < 4) { // // Для транзисторов
// Раскладываем число на составляющие.
switch (s) {
case 0:
d = digital / 1000; // Выделяем тысячи, т.е. 7235 / 1000 = 7, т.к. 0.235 отбрасывается.
break;
case 1:
d = (digital / 100) % 10; // Выделяем сотни. 7235 / 100 = 72 % 10 = 2
break;
case 2:
d = (digital / 10) % 10; // Выделяем десятки. 7235 / 10 = 723 % 10 = 3
break;
case 3:
d = digital % 10; // Выделяем единицы. 7235 % 10 = 5
break;
}
out_595_shift(segmCode[d], r);
r = r == 0b00001000 ? 0b00000001 : r << 1; // Сдвигаем активный разряд, т.е. зацикливаем бегающую 1 по 4 разрядам
s = s == 3 ? 0 : s + 1; // Сдвигаем номер активной цифры
timer = millis() + 5;
j++; // // Для транзисторов
}
}*/
/* Функция записи разрядов и сегментов в 74HC595
void out_595_shift(byte x1, byte x2) {
byte j = 0; // // Для транзисторов
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, x1); // Данные сегментов отправляем старшим битом вперёд
//shiftOut(dataPin, clockPin, MSBFIRST, x2); // Данные разрядов отправляем старшим битом вперёд
digitalWrite(razryad[j], HIGH); // Для транзисторов
digitalWrite(razryad[j - 1], LOW); // Для транзисторов
digitalWrite(latchPin, HIGH);
}*/
/*
// Функция задержки при тесте индикаторов в setup
void my_timeOut(int my_Period) {
// Задержка на период времени my_Period перед каждым выводом следующей индикации (аналог delay()):
uint32_t now = millis(); // now - переменная для хранения момента времени.
while (millis() - now <= my_Period) {};
}*/