SM1628C Помогите разобраться с библиотекой

Ну, это понятно!

Я же Вас просил исследовать по ОДНОМУ биту, а 0x0300 - это ДВА бита. Я даже скажу какие именно загораются - от 0x0100 и от 0x0200 - правильно? Потому, что вместе они и дают 0x0300. То же про 0x0600 - это ДВА бита.

Я Вас просил исследовать только 8 1-битных вариантов:

0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800

Пожалуйста, исследуйте эти (только эти) все и убедитесь, что Ваша таблица правильная (или приведите новую).

Таблица правильная

ledGRId[0]
0x0020 play доп. сег. 
0x0040 = сег "a" разр 4 
0x0080 = сег "a" разр 3 
0x0100 = сег "a" разр 2 
0x0200 = сег "a" разр 1 

ledGRId[1]
0x0020 rec 
0x0040 = сег "b" разр 4 
0x0080 = сег "b" разр 3 
0x0100 = сег "b" разр 2 
0x0200 = сег "b" разр 1 

ledGRId[2]
0x0020 usb 
0x0040 =сег "c" разр 4 
0x0080 =сег "c" разр 3 
0x0100 =сег "c" разр 2 
0x0200 =сег "c" разр 1 

ledGRId[3]
0x0020 disc   
0x0040 =сег "d" разр 4 
0x0080 =сег "d" разр 3 
0x0100 =сег "d" разр 2 
0x0200 =сег "d" разр 1 

ledGRId[4]
0x0020 dP 
0x0040 =сег "e" разр 4 
0x0080 =сег "e" разр 3 
0x0100 =сег "e" разр 2 
0x0200 =сег "e" разр 1 

ledGRId[5]
0x0020 hdd 
0x0040 =сег "f" разр 4 
0x0080 =сег "f" разр 3 
0x0100 =сег "f" разр 2 
0x0200 =сег "f" разр 1 

ledGRId[6]
0x0020 lan  
0x0040 =сег "g" разр 4 
0x0080 =сег "g" разр 3 
0x0100 =сег "g" разр 2 
0x0200 =сег "g" разр 1 

При этих значениях загорается по одному сегменте.

А при других - ничего не загорается, так?
И последний вопрос - это все сегменты? Нет таких, которые бы никогда не загорались?

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

нет, при этих значениях загорается все.
Помощь нужна, это мой первый проект, и не могу понять куда это все вставлять?

#define	SEG_A	0x00	// цифры с 1 по 4
#define	SEG_B	0x00	// цифры с 1 по 4
#define	SEG_C	0x00	// цифры с 1 по 4
#define	SEG_D	0x00	// цифры с 1 по 4
#define	SEG_E	0x00	// цифры с 1 по 4
#define	SEG_F	0x00	// цифры с 1 по 4
#define	SEG_G	0x00	// цифры с 1 по 4

#define	SEG_H	0x000 // Дополнительный символ (	// цифры с 1 по 4)
#define	SEG_ENVELOP	SEG_H // только 1-ая цифра
#define	SEG_ANTENNA	SEG_H // только 2-ая цифра
#define	SEG_POWER	SEG_H // только 3-я цифра
#define	SEG_MUSIC	SEG_H // только 4-ая цифра

вот сюда?

Нет, библиотеку придётся переписывать существенно.

У меня (в 1668) всё устроено так: каждый элемент массива ledGRID соответствует одному разряду, а биты в нём отвечают за сегменты.

Здесь же у Вас, как Вы только что убедились, каждый элемент массива ledGRID соответствует одному сегменту, а биты отвечают за разряды.

Т.е. формирование знаков придётся переписать, А вот транспорт (передача данных драйверу) похоже такие же - это надо оставить.

В принципе, это не сложно. Вы сможете сами переписать? Или никак? Вы, кстати, вообще, понимаете как там символы формируются? Вот, для пример, можете сейчас безо всякой универсальности, просто в лоб вывести туда слово “ПОПА”?

Подставляя вот сюда значения

static uint16_t ledGRID[LED_DATA_LENGTH / 2] =  {// текущее состояние экрана
	ALL_LEDS,
	ALL_LEDS,
	ALL_LEDS,
	ALL_LEDS,
	ALL_LEDS,
	ALL_LEDS,
	ALL_LEDS
};

Выводил. Грубо говоря при тесте загоралось это слово, но дальше никак. Мне бы узнать где это переписывать. Я просто это дисплей для усилителя приспосабливаю чтобы видеть уровень громкости , и с arduino столкнулся впервые можно сказать. Для меня печатку сделать это просто, а код очень тяжело. Я пытался этот код переделать уже недели две.

