не могу програмно настроить пины на лед драйвере АТ1628

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
#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);
//
//	Подключение пинов
// 	разъём отверстиями кверху и синей стороной шлейфа к себе, тогда рсапиновка:
//		GND	3,3V	CLK	DIO	STB	OUT-IR	5V
//
#define	PIN_DIO	9
#define	PIN_CLK	8
#define	PIN_STB	7	

#define	INIT_6x12	2
#define	INIT_7x11	3

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

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

//
// Маски нажатых кнопок (слева направо)
//
#define KEY_2_BLUE	0x1000
#define KEY_1_BLUE	0x0200
#define KEY_2_RED		0/????
#define KEY_1_RED		0x0010

//
// Подключено 5 "цифр". 
// 0-ая - это двоеточие, залействовано только два младших бита
// 1-4 - собственно цифры слева направо.
// В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой)
// и 7-ой бит под доплнительный символ (питание, конверт и т.п.) 
//
#define	LE6	0x0001
#define	LE5	0x0020
#define	LE7	0x0040
#define	LE8	0x0040

#define	SEG_A	0x0001
#define	SEG_F	0x0002
#define	SEG_B	0x0004
#define	SEG_G	0x0008
#define	SEG_C	0x0010
#define	SEG_DP	0x0020
#define	SEG_D	0x0040
#define	SEG_E	0x0080


//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#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;	// нужно для сохранения яркости на время теста
//

//
//	Запись одиночной команды в 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);  // запись данных, автоматический адрес
	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(uint32_t * data) {
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42);  // чтение данных
	pinMode(PIN_DIO, INPUT_PULLUP);
	delayMicroseconds(1);
	* data = (uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) + ((uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 8) + ((uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 16) + ((uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 24);
	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] = 3;
	ledGRID[1] = 0xFF;
	ledGRID[2] = 0xFF;
	ledGRID[3] = 0xFF;
	ledGRID[4] = 0xFF;
	updateDisplay();
	saveBrightness = setBrightness(8);
}
//
//	Восстановить экран после теста
//
void hideTest(void) {
	memcpy(ledGRID, saveGRID, sizeof(saveGRID));
	updateDisplay();
	setBrightness(saveBrightness);
}


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

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

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


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

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



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_7x11); // Режим отображения (1 и 2 - ничего не меняется)
	setBrightness(currentBrightness);
	//
	// Пишем на экране слово ПОПА
	setDigit(3, SYMBOL_rP);
	setDigit(2, SYMBOL_0);
	setDigit(1, SYMBOL_rP);
	setDigit(0, SYMBOL_A);
	updateDisplay();
	//
	// Даём 5 секунд полюбоваться
	delay(5000);
	//
	// Рисуем нулевое время
	showClock(0, 0);
	updateDisplay();

	setDigit(0, SYMBOL_0);
	setDigit(1, SYMBOL_1);
	setDigit(2, SYMBOL_2);
	setDigit(3, SYMBOL_3);
	setDigit(4, SYMBOL_4);
	setDigit(5, SYMBOL_5);
	updateDisplay();

	printf("Press key\n");
}

void loop(void) {
	uint32_t newKeys;
	readKeyData(& newKeys);
	printf("0x%08lX\n", newKeys);
	delay(1000);
}

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
#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);
//
//	Подключение пинов
// 	разъём отверстиями кверху и синей стороной шлейфа к себе, тогда рсапиновка:
//		GND	3,3V	CLK	DIO	STB	OUT-IR	5V
//
#define	PIN_DIO	9
#define	PIN_CLK	8
#define	PIN_STB	7	

#define	INIT_6x12	2
#define	INIT_7x11	3

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

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

//
// Маски нажатых кнопок (слева направо)
//
#define KEY_2_BLUE	0x00001000ul
#define KEY_1_BLUE	0x00000200ul
#define KEY_2_RED		0x00020000ul
#define KEY_1_RED		0x00000010ul

//
// Подключено 5 "цифр". 
// 0-ая - это двоеточие, залействовано только два младших бита
// 1-4 - собственно цифры слева направо.
// В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой)
// и 7-ой бит под доплнительный символ (питание, конверт и т.п.) 
//
#define	LE6	0x0001
#define	LE5	0x0020
#define	LE7	0x0040
#define	LE8	0x0040

#define	SEG_A	0x0001
#define	SEG_F	0x0002
#define	SEG_B	0x0004
#define	SEG_G	0x0008
#define	SEG_C	0x0010
#define	SEG_DP	0x0020
#define	SEG_D	0x0040
#define	SEG_E	0x0080


//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#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;	// нужно для сохранения яркости на время теста
//

//
//	Запись одиночной команды в 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);  // запись данных, автоматический адрес
	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(uint32_t * data) {
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42);  // чтение данных
	pinMode(PIN_DIO, INPUT_PULLUP);
	delayMicroseconds(1);
	* data = (uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) + ((uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 8) + ((uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 16) + ((uint32_t)shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 24);
	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] = 3;
	ledGRID[1] = 0xFF;
	ledGRID[2] = 0xFF;
	ledGRID[3] = 0xFF;
	ledGRID[4] = 0xFF;
	updateDisplay();
	saveBrightness = setBrightness(8);
}
//
//	Восстановить экран после теста
//
void hideTest(void) {
	memcpy(ledGRID, saveGRID, sizeof(saveGRID));
	updateDisplay();
	setBrightness(saveBrightness);
}


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

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

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


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

#define	LEFT_POSITION	3
#define	RIGHT_POSITION	0

static inline void showNumber(const int8_t where, int num) {
	for (uint8_t i = where; i < where + 3; i++) {
		if (num == 0) {
			setDigit(i, i == where ? SYMBOL_0 : 0);
		} else {
			setDigit(i, digits[num % 10]);
			num  /= 10;
		}
	}
}

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



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_7x11); // Режим отображения (1 и 2 - ничего не меняется)
	setBrightness(currentBrightness);
	//
	// Пишем на экране слово ПОПА
	setDigit(3, SYMBOL_rP);
	setDigit(2, SYMBOL_0);
	setDigit(1, SYMBOL_rP);
	setDigit(0, SYMBOL_A);
	updateDisplay();
	//
	// Даём 5 секунд полюбоваться
	delay(1000);
	//
	// Рисуем нулевое время
	showClock(0, 0);
	updateDisplay();

	showNumber(LEFT_POSITION, 666);
	showNumber(RIGHT_POSITION, 321);
	updateDisplay();
	delay(5000);
	showNumber(LEFT_POSITION, 0);
	showNumber(RIGHT_POSITION, 3);
	updateDisplay();
	delay(5000);
	showNumber(LEFT_POSITION, 21);
	showNumber(RIGHT_POSITION, 1);
	updateDisplay();
	delay(5000);
	showNumber(LEFT_POSITION, 666);
	showNumber(RIGHT_POSITION, 321);
	updateDisplay();
	delay(5000);
	
	printf("Press key\n");
}

void loop(void) {
	uint32_t newKeys;
	readKeyData(& newKeys);
	printf("0x%08lX\n", newKeys);
	delay(1000);
}

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
#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);
//
//	Подключение пинов
// 	разъём отверстиями кверху и синей стороной шлейфа к себе, тогда рсапиновка:
//		GND	3,3V	CLK	DIO	STB	OUT-IR	5V
//
#define	PIN_DIO	9
#define	PIN_CLK	8
#define	PIN_STB	7	

#define	INIT_6x12	2
#define	INIT_7x11	3

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

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

//
// Маски нажатых кнопок (слева направо)
//
#define KEY_2_BLUE	0x00001000ul
#define KEY_1_BLUE	0x00000200ul
#define KEY_2_RED		0x00020000ul
#define KEY_1_RED		0x00000010ul

//
// Подключено 5 "цифр". 
// 0-ая - это двоеточие, залействовано только два младших бита
// 1-4 - собственно цифры слева направо.
// В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой)
// и 7-ой бит под доплнительный символ (питание, конверт и т.п.) 
//
#define	LE6	0x0001
#define	LE5	0x0020
#define	LE7	0x0040
#define	LE8	0x0040

#define	SEG_A	0x0001
#define	SEG_F	0x0002
#define	SEG_B	0x0004
#define	SEG_G	0x0008
#define	SEG_C	0x0010
#define	SEG_DP	0x0020
#define	SEG_D	0x0040
#define	SEG_E	0x0080


//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#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;	// нужно для сохранения яркости на время теста
//

//
//	Запись одиночной команды в 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);  // запись данных, автоматический адрес
	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(uint32_t * data) {
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42);  // чтение данных
	pinMode(PIN_DIO, INPUT_PULLUP);
	delayMicroseconds(1);
	byte buffer[KEY_DATA_LENGTH];
	for (int i=0; i<KEY_DATA_LENGTH; i++) {
		buffer[i] = shiftIn(PIN_DIO, PIN_CLK, LSBFIRST);
	}
	pinMode(PIN_DIO, OUTPUT);
	digitalWrite(PIN_STB, HIGH);
	for (int i=0; i<KEY_DATA_LENGTH; i++) {
		printf("%02X", buffer[i]);
	}
	printf("\n");
	* data = 0;
}

//
// Установить яркость от 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] = 3;
	ledGRID[1] = 0xFF;
	ledGRID[2] = 0xFF;
	ledGRID[3] = 0xFF;
	ledGRID[4] = 0xFF;
	updateDisplay();
	saveBrightness = setBrightness(8);
}
//
//	Восстановить экран после теста
//
void hideTest(void) {
	memcpy(ledGRID, saveGRID, sizeof(saveGRID));
	updateDisplay();
	setBrightness(saveBrightness);
}


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

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

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


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

#define	LEFT_POSITION	3
#define	RIGHT_POSITION	0

