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

Извините, это перебирать здесь

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(4);

У Вас всего семь разрядов? При таком скетче все 7 сразу загораются всеми сегментами? Так?

У меня 4 разряда (4 цифры), двоеточие 6 добсимволов и да загорается все

Перепираю вот в этом вашем коде

#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] =  {// текущее состояние экрана
	0x0200,
	0,
	0,
	0,
	0,
	0,
	0
};
static uint8_t currentBrightness = 1;	// текущая яркость

//
//	Запись одиночной команды в 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) {}


Тогда, для начала разберитесь кто из ledGRID[0-6] лишний (может, и никто, но это надо проверить). Для этого присваивайте им по одному 0 (вместо 0x0ff0) и смотрите что погасло. Если при каком-то ledGRID[х] не погасло ничего, значит он лишний - забудьте про него. А у тех, при которых что-то гаснет, запишите что именно. Так Вы узнаете, кто из ledGRID[x] за что отвечает.

Следующим ходом перебирайте биты (как я писал выше). Все 8 битов. Так Вы узнаете какой бит отвечает за какой сегмент (спец. символ и т.п.). Для этого удобнее переписать так

void showTest(void) {
	memcpy(saveGRID, ledGRID, sizeof(saveGRID));
        const byte bt = 0x0FF0;
	ledGRID[0] = bt;
	ledGRID[1] = bt;
        ....	

чтобы в одном месте менять.

Когда Вы всё это проделаете, Вы будете точно знать как зажечь нужную Вам комбинацию сегментов в любом разряде. Собственно и всё.

Нет все нужные. При каждом что-то гаснет. Сейчас перепираю.
Спасибо, что откликнулись.

Давайте. Вам нужно про все 7 элементов знать за что в них отвечает каждый бит. Тогда Вы легко и непринуждённо сможете зажечь всё, что угодно.

Получилась вот такая табличка

0x0020 play  (0x0030)
0x0040 = a - 4 (0x0050)
0x0080 = a - 3 (0x0090)
0x0100 = a - 2 (0х0500)
0x0200 = a - 1 (0х0600)


0x0020 rec (0x0030)
0x0040 = b - 4 (0x0050)
0x0080 = b - 3 (0x0090)
0x0100 = b - 2 (0х0500)
0x0200 = b - 1 (0х0600)


0x0020 usb (0x0030)
0x0040 = c - 4 (0x0050)
0x0080 = c - 3 (0x0090)
0x0100 = c - 2 (0х0500)
0x0200 = c - 1 (0х0600)

0x0020 disc   (0x0030)
0x0040 = d - 4 (0x0050)
0x0080 = d - 3 (0x0090)
0x0100 = d - 2 (0х0500)
0x0200 = d - 1 (0х0600)

0x0020 DP (0x0030)
0x0040 = e - 4 (0x0050)
0x0080 = e - 3 (0x0090)
0x0100 = e - 2 (0х0500)
0x0200 = e - 1 (0х0600)


0x0020 hdd (0x0030)
0x0040 = f - 4 (0x0050)
0x0080 = f - 3 (0x0090)
0x0100 = f - 2 (0х0500)
0x0200 = f - 1 (0х0600)


0x0020 lan  (0x0030)
0x0040 = g - 4 (0x0050)
0x0080 = g - 3 (0x0090)
0x0100 = g - 2 (0х0500)
0x0200 = g - 1 (0х0600)

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

Я не понимаю, что тут написано, поясните

я просто не знал как правильно это создавать,
0х0020 доп. сегмент “g”-это сегмент разряда “4” это № разряда

Я вставлял эти значения в каждую строчку

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

Либj я опять ничего не понял, либо тут что-то не так.

Давайте Вы распишете отдельно ledGRID[0] (все остальные сделайте пока 0 - чтобы ничего лишнего не светилось). Что загорается при каждом бите? Примерно так (это только пример):

Биты ledGRID[0]
0x0010 - разр 1. сег. a
0x0020 - разр 1. сег. b
...
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 

В каждом ledGRID зажигается только по одному сегменту или “a”, “b” и т.д

А остальные три бита (0x0010, 0x0400, 0x0400)

Ни на что не влияют?

И ещё меня смутила dp. Она (десятичная точка) разве не у каждого разряда своя? Или что это?

Ну это я понял, значит я их перепутал и они транспонированы, но это нормально. С этим можно жить.

Ответьте там про dp. И доп. вопрос - сколько сегментов у разрядов? По семь a-g) или по 8 (a-g, десятичная точка).

Вы что-то говорили про двоеточие. Где оно в Вашей таблице?

при каких то значениях загорается сразу два сегмента в двух разряда.
При этих значениях загораются по одному сегменту
DP - это двоеточие
4 разряда с цифрами

Например.

При 0x0300 Зажигаются сегменты в 1 и 2 разряде
При 0x0070 Зажигаются сегмент в 4 разряде и доп символ

Вот такой дисплей