Посмотрю на код и даже не представляю где надо переписать и на что переписать. Если правильно понимаю то менять надо в этой функции
void updateDisplay(void) { writeSingleCommand(0x40); // запись данных, автоматический адрес 0x40 digitalWrite(PIN_STB, LOW); shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0xC0); // Установка адреса в 0 uint8_t * p= (uint8_t *) ledGRID; for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p); // запись данных digitalWrite(PIN_STB, HIGH); delayMicroseconds(1); // Пауза до следующей команды }

Хорошо, давайте сделаем так. Возьмём за основу мою библиотеку (раз она хоть что-то высвечивает) и я попробую заочно переписать знакогенерацию. Только тогда Вы мне чётко отвечайте не вопросы, а то, сам-то я не вижу что и как получается.

Выложите пожалуйста целиком именно тот скетч, которым Вы сегменты зажигаете . Я возьму его за основу и постараюсь поменять. Вы сейчас можете (это пару часов займёт). Или в другой раз?

Да конечно. Если это вас не затруднит, я свободен

#include <stdio.h>
static int serial_fputchar(const char ch, FILE *stream) { ((void*)stream); Serial.write(ch); return ch; }
static FILE *serial_stream = fdevopen(serial_fputchar, NULL);
	
	
#define	PIN_DIO	2
#define	PIN_CLK	3
#define	PIN_STB	4	

#define	INIT_6x12	2
#define	INIT_7x11	3

#define	LED_DATA_LENGTH	14
//
// Глобальные переменные
//
#define	ALL_LEDS	0x0ff0
static uint16_t ledGRID[LED_DATA_LENGTH / 2] =  {// текущее состояние экрана
	ALL_LEDS,
	ALL_LEDS,
	ALL_LEDS,
	ALL_LEDS,
	ALL_LEDS,
	ALL_LEDS,
	ALL_LEDS
};
static uint8_t currentBrightness = 4;	// текущая яркость

//
//	Запись одиночной команды в TM1628
//
void writeSingleCommand(const uint8_t command) {
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, command);
	digitalWrite(PIN_STB, HIGH);
	delayMicroseconds(1); // Пауза до следующей команды
}

//
//	Запись состояния дисплея в TM1628
//
void updateDisplay(void) {
	writeSingleCommand(0x40);  // запись данных, автоматический адрес
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0xC0); // Установка адреса в 0
	uint8_t * p = (uint8_t *) ledGRID;
	for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p); // запись данных
	digitalWrite(PIN_STB, HIGH);
	delayMicroseconds(1); // Пауза до следующей команды
}

//
// Установить яркость от 0 (выключено) до 8
// (возвращает старую яркость)
//
static inline uint8_t setBrightness(const uint8_t newBrighness) {
	const uint8_t res = currentBrightness;
	currentBrightness = (newBrighness > 8) ? 8 : newBrighness;
	if (currentBrightness == 0) writeSingleCommand(0x80); // Выключить дисплей
	else writeSingleCommand(0x88 + (currentBrightness - 1)); // Установить яркость
	return res;
}

void setup(void) {
stdout = serial_stream; // эта строка первая в setup
	Serial.begin(115200);
	//
	// Инициализация пинов
	pinMode(PIN_CLK, OUTPUT);
	pinMode(PIN_DIO, OUTPUT);
	pinMode(PIN_STB, OUTPUT);
	digitalWrite(PIN_STB, HIGH);
	digitalWrite(PIN_CLK, HIGH);
	//
	// Инициализация экрана
	writeSingleCommand(INIT_6x12); // Режим отображения
	setBrightness(currentBrightness);
	//
	// Выводим содержимое регистров
	updateDisplay();

	uint8_t *p = (uint8_t *)(&(ledGRID[0]));
	for (int i = 0; i < 14; i++, p++) {
		printf("0x%02X%c", *p, i % 2 ? '\n' : ' ');
	}
}


void loop(void) {}


Стоп, это что-то не то! Разве Вы этим скетчем сегменты зажигали?
Мне нужен именно тот, которым Вы работали с драйвером.

Да. этим и вот этим

#include <IRremote.h>

//
//	Подключение пинов
// 	разъём отверстиями кверху и синей стороной шлейфа к себе, тогда рсапиновка:
//		GND	3,3V	CLK	DIO	STB	OUT-IR	5V
//
#define	PIN_CLK	3
#define	PIN_DIO	2
#define	PIN_STB	4	
#define	PIN_IR	13


/////////////////////////////////////////////////////////////
/////////////    ТИПА "библиотека" ДЛЯ TM1668    ////////////
/////////////////////////////////////////////////////////////