static inline void showNumber(const int8_t where, int num) {
	for (uint8_t i = where; i < where + 3; i++) {
		if (num == 0) {
			setDigit(i, i == where ? SYMBOL_0 : 0);
		} else {
			setDigit(i, digits[num % 10]);
			num  /= 10;
		}
	}
}

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



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_7x11); // Режим отображения (1 и 2 - ничего не меняется)
	setBrightness(currentBrightness);
	//
//	// Пишем на экране слово ПОПА
//	setDigit(3, SYMBOL_rP);
//	setDigit(2, SYMBOL_0);
//	setDigit(1, SYMBOL_rP);
//	setDigit(0, SYMBOL_A);
//	updateDisplay();
//	//
//	// Даём 5 секунд полюбоваться
//	delay(1000);
//	//
//	// Рисуем нулевое время
//	showClock(0, 0);
//	updateDisplay();
//
//	showNumber(LEFT_POSITION, 666);
//	showNumber(RIGHT_POSITION, 321);
//	updateDisplay();
//	delay(5000);
//	showNumber(LEFT_POSITION, 0);
//	showNumber(RIGHT_POSITION, 3);
//	updateDisplay();
//	delay(5000);
//	showNumber(LEFT_POSITION, 21);
//	showNumber(RIGHT_POSITION, 1);
//	updateDisplay();
//	delay(5000);
//	showNumber(LEFT_POSITION, 666);
//	showNumber(RIGHT_POSITION, 321);
//	updateDisplay();
//	delay(5000);
//	
	printf("Press key\n");
}

void loop(void) {
	uint32_t newKeys;
	readKeyData(& newKeys);
//	printf("0x%08lX\n", newKeys);
	delay(1000);
}

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
#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);
//
//	Подключение пинов
// 	разъём отверстиями кверху и синей стороной шлейфа к себе, тогда рсапиновка:
//		GND	3,3V	CLK	DIO	STB	OUT-IR	5V
//
#define	PIN_DIO	9
#define	PIN_CLK	8
#define	PIN_STB	7	

#define	INIT_6x12	2
#define	INIT_7x11	3

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

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

//
// Маски нажатых кнопок (слева направо)
//
//#define KEY_2_BLUE	0x00001000ul
//#define KEY_1_BLUE	0x00000200ul
//#define KEY_2_RED		0x00020000ul
//#define KEY_1_RED		0x00000010ul
/*
#define KEY_2_BLUE   0x0010000000
#define KEY_1_BLUE   0x0002000000
#define KEY_2_RED    0x0000020000
#define KEY_1_RED    0x1000000000
#define POWER_2  0x0000000010 // LE6
#define POWER_1  0x0000000002 // LE8
*/

//
// Подключено 5 "цифр". 
// 0-ая - это двоеточие, залействовано только два младших бита
// 1-4 - собственно цифры слева направо.
// В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой)
// и 7-ой бит под доплнительный символ (питание, конверт и т.п.) 
//
#define	LE6	0x0001 // зел справа
#define	LE5	0x0020 // красн справа
#define	LE7	0x0040 // красн слева
#define	LE8	0x0080 // зел. слева

#define	SEG_A	0x0001
#define	SEG_F	0x0002
#define	SEG_B	0x0004
#define	SEG_G	0x0008
#define	SEG_C	0x0010
#define	SEG_DP	0x0020
#define	SEG_D	0x0040
#define	SEG_E	0x0080


//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#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 = 7;	// текущая яркость
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;	// нужно для сохранения яркости на время теста
//

//
//	Запись одиночной команды в 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);  // запись данных, автоматический адрес
	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
//
#define KEY_2_BLUE   1
#define KEY_1_BLUE   2
#define KEY_2_RED    4
#define KEY_1_RED    8
#define POWER_2  16
#define POWER_1  32

void readKeyData(uint8_t * data) {
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42);  // чтение данных
	pinMode(PIN_DIO, INPUT_PULLUP);
	delayMicroseconds(1);
	byte buffer[KEY_DATA_LENGTH];
	for (int i=0; i<KEY_DATA_LENGTH; i++) {
		buffer[i] = shiftIn(PIN_DIO, PIN_CLK, LSBFIRST);
	}
	pinMode(PIN_DIO, OUTPUT);
	digitalWrite(PIN_STB, HIGH);
	* data = 0;
	if (buffer[1] & 0x10) *data |= KEY_2_BLUE;
	if (buffer[1] & 0x02) *data |= KEY_1_BLUE;
	if (buffer[2] & 0x02) *data |= KEY_2_RED;
	if (buffer[0] & 0x10) *data |= KEY_1_RED;
	if (buffer[4] & 0x10) *data |= POWER_2;
	if (buffer[4] & 0x02) *data |= POWER_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;
}

//
//	Увеличить яркость на 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] = 3;
	ledGRID[1] = 0xFF;
	ledGRID[2] = 0xFF;
	ledGRID[3] = 0xFF;
	ledGRID[4] = 0xFF;
	updateDisplay();
	saveBrightness = setBrightness(8);
}
//
//	Восстановить экран после теста
//
void hideTest(void) {
	memcpy(ledGRID, saveGRID, sizeof(saveGRID));
	updateDisplay();
	setBrightness(saveBrightness);
}


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

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

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


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

#define	LEFT_POSITION	3
#define	RIGHT_POSITION	0

static inline void showNumber(const int8_t where, int num) {
	for (uint8_t i = where; i < where + 3; i++) {
		if (num == 0) {
			setDigit(i, i == where ? SYMBOL_0 : 0);
		} else {
			setDigit(i, digits[num % 10]);
			num  /= 10;
		}
	}
}

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

static int l = 666, r = 321;

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_7x11); // Режим отображения (1 и 2 - ничего не меняется)
	setBrightness(currentBrightness);
	//
//	// Пишем на экране слово ПОПА
//	setDigit(3, SYMBOL_rP);
//	setDigit(2, SYMBOL_0);
//	setDigit(1, SYMBOL_rP);
//	setDigit(0, SYMBOL_A);
//	updateDisplay();
//	//
//	// Даём 5 секунд полюбоваться
//	delay(1000);
//	//
//	// Рисуем нулевое время
//	showClock(0, 0);
//	updateDisplay();
//
	showNumber(LEFT_POSITION, l);
	showNumber(RIGHT_POSITION, r);
	updateDisplay();
//	delay(5000);
//	showNumber(LEFT_POSITION, 0);
//	showNumber(RIGHT_POSITION, 3);
//	updateDisplay();
//	delay(5000);
//	showNumber(LEFT_POSITION, 21);
//	showNumber(RIGHT_POSITION, 1);
//	updateDisplay();
//	delay(5000);
//	showNumber(LEFT_POSITION, 666);
//	showNumber(RIGHT_POSITION, 321);
//	updateDisplay();
//	delay(5000);
//	
	printf("Press key\n");
}

void loop(void) {
	
	uint8_t newKeys;
	readKeyData(& newKeys);
	
#define KEY_2_BLUE   1
#define KEY_1_BLUE   2
#define KEY_2_RED    4
#define KEY_1_RED    8
#define POWER_2  16
#define POWER_1  32
	
	if (newKeys & KEY_1_BLUE) {
		if (l < 999) l++;
	}
	if (newKeys & KEY_1_RED) {
		if (l > 0) l--;
	}
	if (newKeys & KEY_2_BLUE) {
		if (r < 999) r++;
	}
	if (newKeys & KEY_2_RED) {
		if (r > 0) r--;
	}
//#define POWER_2  0x0000000010 // LE6
//#define POWER_1  0x0000000002 // LE8
	
	if (newKeys & POWER_2) setDigit(5, ledGRID[5] | LE6);
	else setDigit(5, ledGRID[5] & ~LE6);
	
	if (newKeys & POWER_1) setDigit(5, ledGRID[5] | LE8);
	else setDigit(5, ledGRID[5] & ~LE8);
	

	showNumber(LEFT_POSITION, l);
	showNumber(RIGHT_POSITION, r);
	updateDisplay();

	
//	printf("0x%08lX\n", newKeys);
	delay(1000);
}

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
#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);
//
//	Подключение пинов
// 	разъём отверстиями кверху и синей стороной шлейфа к себе, тогда рсапиновка:
//		GND	3,3V	CLK	DIO	STB	OUT-IR	5V
//
#define	PIN_DIO	9
#define	PIN_CLK	8
#define	PIN_STB	7	

#define	INIT_6x12	2
#define	INIT_7x11	3

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

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

//
// Маски нажатых кнопок (слева направо)
//
//#define KEY_2_BLUE	0x00001000ul
//#define KEY_1_BLUE	0x00000200ul
//#define KEY_2_RED		0x00020000ul
//#define KEY_1_RED		0x00000010ul
/*
#define KEY_2_BLUE   0x0010000000
#define KEY_1_BLUE   0x0002000000
#define KEY_2_RED    0x0000020000
#define KEY_1_RED    0x1000000000
#define POWER_2  0x0000000010 // LE6
#define POWER_1  0x0000000002 // LE8
*/

//
// Подключено 5 "цифр". 
// 0-ая - это двоеточие, залействовано только два младших бита
// 1-4 - собственно цифры слева направо.
// В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой)
// и 7-ой бит под доплнительный символ (питание, конверт и т.п.) 
//
#define	LE6	0x0001 // зел справа
#define	LE5	0x0020 // красн справа
#define	LE7	0x0040 // красн слева
#define	LE8	0x0080 // зел. слева

#define	SEG_A	0x0001
#define	SEG_F	0x0002
#define	SEG_B	0x0004
#define	SEG_G	0x0008
#define	SEG_C	0x0010
#define	SEG_DP	0x0020
#define	SEG_D	0x0040
#define	SEG_E	0x0080


//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#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 = 7;	// текущая яркость
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;	// нужно для сохранения яркости на время теста
//