//
// при том подключении, что есть
// достаточно 10 байтов на светодиоды и 2 на кнопки
//
#define	LED_DATA_LENGTH	14
#define	KEY_DATA_LENGTH	2

//
// Маски нажатых кнопок (слева направо)
//
#define KEY_1	0xFF609F
#define KEY_2	0xFF22DD
#define KEY_3	0x0008
#define KEY_4	0x0001

//
// Подключено 5 "цифр". 
// 0-ая - это двоеточие, залействовано только два младших бита
// 1-4 - собственно цифры слева направо.
// В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой)
// и 7-ой бит под доплнительный символ (питание, конверт и т.п.) 
//
#define	SEG_A	0x0140	// цифры с 1 по 4
#define	SEG_B	0x0280	// цифры с 1 по 4
#define	SEG_C	0x00	// цифры с 1 по 4
#define	SEG_D	0x00	// цифры с 1 по 4
#define	SEG_E	0x00	// цифры с 1 по 4
#define	SEG_F	0x00	// цифры с 1 по 4
#define	SEG_G	0x00	// цифры с 1 по 4

#define	SEG_H	0x000 // Дополнительный символ (	// цифры с 1 по 4)
#define	SEG_ENVELOP	SEG_H // только 1-ая цифра
#define	SEG_ANTENNA	SEG_H // только 2-ая цифра
#define	SEG_POWER	SEG_H // только 3-я цифра
#define	SEG_MUSIC	SEG_H // только 4-ая цифра

#define	SEG_UDOT	0x00	// Верхняя точка двоеточия (только 0-ая цифра)
#define	SEG_LDOT	0x00	// Нижняя точка двоеточия (только 0-ая цифра)
#define	SYMBOL_COLON	0x020	// Двоеточие (только 0-ая цифра)

//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#define SYMBOL_0 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)
#define SYMBOL_1 (SEG_B | SEG_C)
#define SYMBOL_2 (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)
#define SYMBOL_3 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)
#define SYMBOL_4 (SEG_B | SEG_C | SEG_F | SEG_G)
#define SYMBOL_5 (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)
#define SYMBOL_6 (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_7 (SEG_A | SEG_B | SEG_C)
#define SYMBOL_8 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_9 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)

#define SYMBOL_MINUS (SEG_G)
#define SYMBOL_A (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define SYMBOL_C (SEG_A | SEG_E | SEG_F | SEG_D)
#define SYMBOL_E (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_H (SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define SYMBOL_P (SEG_A | SEG_B | SEG_E | SEG_F | SEG_G)
#define SYMBOL_G (SEG_A | SEG_E | SEG_F)
#define SYMBOL_L (SEG_D | SEG_E | SEG_F)
#define SYMBOL_F (SEG_A | SEG_E | SEG_F | SEG_G)
#define SYMBOL_d (SEG_B | SEG_C | SEG_D | SEG_E | SEG_G)
#define SYMBOL_b (SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_rP (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F)

//
// Глобальные переменные
//
static uint16_t ledGRID[LED_DATA_LENGTH / 2]; // текущее состояние экрана
static uint8_t currentBrightness = 1;	// текущая яркость
static uint8_t digits[] = { SYMBOL_0, SYMBOL_1, SYMBOL_2, SYMBOL_3, SYMBOL_4, SYMBOL_5, SYMBOL_6, SYMBOL_7, SYMBOL_8, SYMBOL_9 };
//
static uint16_t saveGRID[LED_DATA_LENGTH / 2]; // нужно для сохранения состояния экрана на время теста
static uint8_t saveBrightness;	// нужно для сохранения яркости на время теста
//
static IRrecv irrecv(PIN_IR);

//
//	Запись одиночной команды в TM1668
//
void writeSingleCommand(const uint8_t command) {
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, command);
	digitalWrite(PIN_STB, HIGH);
	delayMicroseconds(1); // Пауза до следующей команды
}

//
//	Запись состояния дисплея в TM1668
//
void updateDisplay(void) {
	writeSingleCommand(0x40);  // запись данных, автоматический адрес 0x40
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0xC0); // Установка адреса в 0
	uint8_t * p= (uint8_t *) ledGRID;
	for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p); // запись данных
	digitalWrite(PIN_STB, HIGH);
	delayMicroseconds(1); // Пауза до следующей команды
}

//
//	Чтение состояния кнопок с TM1668
//
void readKeyData(uint16_t * data) {
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42);  // чтение данных 0x42
	pinMode(PIN_DIO, INPUT_PULLUP);
	delayMicroseconds(1);
	* data = shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) + (shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 8);
	pinMode(PIN_DIO, OUTPUT);
	digitalWrite(PIN_STB, HIGH);
}

//
// Установить яркость от 0 (выключено) до 8
// (возвращает старую яркость)
//
static inline uint8_t setBrightness(const uint8_t newBrighness) {
	const uint8_t res = currentBrightness;
	currentBrightness = (newBrighness > 8) ? 8 : newBrighness;
	if (currentBrightness == 0) writeSingleCommand(0x80); // Выключить дисплей
	else writeSingleCommand(0x88 + (currentBrightness - 1)); // Установить яркость
	return res;
}

//
//	Увеличить яркость на 1 (возвращает старую яркость)
//
static inline uint8_t increaseBrightness(void) {
	const uint8_t res = currentBrightness;
	if (currentBrightness < 8) setBrightness(currentBrightness + 1);
	return res;
}

//
//	Уменьшить яркость на 1 (возвращает старую яркость)
//
static inline uint8_t decreaseBrightness(void) {
	const uint8_t res = currentBrightness;
	if (currentBrightness > 0) setBrightness(currentBrightness - 1);
	return res;
}

//
//	Показать тест экрана
// (все символы включены на максимальной яркости)
//
void showTest(void) {
	memcpy(saveGRID, ledGRID, sizeof(saveGRID));
	ledGRID[0] = 0x0020;
	/*ledGRID[1] = 0x0FF0;
	ledGRID[2] = 0x0FF0;
	ledGRID[3] = 0x0FF0;
	ledGRID[4] = 0x0FF0;
  ledGRID[5] = 0x0FF0;
  ledGRID[6] = 0x0FF0;*/
	updateDisplay();
	saveBrightness = setBrightness(8);
}
//
//	Восстановить экран после теста
//
void hideTest(void) {
	memcpy(ledGRID, saveGRID, sizeof(saveGRID));
	updateDisplay();
	setBrightness(saveBrightness);
}

//
//	Показать/скрыть/инвертировать дополнительный символ на цифре n
// Одополнительные символы по цифрам:
// 	1-ая - конверт
// 	2-ая - сигнал (антенна), а может громоксть?
// 	3-я  - значок питания
// 	4-ая - нота (типа музыка)
/*
static inline void showExtraSymbol(const int8_t n) { ledGRID[n] |= SEG_H; }
static inline void hideExtraSymbol(const int8_t n) { ledGRID[n] &= ~SEG_H; }
static inline void invertExtraSymbol(const int8_t n) { ledGRID[n] ^= SEG_H; }

//
//	Показать/скрыть/инвертировать конверт
//
static inline void showEnvelope(void) { showExtraSymbol(1); }
static inline void hideEnvelope(void) { hideExtraSymbol(1); }
static inline void invertEnvelope(void) { invertExtraSymbol(1); }

//
//	Показать/скрыть/инвертировать антенну
//
static inline void showAntenna(void) { showExtraSymbol(2); }
static inline void hideAntenna(void) { hideExtraSymbol(2); }
static inline void invertAntenna(void) { invertExtraSymbol(2); }

//
//	Показать/скрыть/инвертировать символ питания
//
static inline void showPower(void) { showExtraSymbol(3); }
static inline void hidePower(void) { hideExtraSymbol(3); }
static inline void invertPower(void) { invertExtraSymbol(3); }

//
//	Показать/скрыть/инвертировать ноту
//
static inline void showMusic(void) { showExtraSymbol(4); }
static inline void hideMusic(void) { hideExtraSymbol(4); }
static inline void invertMusic(void) { invertExtraSymbol(4); }

//
//	Показать/скрыть/инвертировать верхнюю точку двоеточия
//
static inline void showUpperDot(void) { ledGRID[0] |= SEG_UDOT; }
static inline void hideUpperDot(void) { ledGRID[0] &= ~SEG_UDOT; }
static inline void invertUpperDot(void) { ledGRID[0] ^= SEG_UDOT; }

//
//	Показать/скрыть/инвертировать нижнюю точку двоеточия
//
static inline void showLowerDot(void) { ledGRID[0] |= SEG_LDOT; }
static inline void hideLowerDot(void) { ledGRID[0] &= ~SEG_LDOT; }
static inline void invertLowerDot(void) { ledGRID[0] ^= SEG_LDOT; }
*/
//
//	Показать/скрыть/инвертировать двоеточие
//
static inline void showColon(void) { ledGRID[4] |= SYMBOL_COLON; }
static inline void hideColon(void) { ledGRID[4] &= ~SYMBOL_COLON; }
static inline void invertColon(void) { ledGRID[4] ^= SYMBOL_COLON; }