//
//	Запись одиночной команды в 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);  // запись данных, автоматический адрес
	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
//
#define KEY_2_BLUE   1
#define KEY_1_BLUE   2
#define KEY_2_RED    4
#define KEY_1_RED    8
#define POWER_2  16
#define POWER_1  32

void readKeyData(uint8_t * data) {
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42);  // чтение данных
	pinMode(PIN_DIO, INPUT_PULLUP);
	delayMicroseconds(1);
	byte buffer[KEY_DATA_LENGTH];
	for (int i=0; i<KEY_DATA_LENGTH; i++) {
		buffer[i] = shiftIn(PIN_DIO, PIN_CLK, LSBFIRST);
	}
	pinMode(PIN_DIO, OUTPUT);
	digitalWrite(PIN_STB, HIGH);
	* data = 0;
	if (buffer[1] & 0x10) *data |= KEY_2_BLUE;
	if (buffer[1] & 0x02) *data |= KEY_1_BLUE;
	if (buffer[2] & 0x02) *data |= KEY_2_RED;
	if (buffer[0] & 0x10) *data |= KEY_1_RED;
	if (buffer[4] & 0x10) *data |= POWER_2;
	if (buffer[4] & 0x02) *data |= POWER_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;
}

//
//	Увеличить яркость на 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] = 3;
	ledGRID[1] = 0xFF;
	ledGRID[2] = 0xFF;
	ledGRID[3] = 0xFF;
	ledGRID[4] = 0xFF;
	updateDisplay();
	saveBrightness = setBrightness(8);
}
//
//	Восстановить экран после теста
//
void hideTest(void) {
	memcpy(ledGRID, saveGRID, sizeof(saveGRID));
	updateDisplay();
	setBrightness(saveBrightness);
}


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

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

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


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

#define	LEFT_POSITION	3
#define	RIGHT_POSITION	0

static inline void showNumber(const int8_t where, int num) {
	for (uint8_t i = where; i < where + 3; i++) {
		if (num == 0) {
			setDigit(i, i == where ? SYMBOL_0 : 0);
		} else {
			setDigit(i, digits[num % 10]);
			num  /= 10;
		}
	}
}

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

static int l = 666, r = 321;

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_7x11); // Режим отображения (1 и 2 - ничего не меняется)
	setBrightness(currentBrightness);
	//
//	// Пишем на экране слово ПОПА
//	setDigit(3, SYMBOL_rP);
//	setDigit(2, SYMBOL_0);
//	setDigit(1, SYMBOL_rP);
//	setDigit(0, SYMBOL_A);
//	updateDisplay();
//	//
//	// Даём 5 секунд полюбоваться
//	delay(1000);
//	//
//	// Рисуем нулевое время
//	showClock(0, 0);
//	updateDisplay();
//
	showNumber(LEFT_POSITION, l);
	showNumber(RIGHT_POSITION, r);
	updateDisplay();
//	delay(5000);
//	showNumber(LEFT_POSITION, 0);
//	showNumber(RIGHT_POSITION, 3);
//	updateDisplay();
//	delay(5000);
//	showNumber(LEFT_POSITION, 21);
//	showNumber(RIGHT_POSITION, 1);
//	updateDisplay();
//	delay(5000);
//	showNumber(LEFT_POSITION, 666);
//	showNumber(RIGHT_POSITION, 321);
//	updateDisplay();
//	delay(5000);
//	
	printf("Press key\n");
}

void loop(void) {
	
	uint8_t newKeys;
	readKeyData(& newKeys);
	
#define KEY_2_BLUE   1
#define KEY_1_BLUE   2
#define KEY_2_RED    4
#define KEY_1_RED    8
#define POWER_2  16
#define POWER_1  32
	
	if (newKeys & KEY_1_BLUE) {
		if (l < 999) l++;
	}
	if (newKeys & KEY_1_RED) {
		if (l > 0) l--;
	}
	if (newKeys & KEY_2_BLUE) {
		if (r < 999) r++;
	}
	if (newKeys & KEY_2_RED) {
		if (r > 0) r--;
	}
	showNumber(LEFT_POSITION, l);
	showNumber(RIGHT_POSITION, r);

//#define POWER_2  0x0000000010 // LE6
//#define POWER_1  0x0000000002 // LE8
	
	if (newKeys & POWER_2) setDigit(6, ledGRID[6] | LE6);
	else setDigit(6, ledGRID[6] & ~LE6);
	
	if (newKeys & POWER_1) setDigit(6, ledGRID[6] | LE8);
	else setDigit(6, ledGRID[6] & ~LE8);
	updateDisplay();

	
//	printf("0x%08lX\n", newKeys);
	delay(100);
}

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

 

alexey3
Offline
Зарегистрирован: 25.11.2017

Огромное спасибо ЕвгенийП Очень доходчиво и практично обьяснили и помогли !!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Кстати, будете смеяться, но так, как сейчас сделано, когда экранчик выключен, кнопки (увеличение/уменьшение) продолжают работать. Можете попробовать - выключите, нажмите кнопку, включите - будет новое значение :)

alexey3
Offline
Зарегистрирован: 25.11.2017

Забавно! Но мне потом всё равно дорабатывать мне отключение ещё и на силовую часть туда вводить

Так что когда доберусь до включения и отключения силовой части наверно тогда и отключу кнопки вместе с дисплеем

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я это в библиотеке предусмотрю.

alexey3
Offline
Зарегистрирован: 25.11.2017

там ещё и термодатчики желательно предусмотреть )) и чтобы цифры что на дисплейчиках обрабатывать можно было ))) И ето готовый проект инфракрасной станции почти будет или просто паяльной но хорошей станции на AT1628 или TM1628

alexey3
Offline
Зарегистрирован: 25.11.2017

В общем поменял я местами микросхемы теперь правая работает левая нет и таки определения другие стоят так как светодиоды отдельные не правильно работают и потенциометр не регулирует ничего ))) а дисплеи чётко показывают

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Может микросхема битая? Ну, Вы разбирайтесь. С позициями-то нет проблем, также их исследуем.

alexey3
Offline
Зарегистрирован: 25.11.2017

100% битая я ею на дня заменю

alexey3
Offline
Зарегистрирован: 25.11.2017

Здраствуйте Евгений В общем я тут немного всё усложнил и подключаю на место атмеги к плате плату ардуино и вот вопрос контакт AREF ссоеденять с таким же на месте атмеги (Atmega8l-8pu) ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю. Это зависит от того как и для чего Вы собираетесь ADC использовать.

alexey3
Offline
Зарегистрирован: 25.11.2017

ну ето продолжение истории с дисплеями только теперь ещё датчики и запуск силовых агрегатов нагревания через 0

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я тут допиливаю бибилотеку по мотивам наших прошлых изысканий. Скоро выложу. Будете проверять. А датчики - это уже другая опера :)

alexey3
Offline
Зарегистрирован: 25.11.2017

библиотека ето хорошо как только выложите начну проверять

alexey3
Offline
Зарегистрирован: 25.11.2017
#include <stdio.h>
//#include <math.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);
//
//  Подключение пинов
//  разъём отверстиями кверху и синей стороной шлейфа к себе, тогда рсапиновка:
//    GND 3,3V  CLK DIO STB OUT-IR  5V
//

#define PIN_DIO 6
#define PIN_CLK 5
#define PIN_STB 4 
#define PIN_DIO 9
#define PIN_CLK 8
#define PIN_STB 7

#define INIT_6x12 2
#define INIT_7x11 3

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

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

//
// Маски нажатых кнопок (слева направо)
//
//#define KEY_2_BLUE  0x00001000ul
//#define KEY_1_BLUE  0x00000200ul
//#define KEY_2_RED   0x00020000ul
//#define KEY_1_RED   0x00000010ul
/*
#define KEY_2_BLUE   0x0010000000
#define KEY_1_BLUE   0x0002000000
#define KEY_2_RED    0x0000020000
#define KEY_1_RED    0x1000000000
#define POWER_2  0x0000000010 // LE6
#define POWER_1  0x0000000002 // LE8
*/

//
// Подключено 5 "цифр". 
// 0-ая - это двоеточие, залействовано только два младших бита
// 1-4 - собственно цифры слева направо.
// В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой)
// и 7-ой бит под доплнительный символ (питание, конверт и т.п.) 
//
#define LE6 0x0001 // зел справа
#define LE5 0x0020 // красн справа
#define LE7 0x0040 // красн слева
#define LE8 0x0080 // зел. слева

#define SEG_A 0x0001
#define SEG_F 0x0002
#define SEG_B 0x0004
#define SEG_G 0x0008
#define SEG_C 0x0010
#define SEG_DP  0x0020
#define SEG_D 0x0040
#define SEG_E 0x0080


//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#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 = 7; // текущая яркость
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;  // нужно для сохранения яркости на время теста
//

//
//  Запись одиночной команды в 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);  // запись данных, автоматический адрес
  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
//
#define KEY_2_BLUE   1
#define KEY_1_BLUE   2
#define KEY_2_RED    4
#define KEY_1_RED    8
#define POWER_2  16
#define POWER_1  32

void readKeyData(uint8_t * data) {
  digitalWrite(PIN_STB, LOW);
  shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42);  // чтение данных
  pinMode(PIN_DIO, INPUT_PULLUP);
  delayMicroseconds(1);
  byte buffer[KEY_DATA_LENGTH];
  for (int i=0; i<KEY_DATA_LENGTH; i++) {
    buffer[i] = shiftIn(PIN_DIO, PIN_CLK, LSBFIRST);
  }
  pinMode(PIN_DIO, OUTPUT);
  digitalWrite(PIN_STB, HIGH);
  * data = 0;
  if (buffer[1] & 0x10) *data |= KEY_2_BLUE;
  if (buffer[1] & 0x02) *data |= KEY_1_BLUE;
  if (buffer[2] & 0x02) *data |= KEY_2_RED;
  if (buffer[0] & 0x10) *data |= KEY_1_RED;
  if (buffer[4] & 0x10) *data |= POWER_2;
  if (buffer[4] & 0x02) *data |= POWER_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;
}