//
//	Показать цифру value (0-9) в позиции digit (1-4)
// при этом, если у цифры горит дополнительный символ, сохраняем его
//
static inline void setDigit(const int8_t digit, const uint8_t value) {
	if (digit < 1 || digit > 4) return; // цифры у нас с 1-ой по 4-ую слева направо
	ledGRID[digit] = value | (ledGRID[digit] & SEG_H); // не обижать дополнительный символ, если есть
}

//
//	Показать число m в двух правых цифрах (типа минуты или там секунды)
//
static inline void showMinutes(const int8_t m) {
	setDigit(4, digits[m % 10]);
	setDigit(3, digits[m / 10]);
}

//
//	Показать число h в двух левых цифрах (типа часы или там минуты)
//
static inline void showHours(const int8_t h) {
	setDigit(2, digits[h % 10]);
	setDigit(1, digits[h / 10]);
}


//
//	Показать и часы, и минуты
//
static inline void showClock(const int8_t h, const int8_t m) {
	showHours(h);
	showMinutes(m);
}

/////////////////////////////////////////////////////////////
////////////    КОНЕЦ "библиотеки" ДЛЯ TM1668    ////////////
/////////////////////////////////////////////////////////////



void setup(void) {
	//
	// Инициализация пинов
	pinMode(PIN_CLK, OUTPUT);
	pinMode(PIN_DIO, OUTPUT);
	pinMode(PIN_STB, OUTPUT);
	pinMode(PIN_IR, INPUT);
	digitalWrite(PIN_STB, HIGH);
	digitalWrite(PIN_CLK, HIGH);
	//
	// Инициализация экрана
	writeSingleCommand(0x03); // Режим отображения (1 и 2 - ничего не меняется)
	setBrightness(currentBrightness);
	//
	// Пишем на экране слово ПОПА
	//setDigit(1, SYMBOL_rP);
	//setDigit(2, SYMBOL_0);
	//setDigit(3, SYMBOL_rP);
	//setDigit(1, SYMBOL_1);
	//updateDisplay();
	//
	// Даём 5 секунд полюбоваться
	//delay(5000);
	//
	// Рисуем нулевое время
	showClock(0, 0);
	showColon();
	updateDisplay();
	//
	//  Приступаем к слушанию "эфира"
	irrecv.enableIRIn(); // Слушаем пульт
}

//
//	Функция обработки кнопки №3
// Гасит текущий доп. символ и зажигает следующий
//
static void swicthExtraSymbol(void) {
	static int8_t extraSymbol = 0;
	if (extraSymbol) ledGRID[extraSymbol] &= ~SEG_H; 
	extraSymbol = (extraSymbol + 1) % 5;
	if (extraSymbol) ledGRID[extraSymbol] |= SEG_H; 
}

void loop(void) {
	static int8_t m = 0, s = 0;	// минуты и секунды для показа
	static uint32_t oldMillis = 0;	// запомненное состояние счётчика миллисекунд
	static bool alreadyBlinked = false;	// флаг. Если true, то на этой секунде двоеточием уже мигали
	bool haveToUpdate = false;	// Если true, то в конце нужно обновить экран
	
	const uint32_t currMillis = millis();
	const uint32_t diffMillis = currMillis - oldMillis;

	//
	// Двоеточием мигаем вдвое чаще, чем меняются цифры
	//
	if (! alreadyBlinked && diffMillis >= 500) {
		invertColon();
		haveToUpdate = true;
		alreadyBlinked = true;
	}

	//
	//	Пришла пора сменить цифру
	//
	if (diffMillis >= 1000) {
		s++;
		if (s == 60) {
			s = 0;
			m = (m + 1) % 60;
		}
		showClock(m, s);
		invertColon();
		haveToUpdate = true;
		alreadyBlinked = false;
		oldMillis = currMillis;
	}

	//
	//	Читаем состояние кнопок
	// и отрабатываем команды
	//
	static uint16_t keys = 0;
	uint16_t newKeys;
	readKeyData(& newKeys);
	if (keys != newKeys) {
		keys = newKeys;
		if (keys & KEY_1) {	// уменьшить яркость
			decreaseBrightness();
		}
		if (keys & KEY_2) {	// увеличить яркость
			increaseBrightness();
		}
		if (keys & KEY_3)	{	// включить следующий доп. символ
			swicthExtraSymbol(); 
			haveToUpdate = true;
		}
		if (keys & KEY_4)  {	// сбросить время в 0
			m = 0; 
			s = 0; 
			showClock(m, s);
			haveToUpdate = true;
			oldMillis = currMillis;
		}
	}
   decode_results results;
   if (irrecv.decode(&results)){

        switch(results.value){
          case 0xFF609F: //Keypad button "5"
          increaseBrightness();
          delay(2);
          //digitalWrite(redPin, LOW);
          }

        switch(results.value){
          case 0xFF22DD: //Keypad button "2"
          showTest();
          delay(2000);
          hideTest();
          }

        irrecv.resume(); 
    }
	//
	// Если пришла команда с пульта (любая, кроме символа повтора),
	// Показываем тест экрана
	//
/*	decode_results results;
	if (irrecv.decode(&results)) {
		if (results.value != KEY_1) {
			showTest();
			delay(1000);
			hideTest();
		}
		irrecv.resume();
	}*/

	if (haveToUpdate) updateDisplay(); // Обновляем экран, если нужно
}