//
//  Увеличить яркость на 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] = 3;
  ledGRID[1] = 0xFF;
  ledGRID[2] = 0xFF;
  ledGRID[3] = 0xFF;
  ledGRID[4] = 0xFF;
  updateDisplay();
  saveBrightness = setBrightness(8);
}
//
//  Восстановить экран после теста
//
void hideTest(void) {
  memcpy(ledGRID, saveGRID, sizeof(saveGRID));
  updateDisplay();
  setBrightness(saveBrightness);
}


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

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

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


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

#define LEFT_POSITION 3
#define RIGHT_POSITION  0

static inline void showNumber(const int8_t where, int num) {
  for (uint8_t i = where; i < where + 3; i++) {
    if (num == 0) {
      setDigit(i, i == where ? SYMBOL_0 : 0);
    } else {
      setDigit(i, digits[num % 10]);
      num  /= 10;
    }
  }
}

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

static int l = 20, r = 000;

#include <math.h>


int encoder = 127;
int payaln = 378;
int sting_tmp;
int fadeAmount = 1;
byte Sens_A1 = A1;
byte sting = 13;        
unsigned long currentTime;
unsigned long loopTime;
unsigned long timing;
const int enc_pin_A = 3;       
const int enc_pin_B = 2;      
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;

void setup(void) {
  stdout = serial_stream; // эта строка первая в setup
  Serial.begin(115200);
  //
  // Инициализация пинов
  pinMode(PIN_CLK, OUTPUT);
  pinMode(PIN_DIO, OUTPUT);
  pinMode(PIN_STB, OUTPUT);
  pinMode(A0, INPUT_PULLUP);      //сенсор стола
  pinMode(Sens_A1, INPUT_PULLUP); //сенсор паяльника
  pinMode(sting, OUTPUT);
  digitalWrite(PIN_STB, HIGH);
  digitalWrite(PIN_CLK, HIGH);

  //
  // Инициализация экрана
  writeSingleCommand(INIT_7x11); // Режим отображения (1 и 2 - ничего не меняется)
  setBrightness(currentBrightness);
  //
//  // Пишем на экране слово ПОПА
//  setDigit(3, SYMBOL_rP);
//  setDigit(2, SYMBOL_0);
//  setDigit(1, SYMBOL_rP);
//  setDigit(0, SYMBOL_A);
//  updateDisplay();
//  //
//  // Даём 5 секунд полюбоваться
//  delay(1000);
//  //
//  // Рисуем нулевое время
//  showClock(0, 0);
//  updateDisplay();
//
  showNumber(LEFT_POSITION, l);
  showNumber(RIGHT_POSITION, r);
  updateDisplay();
//  delay(5000);
//  showNumber(LEFT_POSITION, 0);
//  showNumber(RIGHT_POSITION, 3);
//  updateDisplay();
//  delay(5000);
//  showNumber(LEFT_POSITION, 21);
//  showNumber(RIGHT_POSITION, 1);
//  updateDisplay();
//  delay(5000);
//  showNumber(LEFT_POSITION, 666);
//  showNumber(RIGHT_POSITION, 321);
//  updateDisplay();
//  delay(5000);
//  
//  printf("Press key\n");

// Настрийки для энкодера

pinMode(enc_pin_A, INPUT_PULLUP);
pinMode(enc_pin_B, INPUT_PULLUP);
currentTime = millis();
loopTime = currentTime;

}

void loop(void) {
  
  uint8_t newKeys;
  readKeyData(& newKeys);
  
#define KEY_2_BLUE   1
#define KEY_1_BLUE   2
#define KEY_2_RED    4
#define KEY_1_RED    8
#define POWER_2  16
#define POWER_1  32

  if (millis() - timing > 75){
    
  if (newKeys & KEY_1_BLUE) {
    if (l < 480) l++;
  }
  if (newKeys & KEY_1_RED) {
    if (l > 20) l--;
  }
  if (newKeys & KEY_2_BLUE) {
    if (r < 999) r++;
  }
  if (newKeys & KEY_2_RED) {
    if (r > 0) r--;
  }

  timing = millis();
}

  ENCODER(); //процедура опроса энкодера
//  STING();   //процедура нагрева паяльника

  if (newKeys == 0x00000020){
    STING();   //процедура нагрева паяльника
   }
  if (newKeys == 0x00000030){
    STING();   //процедура нагрева паяльника
//  FEN();     //процедура нагрева фена
   }
  if (newKeys == 0x00000000){
    payaln = 378;
    l = 20;
   }
  if (newKeys == 0x00000010){
    payaln = 378;
    l = 20;
   }

  showNumber(LEFT_POSITION, l);
  showNumber(RIGHT_POSITION, encoder);   //r

  
//#define POWER_2  0x0000000010 // LE6
//#define POWER_1  0x0000000002 // LE8
  
 if (newKeys & POWER_2) setDigit(6, ledGRID[6] | LE6);
 else {
  setDigit(6, ledGRID[6] & ~LE6);
  setDigit(0, 0);
  setDigit(1, 0);
  setDigit(2, 0);
 }
  
  if (newKeys & POWER_1)
  setDigit(6, ledGRID[6] | LE8); //
  
  else
 {
  setDigit(6, ledGRID[6] & ~LE6);
  setDigit(3, 0);
  setDigit(4, 0);
  setDigit(5, 0);
 }
  updateDisplay();

    Serial.println();
    Serial.print(" Pay_Disp: ");    
    Serial.print(l);
    Serial.print(" | Payalnik: ");    
    Serial.print(payaln);
    Serial.print(" | Pay_Sensor: ");    
    Serial.print(sting_tmp);
    Serial.print(" | Encoder: ");    
    Serial.print(encoder);
    
    printf("0x%08lX\n", newKeys);

//  delay(100);
}

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

///// Мало нам веселья!

void ENCODER()    //Процедура опроса энкодера
{
  currentTime = millis();
  if(currentTime >= (loopTime + 3))
   {
    encoder_A = digitalRead(enc_pin_A);
    encoder_B = digitalRead(enc_pin_B);   
    if((!encoder_A) && (encoder_A_prev))
     {
      if(encoder_B)
     {
      if(encoder + fadeAmount <= 255)
      encoder += fadeAmount;               
     }   
     else
     {
      if(encoder - fadeAmount >= 0)
      encoder -= fadeAmount;               
     }   
   }   
  encoder_A_prev = encoder_A;
  loopTime = currentTime;
 }
}

void STING()
{
  sting_tmp = analogRead(Sens_A1);
  payaln = map(l, 20, 400, 378, 320);

  if (sting_tmp > payaln)
   {
    analogWrite(sting, 1022);
   }
  else
   {
    digitalWrite(sting, HIGH); 
   }
}

void FEN()
{
}

ВОт кое что наваяли

Имикросхему драйвера поставил  и энкодер опрашивается но не всё работает

В частности не рулят кнопки на пинах 9 8 7 и не можем разобратся как погасить диоды

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А на левой половине (на которой мы отлаживались) всё по-прежнему нормально?

alexey3
Offline
Зарегистрирован: 25.11.2017

в том то и дело что чтобы энкодер наладить переместил микросхему туда на правую и там отладили

и теперь левая не работают кнопки ) и дисплеи паралельно естественно показывают

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Блин, ну Вы так не шутите. У меня тут библиотека готова (только тесты осталось написать). Но это имеет смысл, если аппаратно всё работает. Оно же работало у нас!

alexey3
Offline
Зарегистрирован: 25.11.2017

Аппаратно всё работает если я пины в коде поменяю и удалю 3 пина что добавил то всё будет работать.

Вы наверно ваш изменённый мною скетч не смотрели, я скинул его

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что там изменено? Пины как раз поменяны?

alexey3
Offline
Зарегистрирован: 25.11.2017

Там добавлено там теперь паяльник включается и температура ставится , энкодер опрашивается, вот а как подключить одновременно 2 spi я так и не додумался, если прописать вашь готовый скетчь то всё работает как и было

alexey3
Offline
Зарегистрирован: 25.11.2017

Здраствуйте Евгений прилагаю код понимаю что у меня подключено по i2c 2 устройства отдельно но они не хотят совместно работать помогите распутать сей клубок код прилагаю за ошибки не ругайте

#include <stdio.h>
//#include <math.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);
//
//  Подключение пинов
//  разъём отверстиями кверху и синей стороной шлейфа к себе, тогда рсапиновка:
//    GND 3,3V  CLK DIO STB OUT-IR  5V
//

#define PIN_DIO 9
#define PIN_CLK 8
#define PIN_STB 7

#define PIN_DIO1 6  // 
#define PIN_CLK1 5  //  > ето я добавляю вторую группу дисплеев и кнопок по i2c - но ничего не выходит
#define PIN_STB1 4  // /

#define INIT_6x12 2
#define INIT_7x11 3

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

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

//
// Маски нажатых кнопок (слева направо)
//
//#define KEY_2_BLUE  0x00001000ul
//#define KEY_1_BLUE  0x00000200ul
//#define KEY_2_RED   0x00020000ul
//#define KEY_1_RED   0x00000010ul
/*
#define KEY_2_BLUE   0x0010000000
#define KEY_1_BLUE   0x0002000000
#define KEY_2_RED    0x0000020000
#define KEY_1_RED    0x1000000000
#define POWER_2  0x0000000010 // LE6
#define POWER_1  0x0000000002 // LE8
*/