///// Всё! Веселье закончилось!

Евгений Петрович, заношу секиру ЧЧ над головой или не стОит?)

Ближе к делу. Вот этот последний у Вас работает и что-то высвечивает. Правильно? Я могу на него опираться и просто поменять в нём знакогенерацию?

Зачем? Нормальный полёт.

Да высвечивает. но белеберду. и только 3 и 4 разряды

https://disk.yandex.ru/i/khBY9XCKMG_e7w
вот что высвечивает

Первый тест. Цифры пока не работают. В то время, как я буду ковыряться с цифрами, Вы проверьте спец. символы.

Сейчас должны работать 21 функций:

showPLAY(), hidePLAY(), invertPLAY(), 
showREC(), hideREC(), invertREC(), 
showUSB(), hideUSB(), invertUSB(), 
showDISK(), hideDISK(), invertDISK(), 
showCOLON(), hideCOLON(), invertCOLON(), 
showHDD(), hideHDD(), invertHDD(), 
showLAN(), hideLAN(), invertLAN()

Назначение их, думаю понятно из названий. Проверьте, действительно ли они работают.

Имейте в виду, эти функции не изменяют экран сами по себе. Их нужно “набрать”, а потом, когда всё готово вызывать updateDisplay() (см. мой пример).

В моём примере она зажигает PLAY и USB, ждёт 5 сек, чтобы Вы полюбовались, потом гасит USB и зажигает LAN.

Все 21 функция должны работать в любом порядке, хоть всё сразу зажигать, хоть как. Проверьте, а я пока займусь цифрами

Пример

#define	PIN_CLK	3
#define	PIN_DIO	2
#define	PIN_STB	4	
#define	PIN_IR	13


/////////////////////////////////////////////////////////////
/////////////    ТИПА "библиотека" ДЛЯ TM1668    ////////////
/////////////////////////////////////////////////////////////

//
// при том подключении, что есть
// достаточно 10 байтов на светодиоды и 2 на кнопки
//
#define	LED_DATA_LENGTH	14
#define	KEY_DATA_LENGTH	2

//
// Маски нажатых кнопок (слева направо)
//
#define KEY_1	0xFF609F
#define KEY_2	0xFF22DD
#define KEY_3	0x0008
#define KEY_4	0x0001

constexpr byte SEG_A_bit = 0;
constexpr byte SEG_B_bit = 1;
constexpr byte SEG_C_bit = 2;
constexpr byte SEG_D_bit = 3;
constexpr byte SEG_E_bit = 4;
constexpr byte SEG_F_bit = 5;
constexpr byte SEG_G_bit = 6;

constexpr byte SEG_A = 1 << SEG_A_bit;
constexpr byte SEG_B = 1 << SEG_B_bit;
constexpr byte SEG_C = 1 << SEG_C_bit;	
constexpr byte SEG_D = 1 << SEG_D_bit;
constexpr byte SEG_E = 1 << SEG_E_bit;
constexpr byte SEG_F = 1 << SEG_F_bit;
constexpr byte SEG_G = 1 << SEG_G_bit;

// Маска для всех - 0x0020
constexpr byte pos_PLAY = 0;
constexpr byte pos_REC = 1;
constexpr byte pos_USB = 2;
constexpr byte pos_DISK = 3;
constexpr byte pos_COLON = 4; // двоеточие
constexpr byte pos_HDD = 5;
constexpr byte pos_LAN = 6;

//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#define SYMBOL_0 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)
#define SYMBOL_1 (SEG_B | SEG_C)
#define SYMBOL_2 (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)
#define SYMBOL_3 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)
#define SYMBOL_4 (SEG_B | SEG_C | SEG_F | SEG_G)
#define SYMBOL_5 (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)
#define SYMBOL_6 (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_7 (SEG_A | SEG_B | SEG_C)
#define SYMBOL_8 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_9 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)