//
// Подключено 5 "цифр". 
// 0-ая - это двоеточие, залействовано только два младших бита
// 1-4 - собственно цифры слева направо.
// В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой)
// и 7-ой бит под доплнительный символ (питание, конверт и т.п.) 
//
#define LE6 0x0008 // зел справа
#define LE5 0x0020 // красн справа
#define LE7 0x0040 // красн слева
#define LE8 0x0080 // зел. слева
//#define LE4 0x0040

#define SEG_A 0x0001
#define SEG_F 0x0002
#define SEG_B 0x0004
#define SEG_G 0x0008
#define SEG_C 0x0010
#define SEG_DP  0x0020
#define SEG_D 0x0040
#define SEG_E 0x0080


//
// Символы (цифры / буквы, можно ещё добавить всяких)
//
#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 = 7; // текущая яркость
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;  // нужно для сохранения яркости на время теста
//

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



//  digitalWrite(PIN_STB1, LOW);
//  shiftOut(PIN_DIO1, PIN_CLK1, LSBFIRST, command);
//  digitalWrite(PIN_STB1, HIGH);
//  delayMicroseconds(1); // Пауза до следующей команды
}

//
//  Запись состояния дисплея в TM1668
//
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);

    shiftOut(PIN_DIO1, PIN_CLK1, LSBFIRST, 0xC0); // Установка адреса в 0
//  uint8_t * p = (uint8_t *) ledGRID;
// for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) shiftOut(PIN_DIO1, PIN_CLK1, LSBFIRST, *p); // запись данных
  digitalWrite(PIN_STB1, HIGH);
//  updateDisplay();
  delayMicroseconds(1); // Пауза до следующей команды
}

//
//  Чтение состояния кнопок с TM1668
//
#define KEY_2_BLUE   1
#define KEY_1_BLUE   2
#define KEY_2_RED    4
#define KEY_1_RED    8
#define POWER_2  16
#define POWER_1  32
#define POWER_3  64

void readKeyData(uint8_t * data) {
  digitalWrite(PIN_STB, LOW);
  shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42);  // чтение данных
  pinMode(PIN_DIO, INPUT_PULLUP);
  delayMicroseconds(1);
  byte buffer[KEY_DATA_LENGTH];
  for (int i=0; i<KEY_DATA_LENGTH; i++) {
    buffer[i] = shiftIn(PIN_DIO, PIN_CLK, LSBFIRST);
  }
  pinMode(PIN_DIO, OUTPUT);
  digitalWrite(PIN_STB, HIGH);
  * data = 0;
  if (buffer[1] & 0x10) *data |= KEY_2_BLUE;
  if (buffer[1] & 0x02) *data |= KEY_1_BLUE;
  if (buffer[2] & 0x02) *data |= KEY_2_RED;
  if (buffer[0] & 0x10) *data |= KEY_1_RED;
  if (buffer[4] & 0x10) *data |= POWER_2;
  if (buffer[4] & 0x02) *data |= POWER_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;
}

//
//  Увеличить яркость на 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] = 3;
  ledGRID[1] = 0xFF;
  ledGRID[2] = 0xFF;
  ledGRID[3] = 0xFF;
  ledGRID[4] = 0xFF;
  updateDisplay();
  saveBrightness = setBrightness(8);
}
//
//  Восстановить экран после теста
//
void hideTest(void) {
  memcpy(ledGRID, saveGRID, sizeof(saveGRID));
  updateDisplay();
  setBrightness(saveBrightness);
}


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

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

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


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

#define LEFT_POSITION 3
#define RIGHT_POSITION  0

static inline void showNumber(const int8_t where, int num) {
  for (uint8_t i = where; i < where + 3; i++) {
    if (num == 0) {
      setDigit(i, i == where ? SYMBOL_0 : 0);
    } else {
      setDigit(i, digits[num % 10]);
      num  /= 10;
    }
  }
}

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

static int l = 20, r = 000;

#include <math.h>


int encoder = 127;
int payaln = 378;
int sting_tmp;
int fadeAmount = 1;
byte Sens_A1 = A1;
byte sting = 13;        
unsigned long currentTime;
unsigned long loopTime;
unsigned long timing;
const int enc_pin_A = 3;       
const int enc_pin_B = 2;      
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;

void setup(void) {
  stdout = serial_stream; // эта строка первая в setup
  Serial.begin(115200);
  //
  // Инициализация пинов
  pinMode(PIN_CLK, OUTPUT);
  pinMode(PIN_DIO, OUTPUT);
  pinMode(PIN_STB, OUTPUT);

/*
  pinMode(PIN_CLK1, OUTPUT);//
  pinMode(PIN_DIO1, OUTPUT);//   я добавил
  pinMode(PIN_STB1, OUTPUT);//
  digitalWrite(PIN_STB1, HIGH);
  digitalWrite(PIN_CLK1, HIGH);
*/  
  pinMode(A0, INPUT_PULLUP);      //сенсор стола
  pinMode(Sens_A1, INPUT_PULLUP); //сенсор паяльника
  pinMode(sting, OUTPUT);
  digitalWrite(PIN_STB, HIGH);
  digitalWrite(PIN_CLK, HIGH);


//  digitalWrite(PIN_STB1, HIGH);  //я добавил
//  digitalWrite(PIN_CLK1, HIGH);  //
  

  //
  // Инициализация экрана
  writeSingleCommand(INIT_7x11); // Режим отображения (1 и 2 - ничего не меняется)
  setBrightness(currentBrightness);
  //
//  // Пишем на экране слово ПОПА
//  setDigit(3, SYMBOL_rP);
//  setDigit(2, SYMBOL_0);
//  setDigit(1, SYMBOL_rP);
//  setDigit(0, SYMBOL_A);
//  updateDisplay();
//  //
//  // Даём 5 секунд полюбоваться
//  delay(1000);
//  //
//  // Рисуем нулевое время
//  showClock(0, 0);
//  updateDisplay();
//
  showNumber(LEFT_POSITION, l);
  showNumber(RIGHT_POSITION, r);
  updateDisplay();
//  delay(5000);
//  showNumber(LEFT_POSITION, 0);
//  showNumber(RIGHT_POSITION, 3);
//  updateDisplay();
//  delay(5000);
//  showNumber(LEFT_POSITION, 21);
//  showNumber(RIGHT_POSITION, 1);
//  updateDisplay();
//  delay(5000);
//  showNumber(LEFT_POSITION, 666);
//  showNumber(RIGHT_POSITION, 321);
//  updateDisplay();
//  delay(5000);
//  
//  printf("Press key\n");

// Настрийки для энкодера

pinMode(enc_pin_A, INPUT_PULLUP);
pinMode(enc_pin_B, INPUT_PULLUP);
currentTime = millis();
loopTime = currentTime;

}

void loop(void) {
  
  uint8_t newKeys;
  readKeyData(& newKeys);
  
#define KEY_2_BLUE   1
#define KEY_1_BLUE   2
#define KEY_2_RED    4
#define KEY_1_RED    8
#define POWER_2  16
#define POWER_1  32

  if (millis() - timing > 75){
    
  if (newKeys & KEY_1_BLUE) {
    if (l < 480) l++;
  }
  if (newKeys & KEY_1_RED) {
    if (l > 20) l--;
  }
  if (newKeys & KEY_2_BLUE) {
    if (r < 999) r++;
  }
  if (newKeys & KEY_2_RED) {
    if (r > 0) r--;
  }

  timing = millis();
}

  ENCODER(); //процедура опроса энкодера

  if (newKeys == 0x00000020){
    STING();   //процедура нагрева паяльника
   }
  if (newKeys == 0x00000030){
    STING();   //процедура нагрева паяльника
//  FEN();     //процедура нагрева фена
//  STOL();    //процедура нагрева стола
//  LAMPA();    //процедура нагрева ВЕРХНЕГО НАГРЕВАТЕЛЯ   
   }
  if (newKeys == 0x00000000){
    payaln = 378;
    l = 20;
   }
  if (newKeys == 0x00000010){
    payaln = 378;
    l = 20;
   }

  showNumber(LEFT_POSITION, l);
  showNumber(RIGHT_POSITION, encoder);   //r

  
  //#define POWER_2  0x0000000010 // LE6
//#define POWER_1  0x0000000002 // LE8

//  if ()
//  {
//   setDigit(6, ledGRID[6] | LE7); //
//  }
/* else
 {
  setDigit(6, ledGRID[6]); // & ~LE7
  setDigit(0, 0);
  setDigit(1, 0);
  setDigit(2, 0);
 }
*/
  if (newKeys & POWER_1)
  setDigit(6, ledGRID[6] | LE6); //
  else
 {
  setDigit(6, ledGRID[6] & ~LE6);
  setDigit(3, 0);
  setDigit(4, 0);
  setDigit(5, 0);
 }
  updateDisplay();

    if (newKeys & POWER_2)
  setDigit(6, ledGRID[6] | LE5); //
  else
 {
  setDigit(6, ledGRID[6] & ~LE5);
  setDigit(0, 0);
  setDigit(1, 0);
  setDigit(2, 0);
 }
 //saveBrightness = setBrightness(0);
  updateDisplay();

    Serial.println();
    Serial.print(" Pay_Disp: ");    
    Serial.print(l);
    Serial.print(" | Payalnik: ");    
    Serial.print(payaln);
    Serial.print(" | Pay_Sensor: ");    
    Serial.print(sting_tmp);
    Serial.print(" | Encoder: ");    
    Serial.print(encoder);
    
//    printf("0x%08lX\n", newKeys);

//  delay(100);
}

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

///// Мало нам веселья!