#define SYMBOL_MINUS (SEG_G)
#define SYMBOL_A (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define SYMBOL_C (SEG_A | SEG_E | SEG_F | SEG_D)
#define SYMBOL_E (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_H (SEG_B | SEG_C | SEG_E | SEG_F | SEG_G)
#define SYMBOL_P (SEG_A | SEG_B | SEG_E | SEG_F | SEG_G)
#define SYMBOL_G (SEG_A | SEG_E | SEG_F)
#define SYMBOL_L (SEG_D | SEG_E | SEG_F)
#define SYMBOL_F (SEG_A | SEG_E | SEG_F | SEG_G)
#define SYMBOL_d (SEG_B | SEG_C | SEG_D | SEG_E | SEG_G)
#define SYMBOL_b (SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_rP (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F)

//
// Глобальные переменные
//
static uint16_t ledGRID[LED_DATA_LENGTH / 2]; // текущее состояние экрана
static uint8_t currentBrightness = 1;	// текущая яркость
constexpr static uint8_t digits[] = { SYMBOL_0, SYMBOL_1, SYMBOL_2, SYMBOL_3, SYMBOL_4, SYMBOL_5, SYMBOL_6, SYMBOL_7, SYMBOL_8, SYMBOL_9 };
//
//static uint16_t saveGRID[LED_DATA_LENGTH / 2]; // нужно для сохранения состояния экрана на время теста
//static uint8_t saveBrightness;	// нужно для сохранения яркости на время теста
//
//static IRrecv irrecv(PIN_IR);

//
//	Запись одиночной команды в TM1668
//
void writeSingleCommand(const uint8_t command) {
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, command);
	digitalWrite(PIN_STB, HIGH);
	delayMicroseconds(1); // Пауза до следующей команды
}

//
//	Запись состояния дисплея в TM1668
//
void updateDisplay(void) {
	writeSingleCommand(0x40);  // запись данных, автоматический адрес 0x40
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0xC0); // Установка адреса в 0
	uint8_t * p= (uint8_t *) ledGRID;
	for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p); // запись данных
	digitalWrite(PIN_STB, HIGH);
	delayMicroseconds(1); // Пауза до следующей команды
}

/*
//
//	Чтение состояния кнопок с TM1668
//
void readKeyData(uint16_t * data) {
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42);  // чтение данных 0x42
	pinMode(PIN_DIO, INPUT_PULLUP);
	delayMicroseconds(1);
	* data = shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) + (shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 8);
	pinMode(PIN_DIO, OUTPUT);
	digitalWrite(PIN_STB, HIGH);
}
*/

//
// Установить яркость от 0 (выключено) до 8
// (возвращает старую яркость)
//  !!!РАЗОБРАТЬСЯ!!!
static inline uint8_t setBrightness(const uint8_t newBrighness) {
	const uint8_t res = currentBrightness;
	currentBrightness = (newBrighness > 8) ? 8 : newBrighness;
	if (currentBrightness == 0) writeSingleCommand(0x80); // Выключить дисплей
	else writeSingleCommand(0x88 + (currentBrightness - 1)); // Установить яркость
	return res;
}

//
//	Увеличить яркость на 1 (возвращает старую яркость)
//
static inline uint8_t increaseBrightness(void) {
	const uint8_t res = currentBrightness;
	if (currentBrightness < 8) setBrightness(currentBrightness + 1);
	return res;
}

//
//	Уменьшить яркость на 1 (возвращает старую яркость)
//
static inline uint8_t decreaseBrightness(void) {
	const uint8_t res = currentBrightness;
	if (currentBrightness > 0) setBrightness(currentBrightness - 1);
	return res;
}

//
//	Показать тест экрана
// (все символы включены на максимальной яркости)
//
//void showTest(void) {
//	memcpy(saveGRID, ledGRID, sizeof(saveGRID));
//	ledGRID[0] = 0x0FF0;
//	ledGRID[1] = 0x0FF0;
//	ledGRID[2] = 0x0FF0;
//	ledGRID[3] = 0x0FF0;
//	ledGRID[4] = 0x0FF0;
//	ledGRID[5] = 0x0FF0;
//	ledGRID[6] = 0x0FF0;
//	updateDisplay();
//	saveBrightness = setBrightness(8);
//}
//
//	Восстановить экран после теста
//
//void hideTest(void) {
//	memcpy(ledGRID, saveGRID, sizeof(saveGRID));
//	updateDisplay();
//	setBrightness(saveBrightness);
//}

//
//	Показать/скрыть/инвертировать дополнительный символ
//		constexpr byte pos_PLAY = 0;
//		constexpr byte pos_REC = 1;
//		constexpr byte pos_USB = 2;
//		constexpr byte pos_DISK = 3;
//		constexpr byte pos_COLON = 4; // двоеточие
//		constexpr byte pos_HDD = 5;
//		constexpr byte pos_LAN = 6;
static inline void showExtraSymbol(const int8_t n) { ledGRID[n] |= 0x0020; }
static inline void hideExtraSymbol(const int8_t n) { ledGRID[n] &= ~0x0020; }
static inline void invertExtraSymbol(const int8_t n) { ledGRID[n] ^= 0x0020; }

//
//	Показать/скрыть/инвертировать PLAY
//
static inline void showPLAY(void) { showExtraSymbol(pos_PLAY); }
static inline void hidePLAY(void) { hideExtraSymbol(pos_PLAY); }
static inline void invertPLAY(void) { invertExtraSymbol(pos_PLAY); }
//
//	Показать/скрыть/инвертировать REC
//
static inline void showREC(void) { showExtraSymbol(pos_REC); }
static inline void hideREC(void) { hideExtraSymbol(pos_REC); }
static inline void invertREC(void) { invertExtraSymbol(pos_REC); }

//
//	Показать/скрыть/инвертировать USB
//
static inline void showUSB(void) { showExtraSymbol(pos_USB); }
static inline void hideUSB(void) { hideExtraSymbol(pos_USB); }
static inline void invertUSB(void) { invertExtraSymbol(pos_USB); }

//
//	Показать/скрыть/инвертировать DISK
//
static inline void showDISK(void) { showExtraSymbol(pos_DISK); }
static inline void hideDISK(void) { hideExtraSymbol(pos_DISK); }
static inline void invertDISK(void) { invertExtraSymbol(pos_DISK); }

//
//	Показать/скрыть/инвертировать COLON
//
static inline void showCOLON(void) { showExtraSymbol(pos_COLON); }
static inline void hideCOLON(void) { hideExtraSymbol(pos_COLON); }
static inline void invertCOLON(void) { invertExtraSymbol(pos_COLON); }

//
//	Показать/скрыть/инвертировать HDD
//
static inline void showHDD(void) { showExtraSymbol(pos_HDD); }
static inline void hideHDD(void) { hideExtraSymbol(pos_HDD); }
static inline void invertHDD(void) { invertExtraSymbol(pos_HDD); }

//
//	Показать/скрыть/инвертировать LAN
//
static inline void showLAN(void) { showExtraSymbol(pos_LAN); }
static inline void hideLAN(void) { hideExtraSymbol(pos_LAN); }
static inline void invertLAN(void) { invertExtraSymbol(pos_LAN); }



//
//	Показать цифру value (0-9) в позиции digit (1-4)
// при этом, если у цифры горит дополнительный символ, сохраняем его
//
static inline void setDigit(const int8_t digit, const uint8_t value) {
//	if (digit < 1 || digit > 4) return; // цифры у нас с 1-ой по 4-ую слева направо
//	ledGRID[digit] = value | (ledGRID[digit] & SEG_H); // не обижать дополнительный символ, если есть
}

//
//	Показать число m в двух правых цифрах (типа минуты или там секунды)
//
static inline void showMinutes(const int8_t m) {
	setDigit(4, digits[m % 10]);
	setDigit(3, digits[m / 10]);
}

//
//	Показать число h в двух левых цифрах (типа часы или там минуты)
//
static inline void showHours(const int8_t h) {
	setDigit(2, digits[h % 10]);
	setDigit(1, digits[h / 10]);
}


//
//	Показать и часы, и минуты
//
static inline void showClock(const int8_t h, const int8_t m) {
	showHours(h);
	showMinutes(m);
}

/////////////////////////////////////////////////////////////
////////////    КОНЕЦ "библиотеки" ДЛЯ TM1668    ////////////
/////////////////////////////////////////////////////////////



void setup(void) {
	//
	// Инициализация пинов
	pinMode(PIN_CLK, OUTPUT);
	pinMode(PIN_DIO, OUTPUT);
	pinMode(PIN_STB, OUTPUT);
	pinMode(PIN_IR, INPUT);
	digitalWrite(PIN_STB, HIGH);
	digitalWrite(PIN_CLK, HIGH);
	//
	// Инициализация экрана
	writeSingleCommand(0x03); // Режим отображения (1 и 2 - ничего не меняется)
	setBrightness(currentBrightness);

	showPLAY(); // зажечь PLAY
	showUSB(); // зажечь USB
	updateDisplay();
	delay(5000);
	showLAN(); // зажечь PLAY
	hideUSB(); // зажечь USB
	updateDisplay();
}

void loop (void) {}
///// Всё! Веселье закончилось!

Да все именно так. Зажигает Play и USB, потом гаснет USB и зажигается lan