void ENCODER()    //Процедура опроса энкодера
{
  currentTime = millis();
  if(currentTime >= (loopTime + 3))
   {
    encoder_A = digitalRead(enc_pin_A);
    encoder_B = digitalRead(enc_pin_B);   
    if((!encoder_A) && (encoder_A_prev))
     {
      if(encoder_B)
     {
      if(encoder + fadeAmount <= 255)
      encoder += fadeAmount;               
     }   
     else
     {
      if(encoder - fadeAmount >= 0)
      encoder -= fadeAmount;               
     }   
   }   
  encoder_A_prev = encoder_A;
  loopTime = currentTime;
 }
}

void STING()
{
  sting_tmp = analogRead(Sens_A1);
  payaln = map(l, 20, 400, 378, 330);

  if (sting_tmp > payaln)
   {
    analogWrite(sting, 768);
    setDigit(6, ledGRID[6] | LE7);
    updateDisplay();
   }
  if (sting_tmp <= payaln)
   {
    digitalWrite(sting, HIGH);
    setDigit(6, ledGRID[6] | LE7);
    updateDisplay();
   }
}

void FEN()
{
}
/*static int l = 20, r = 000;

#include <math.h>


int encoder1 = 127;
int payaln1 = 378;
int sting_tmp1;
int fadeAmount1 = 1;
byte Sens_A2 = A2;
byte sting1 = 13;        
unsigned long currentTime1;
unsigned long loopTime1;
unsigned long timing1;
const int enc_pin_A1 = 3;       
const int enc_pin_B1 = 2;      
unsigned char encoder_A1;
unsigned char encoder_B1;
unsigned char encoder_A_prev1=0;

void setup(void){
  stdout1 = serial_stream1; // эта строка первая в setup
  Serial.begin(115200);
  //
  // Инициализация пинов
  pinMode(PIN_CLK1, OUTPUT);
  pinMode(PIN_DIO1, OUTPUT);
  pinMode(PIN_STB1, OUTPUT);


  pinMode(PIN_CLK1, OUTPUT);//
  pinMode(PIN_DIO1, OUTPUT);//   я добавил
  pinMode(PIN_STB1, OUTPUT);//
  digitalWrite(PIN_STB1, HIGH);
  digitalWrite(PIN_CLK1, HIGH);
  
  pinMode(A0, INPUT_PULLUP);      //сенсор стола
  pinMode(Sens_A2, INPUT_PULLUP); //сенсор паяльника
  pinMode(sting1, OUTPUT);
  digitalWrite(PIN_STB1, HIGH);
  digitalWrite(PIN_CLK1, HIGH);


//  digitalWrite(PIN_STB1, HIGH);  //я добавил
//  digitalWrite(PIN_CLK1, HIGH);  //
  

  //
  // Инициализация экрана
  writeSingleCommand(INIT_7x11); // Режим отображения (1 и 2 - ничего не меняется)
  setBrightness(currentBrightness);
  //
//  // Пишем на экране слово ПОПА
//  setDigit(3, SYMBOL_rP);
//  setDigit(2, SYMBOL_0);
//  setDigit(1, SYMBOL_rP);
//  setDigit(0, SYMBOL_A);
//  updateDisplay();
//  //
//  // Даём 5 секунд полюбоваться
//  delay(1000);
//  //
//  // Рисуем нулевое время
//  showClock(0, 0);
//  updateDisplay();
//
  showNumber(LEFT_POSITION, l);
  showNumber(RIGHT_POSITION, r);
  updateDisplay();
//  delay(5000);
//  showNumber(LEFT_POSITION, 0);
//  showNumber(RIGHT_POSITION, 3);
//  updateDisplay();
//  delay(5000);
//  showNumber(LEFT_POSITION, 21);
//  showNumber(RIGHT_POSITION, 1);
//  updateDisplay();
//  delay(5000);
//  showNumber(LEFT_POSITION, 666);
//  showNumber(RIGHT_POSITION, 321);
//  updateDisplay();
//  delay(5000);
//  
//  printf("Press key\n");

// Настрийки для энкодера

pinMode(enc_pin_A1, INPUT_PULLUP);
pinMode(enc_pin_B1, INPUT_PULLUP);
currentTime = millis();
loopTime = currentTime1;

}

void loop(void) {
  
  uint8_t newKeys;
  readKeyData(& newKeys);
  
#define KEY_2_BLUE   1
#define KEY_1_BLUE   2
#define KEY_2_RED    4
#define KEY_1_RED    8
#define POWER_2  16
#define POWER_1  32

  if (millis() - timing > 75){
    
  if (newKeys & KEY_1_BLUE) {
    if (l < 480) l++;
  }
  if (newKeys & KEY_1_RED) {
    if (l > 20) l--;
  }
  if (newKeys & KEY_2_BLUE) {
    if (r < 999) r++;
  }
  if (newKeys & KEY_2_RED) {
    if (r > 0) r--;
  }

  timing = millis();
}

  ENCODER(); //процедура опроса энкодера

  if (newKeys == 0x00000020){
    STING();   //процедура нагрева паяльника
   }
  if (newKeys == 0x00000030){
    STING();   //процедура нагрева паяльника
//  FEN();     //процедура нагрева фена
//  STOL();    //процедура нагрева стола
//  LAMPA();    //процедура нагрева ВЕРХНЕГО НАГРЕВАТЕЛЯ   
   }
  if (newKeys == 0x00000000){
    payaln = 378;
    l = 20;
   }
  if (newKeys == 0x00000010){
    payaln = 378;
    l = 20;
   }

  showNumber(LEFT_POSITION1, l);
  showNumber(RIGHT_POSITION1, encoder);   //r

  
//#define POWER_2  0x0000000010 // LE6
//#define POWER_1  0x0000000002 // LE8

//  if ()
//  {
//   setDigit(6, ledGRID[6] | LE7); //
//  }
/* else
 {
  setDigit(6, ledGRID[6]); // & ~LE7
  setDigit(0, 0);
  setDigit(1, 0);
  setDigit(2, 0);
 }
*/
/*  if (newKeys & POWER_1)
  setDigit(6, ledGRID[6] | LE6); //
  else
 {
  setDigit(6, ledGRID[6] & ~LE6);
  setDigit(3, 0);
  setDigit(4, 0);
  setDigit(5, 0);
 }
  updateDisplay();

    Serial.println();
    Serial.print(" Pay_Disp: ");    
    Serial.print(l);
    Serial.print(" | Payalnik: ");    
    Serial.print(payaln);
    Serial.print(" | Pay_Sensor: ");    
    Serial.print(sting_tmp);
    Serial.print(" | Encoder: ");    
    Serial.print(encoder);
    
//    printf("0x%08lX\n", newKeys);

//  delay(100);
}

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

///// Мало нам веселья!

void ENCODER()    //Процедура опроса энкодера
{
  currentTime1 = millis();
  if(currentTime1 >= (loopTime1 + 3))
   {
    encoder_A1 = digitalRead(enc_pin_A);
    encoder_B1 = digitalRead(enc_pin_B);   
    if((!encoder_A) && (encoder_A_prev))
     {
      if(encoder_B)
     {
      if(encoder + fadeAmount <= 255)
      encoder += fadeAmount;               
     }   
     else
     {
      if(encoder - fadeAmount >= 0)
      encoder -= fadeAmount;               
     }   
   }   
  encoder_A_prev1 = encoder_A;
  loopTime1 = currentTime;
 }
}

void STING()
{
  sting_tmp = analogRead(Sens_A1);
  payaln = map(l, 20, 400, 378, 330);

  if (sting_tmp > payaln)
   {
    analogWrite(sting, 768);
    setDigit(6, ledGRID[6] | LE7);
    updateDisplay();
   }
  if (sting_tmp <= payaln)
   {
    digitalWrite(sting, HIGH);
    setDigit(6, ledGRID[6] | LE7);
    updateDisplay();
   }
}

void FEN()
{
}
*/

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Тебе запятых отсыпать? У меня их есть, могу поделица.

alexey3
Offline
Зарегистрирован: 25.11.2017

Это был пост ради поста , или запятых в коде не хватает ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Алексей, я сегодня выложу Вам готовую библиотеку (собственно она с неделю как готова, нет только тестового примера). Давайте её дожмём, чтобы она у Вас уже была, а потом будем смотреть на i2c и что там ещё.

alexey3
Offline
Зарегистрирован: 25.11.2017

Вся электроника уже в сборе. Я по своему незнанию толком и доработать ничего не могу. И вопросик сегодня ето во сколько ?

alexey3
Offline
Зарегистрирован: 25.11.2017

Вы во сколько сможете связатся со мной ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Возьмите архив - https://drive.google.com/file/d/1VfI8f4kTwDvBZTEoE0acxKK2WD75-64p/view?usp=sharing

2. В нём находится папка TM1628L

3. распакуйте так, чтобы эта папка оказалась в Вашей папке libraries (в прошлый раз мы туда помещали другую библиотеку).

4. Создайте вот такой скетч

#include <TM1628L.h>

#define	PIN_DIO	9
#define	PIN_CLK	8
#define	PIN_STB	7	

TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB);

static uint32_t oldMillis;

void testAllNumbers(void) {
	for (int i = 0; i < 1000; i++) {
		panel.leftPanel.setValue(i);
		panel.rightPanel.setValue(999 - i);
		panel.updateDisplay();
		delay(20);
	}
}

void setup(void) {
	Serial.begin(115200);
	panel.init();
	testAllNumbers();
	oldMillis = millis();
}

void loop(void) {
	const uint32_t curMillis = millis();
	if (curMillis - oldMillis >= 5000L) {
		oldMillis = curMillis;
		Serial.print("Left: ");
		Serial.print(panel.leftPanel.getValue());
		Serial.print(";  Right: ");
		Serial.println(panel.rightPanel.getValue());
	}
}

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

Если всё сделано правильно, он быдет компилироваться без ошибок. 

Убедитесь, что наш старый пример работает на текущем железе.

Вы там меняли какие-то коды. Найдите их в файле TM1628Symbols.h и также поменяйте.

Убедитесь, что скорость сериала в строке 21 такая же как у Вас в мониторе порта.  Включите Ваши тумбелры, чтобы дисплеи были включены. Запустите скетч. Скорее всего он повалится (мне проверять не на чем), но мы его дожмём - это не проблема.

По идее он должен делать два теста.

Тест №1.  Занимает 20 секунд. В левом жисплее цифры меняются с 0 до 999, а в правом в то же самое время с 999 до 0. Если этот тест заработал и с ним всё в порядке, закомментируйте строку 23, чтобы впредь он не запускался.

Тест №2. Начинается после теста №1. Раз в 5 секунд в сериал печаются значения, которые Вы видите на дисплее. При этом Вы можете менять значения кнопками, выключать дисплей и т.п. Значения должны печататься текущими. Если Вы нажмёте кнопку изменения значения и будете держать не отпуская, то изменение будет ускоряться. Сейчас там стоят огромные задержки, чтобы видно было, но потом Вы поставите такие, какие Вам нравятся.

===============

В общем, запускайтесь, смотрите, пробуйте, фиксируйте ошибки. Я буду доступен примерно через полчаса-минут сорок.

 

alexey3
Offline
Зарегистрирован: 25.11.2017

 1й тест в правом дисплее отлично в левом в последнем сегменте цифры  только в остальных 2х сегментах бардак

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
#include <TM1628L.h>

#define	PIN_DIO	9
#define	PIN_CLK	8
#define	PIN_STB	7	

TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB);

static uint32_t oldMillis;

void testAllNumbers(void) {
	for (int i = 0; i < 1000; i++) {
		panel.leftPanel.setValue(i);
		panel.rightPanel.setValue(999 - i);
		panel.updateDisplay();
		delay(20);
	}
}

void test1(void) {
	for (int i = 0; i < 7; i++) {
		panel.showSymbol(i, 0xff);
		delay(4000);
	}
}


void setup(void) {
	Serial.begin(115200);
	panel.init();
//	testAllNumbers();
	test1();
	oldMillis = millis();
}

void loop(void) {
	const uint32_t curMillis = millis();
	if (curMillis - oldMillis >= 5000L) {
		oldMillis = curMillis;
		Serial.print("Left: ");
		Serial.print(panel.leftPanel.getValue());
		Serial.print(";  Right: ");
		Serial.println(panel.rightPanel.getValue());
	}
}

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
void TM1628L::init(void) {
	writeSingleCommand(m_grid);
	clearScreenMemory();
	leftPanel.showNumber();
	rightPanel.showNumber();
	updateDisplay();
	setBrightness(m_CurrentBrightness);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
#include <TM1628L.h>

#define	PIN_DIO	9
#define	PIN_CLK	8
#define	PIN_STB	7	

TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB);

static uint32_t oldMillis;

void testAllNumbers(void) {
	for (int i = 0; i < 1000; i++) {
		panel.leftPanel.setValue(i);
		panel.rightPanel.setValue(999 - i);
		panel.updateDisplay();
		delay(20);
	}
}

void test1(void) {
	for (int i = 0; i < 7; i++) {
		panel.showSymbol(i, 0xff);
		panel.updateDisplay();
		delay(4000);
	}
}


void setup(void) {
	Serial.begin(115200);
	panel.init();
	delay(4000);
//	testAllNumbers();
//	test1();
	panel.updateDisplay();
	oldMillis = millis();
}

void loop(void) {
	const uint32_t curMillis = millis();
	if (panel.readKeys()) panel.updateDisplay();
	if (curMillis - oldMillis >= 5000L) {
		oldMillis = curMillis;
		Serial.print("Left: ");
		Serial.print(panel.leftPanel.getValue());
		Serial.print(";  Right: ");
		Serial.println(panel.rightPanel.getValue());
	}
}

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
#include <TM1628L.h>

#define PIN_DIO 6
#define PIN_CLK 5
#define PIN_STB 4
#define PIN_DIO1 9
#define PIN_CLK1 8
#define PIN_STB1 7


TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB);
TM1628L panel1 (PIN_DIO1, PIN_CLK1, PIN_STB1);

static uint32_t oldMillis;

void testAllNumbers(void) {
  for (int i = 0; i < 1000; i++) {
    panel.leftPanel.setValue(i);
    panel.rightPanel.setValue(999 - i);
    panel.updateDisplay();

    panel1.leftPanel.setValue(i);
    panel1.rightPanel.setValue(999 - i);
    panel1.updateDisplay();
    delay(20);
  }
}

void test1(void) {
  for (int i = 0; i < 7; i++) {
    panel.showSymbol(i, 0xff);
    panel.updateDisplay();
    delay(4000);
  }
}


void setup(void) {
  Serial.begin(115200);
  panel.init();
  panel1.init();
  delay(4000);
  testAllNumbers();
//  test1();

  oldMillis = millis();
}

void loop(void) {
  const uint32_t curMillis = millis();
  if (panel.readKeys()) panel.updateDisplay();
  if (curMillis - oldMillis >= 5000L) {
    oldMillis = curMillis;
    Serial.print("Left: ");
    Serial.print(panel.leftPanel.getValue());//getValue что в данных
    Serial.print(";  Right: ");
    Serial.println(panel.rightPanel.getValue());
  }
}

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


 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
uint8_t TM1628L::readKeyData(void) {
	digitalWrite(m_STB, LOW);
	shiftOut(m_DIO, m_CLK, LSBFIRST, 0x42);  // чтение данных
	pinMode(m_DIO, INPUT_PULLUP);
	delayMicroseconds(1);
	byte buffer[keyDataLength];
	for (int i=0; i < keyDataLength; i++) buffer[i] = shiftIn(m_DIO, m_CLK, LSBFIRST);
	pinMode(m_DIO, OUTPUT);
	digitalWrite(m_STB, HIGH);
	for (int i = 0; i < keyDataLength; i++) {
		Serial.print(buffer[i], HEX);
		Serial.print(' ');
	}
	Serial.println();
	m_lastKeys = 0;
	if (buffer[1] & 0x10) m_lastKeys |= KEY_2_BLUE;
	if (buffer[1] & 0x02) m_lastKeys |= KEY_1_BLUE;
	if (buffer[2] & 0x02) m_lastKeys |= KEY_2_RED;
	if (buffer[0] & 0x10) m_lastKeys |= KEY_1_RED;
	if (buffer[4] & 0x10) m_lastKeys |= POWER_2;
	if (buffer[4] & 0x02) m_lastKeys |= POWER_1;
	return m_lastKeys;
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Скетч

#include <TM1628L.h>

#define PIN_DIO 6
#define PIN_CLK 5
#define PIN_STB 4
#define PIN_DIO1 9
#define PIN_CLK1 8
#define PIN_STB1 7


TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB);
TM1628L panel1 (PIN_DIO1, PIN_CLK1, PIN_STB1);

static uint32_t oldMillis;

void testAllNumbers(void) {
  for (int i = 0; i < 1000; i++) {
    panel.leftPanel.setValue(i);
    panel.rightPanel.setValue(999 - i);
    panel.updateDisplay();

    panel1.leftPanel.setValue(i);
    panel1.rightPanel.setValue(999 - i);
    panel1.updateDisplay();
    delay(20);
  }
}

void test1(void) {
  for (int i = 0; i < 7; i++) {
    panel.showSymbol(i, 0xff);
    panel.updateDisplay();
    delay(4000);
  }
}


void setup(void) {
  Serial.begin(115200);
  panel.init();
  panel1.init();
  delay(4000);
//  testAllNumbers();
//  test1();
  oldMillis = millis();
}

void loop(void) {
  const uint32_t curMillis = millis();
  if (panel.readKeys()) panel.updateDisplay();
  if (panel1.readKeys()) panel1.updateDisplay();
  if (curMillis - oldMillis >= 5000L) {
    oldMillis = curMillis;
    Serial.print("Panel (Left: ");
    Serial.print(panel.leftPanel.getValue());//getValue что в данных
    Serial.print(";  Right: ");
    Serial.print(panel.rightPanel.getValue());
    Serial.print(")     Panel1 (Left: ");
    Serial.print(panel1.leftPanel.getValue());//getValue что в данных
    Serial.print(";  Right: ");
    Serial.print(panel1.rightPanel.getValue());
    Serial.println();
 }
}

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


Файл библиотеки TM1628L.cpp

#include <arduino.h>
#include "TM1628L.h"

const uint16_t TM1628L::digits[10] = { SYMBOL_0, SYMBOL_1, SYMBOL_2, SYMBOL_3, SYMBOL_4, SYMBOL_5, SYMBOL_6, SYMBOL_7, SYMBOL_8, SYMBOL_9 };


TM1628L::TM1628L(const uint8_t dio, const uint8_t clk, const uint8_t stb, const uint8_t brighness, const uint8_t grid) :
		m_DIO(dio), m_CLK(clk), m_STB(stb), m_grid(grid), m_CurrentBrightness(brighness), m_lastKeys(0) {
	pinMode(m_CLK, OUTPUT);
	pinMode(m_DIO, OUTPUT);
	pinMode(m_STB, OUTPUT);
	digitalWrite(m_STB, HIGH);
	digitalWrite(m_CLK, HIGH);
	leftPanel.setPanel(this);
	rightPanel.setPanel(this);
	leftPanel.init(3, POWER_1, KEY_1_BLUE, KEY_1_RED, LE8, LE7);
	rightPanel.init(0, POWER_2, KEY_2_BLUE, KEY_2_RED, LE6, LE5);
}

void TM1628L::init(void) {
	writeSingleCommand(m_grid);
	clearScreenMemory();
	leftPanel.showNumber();
	rightPanel.showNumber();
	updateDisplay();
	setBrightness(m_CurrentBrightness);
}

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

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

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

//
//	Чтение состояния кнопок с TM1628
//
uint8_t TM1628L::readKeyData(void) {
	digitalWrite(m_STB, LOW);
	shiftOut(m_DIO, m_CLK, LSBFIRST, 0x42);  // чтение данных
	pinMode(m_DIO, INPUT_PULLUP);
	delayMicroseconds(1);
	byte buffer[keyDataLength];
	for (int i=0; i < keyDataLength; i++) buffer[i] = shiftIn(m_DIO, m_CLK, LSBFIRST);
	pinMode(m_DIO, OUTPUT);
	digitalWrite(m_STB, HIGH);
	//for (int i = 0; i < keyDataLength; i++) {
	//	Serial.print(buffer[i], HEX);
	//	Serial.print(' ');
	//}
	//Serial.println();
	//delay(500);
	m_lastKeys = 0;
	if (buffer[1] & 0x10) m_lastKeys |= KEY_2_BLUE;
	if (buffer[1] & 0x02) m_lastKeys |= KEY_1_BLUE;
	if (buffer[2] & 0x02) m_lastKeys |= KEY_2_RED;
	if (buffer[0] & 0x10) m_lastKeys |= KEY_1_RED;
	if (buffer[4] & 0x10) m_lastKeys |= POWER_2;
	if (buffer[4] & 0x02) m_lastKeys |= POWER_1;
	return m_lastKeys;
}

//
//	Показать знак value в позиции position (0-6)
//
void TM1628L::showSymbol(const uint8_t position, const uint8_t value) {
	if (position > 6) return; // цифры у нас с 0-ой по 6-ую справа налево
	m_ledGRID[position] = value; 
}

//
//	Показать цифру value (0 - 9) в позиции position (0-5)
//
void TM1628L::showDigit(const uint8_t position, const uint8_t value) {
	if (position > 5 || value > 9) return; // цифры у нас с 0-ой по 5-ую справа налево, значения - 0-9
	m_ledGRID[position] = digits[value]; 
}

//
//	Зажечь (newState == true) или погасить (newState == false)
// светодиод led (LE5 - LE8)
// Возвращает прежнее состояние 
//
bool TM1628L::setLED(const ExtraLeds led, const bool newState) {
	const bool res = m_ledGRID[6] & led;
	if (newState) showSymbol(6, m_ledGRID[6] | led);
	showSymbol(6, m_ledGRID[6] & ~led);
	return res;
}


 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
#include <TM1628L.h>

#define PIN_DIO1 9
#define PIN_CLK1 8
#define PIN_STB1 7

TM1628L panel1 (PIN_DIO1, PIN_CLK1, PIN_STB1);

void setup(void) {
  Serial.begin(115200);
  panel1.init();
  panel1.showSymbol(6, 0xFF);
}

void loop(void) {}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
#include <TM1628L.h>

#define PIN_DIO1 9
#define PIN_CLK1 8
#define PIN_STB1 7

TM1628L panel1 (PIN_DIO1, PIN_CLK1, PIN_STB1);

void setup(void) {
  Serial.begin(115200);
  panel1.init();
  panel1.showSymbol(0, 0xFF);
  panel1.showSymbol(1, 0xFF);
  panel1.showSymbol(2, 0xFF);
  panel1.showSymbol(3, 0xFF);
  panel1.showSymbol(4, 0xFF);
  panel1.showSymbol(5, 0xFF);
  panel1.showSymbol(6, 0xFF);
  panel1.updateDisplay();
}

void loop(void) {}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
#include <TM1628L.h>

#define PIN_DIO 6
#define PIN_CLK 5
#define PIN_STB 4
#define PIN_DIO1 9
#define PIN_CLK1 8
#define PIN_STB1 7


TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB);
TM1628L panel1 (PIN_DIO1, PIN_CLK1, PIN_STB1, LGL, LGR);

static uint32_t oldMillis;

void testAllNumbers(void) {
  for (int i = 0; i < 1000; i++) {
    panel.leftPanel.setValue(i);
    panel.rightPanel.setValue(999 - i);
    panel.updateDisplay();

    panel1.leftPanel.setValue(i);
    panel1.rightPanel.setValue(999 - i);
    panel1.updateDisplay();
    delay(20);
  }
}

void test1(void) {
  for (int i = 0; i < 7; i++) {
    panel.showSymbol(i, 0xff);
    panel.updateDisplay();
    delay(4000);
  }
}


void setup(void) {
  Serial.begin(115200);
  panel.init();
  panel1.init();
  delay(4000);
//  testAllNumbers();
//  test1();
  oldMillis = millis();
}

void loop(void) {
  const uint32_t curMillis = millis();
  if (panel.readKeys()) panel.updateDisplay();
  if (panel1.readKeys()) panel1.updateDisplay();
  if (curMillis - oldMillis >= 5000L) {
    oldMillis = curMillis;
    Serial.print("Panel (Left: ");
    Serial.print(panel.leftPanel.getValue());//getValue что в данных
    Serial.print(";  Right: ");
    Serial.print(panel.rightPanel.getValue());
    Serial.print(")     Panel1 (Left: ");
    Serial.print(panel1.leftPanel.getValue());//getValue что в данных
    Serial.print(";  Right: ");
    Serial.print(panel1.rightPanel.getValue());
    Serial.println();
 }
}

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


 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
#include <TM1628L.h>

#define PIN_DIO 6
#define PIN_CLK 5
#define PIN_STB 4
#define PIN_DIO1 9
#define PIN_CLK1 8
#define PIN_STB1 7


TM1628L panel (PIN_DIO, PIN_CLK, PIN_STB);
TM1628L panel1 (PIN_DIO1, PIN_CLK1, PIN_STB1, LGL, LGR);

static uint32_t oldMillis;

void testAllNumbers(void) {
  for (int i = 0; i < 1000; i++) {
    panel.leftPanel.setValue(i);
    panel.rightPanel.setValue(999 - i);
    panel.updateDisplay();

    panel1.leftPanel.setValue(i);
    panel1.rightPanel.setValue(999 - i);
    panel1.updateDisplay();
    delay(20);
  }
}

void test1(void) {
  for (int i = 0; i < 7; i++) {
    panel.showSymbol(i, 0xff);
    panel.updateDisplay();
    delay(4000);
  }
}


void setup(void) {
  Serial.begin(115200);
  panel.init();
  panel1.init();
//  delay(4000);
//  testAllNumbers();
//  test1();
  oldMillis = millis();
}

void loop(void) {
  const uint32_t curMillis = millis();
  panel.setRedLeftLED(panel.leftPanel.getValue() > 250);
  panel.setRedRightLED(panel.rightPanel.getValue() > 200);
  panel.updateDisplay();
  //
  panel1.setRedLeftLED(panel1.leftPanel.getValue() > 150);
  panel1.setRedRightLED(panel1.rightPanel.getValue() > 100);
  panel1.updateDisplay();
  //
  if (panel.readKeys()) panel.updateDisplay();
  if (panel1.readKeys()) panel1.updateDisplay();
  if (curMillis - oldMillis >= 5000L) {
    oldMillis = curMillis;
    Serial.print("Panel (Left: ");
    Serial.print(panel.leftPanel.getValue());//getValue что в данных
    Serial.print(";  Right: ");
    Serial.print(panel.rightPanel.getValue());
    Serial.print(")     Panel1 (Left: ");
    Serial.print(panel1.leftPanel.getValue());//getValue что в данных
    Serial.print(";  Right: ");
    Serial.print(panel1.rightPanel.getValue());
    Serial.println();
 }
}

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


 

alexey3
Offline
Зарегистрирован: 25.11.2017

Здравствуйте ЕвгенийП И вот какая интересная штука выявилась Если с етим кодом включен монитор порта то значения держатся а если монитор выключить то они примерно через 10-15 секунд обнуляются )) Проверил delay нету нигде а где были закоментировал не помогло

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

С каким "етим кодом"? Моим? Или Вы добавили чего? И что значит обнуляются? Прямо на экране?

alexey3
Offline
Зарегистрирован: 25.11.2017

без каких либо дополнений, да прям на экране

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

Для начала убедитесь, что она именно перегружается. Сможете?

alexey3
Offline
Зарегистрирован: 25.11.2017

Как именно можно убедится  если включить монитор порта то он не перегружается

alexey3
Offline
Зарегистрирован: 25.11.2017

И вот ещё что выявилось если выкллючить выключатели на передней панели дисплеи загораются со значением 0

Кнопки не работают естественно

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Значит, давайте по-порядку.

1. Когда Вы питаете от USB оно работает, а когда питаете от "родного" питания в устройстве, оно иногда обнуляется. Значит, 90% проходит скачок по питанию (например, при включении нагрузки) и ардуина перегружается. Проверить это очень просто. Присоедините к ардуине какой-нибудь buzzer и вставьте в setup полусекундный писк. При запуске она пискнет. А потом, если при обнулении пискнет снова - значит действительно произошла перезагрузка. Проверьте.

2. Мы же с Вами выключали и всё было нормально? Или сейчас у Вас там нагрузка есть? Если так, то вполне может быть опять же "перезагрузка". Когда будете проверять п.1. Пощёлкайте и выключателем - если будет пищать, значит перезагрузка.

Если происходит  перезагрузка, то почти наверняка дело в питании. Если бы дело было в программе - она бы всегда обнулялалсь, хоть с USB, хоть без. Ну, совсем чтобы убедиться, запитайте ардуину не от USB, а  от совсем постороннего  БП (только земли соедините) и убедитесь.

Если подтвердится, что проблема в питании, это уже Ваша епархия - Вы же электронщик, а не я. Ставьте там конденсаторы, дроссели или чего там ещё положено, в общем обеспечьте стабильное питание.