Извините, это перебирать здесь
void showTest(void) {
memcpy(saveGRID, ledGRID, sizeof(saveGRID));
ledGRID[0] = 0x0ff0;
ledGRID[1] = 0x0FF0;
ledGRID[2] = 0x0FF0;
ledGRID[3] = 0x0FF0;
ledGRID[4] = 0x0FF0;
ledGRID[5] = 0x0FF0;
ledGRID[6] = 0x0FF0;
updateDisplay();
saveBrightness = setBrightness(4);
У Вас всего семь разрядов? При таком скетче все 7 сразу загораются всеми сегментами? Так?
У меня 4 разряда (4 цифры), двоеточие 6 добсимволов и да загорается все
Перепираю вот в этом вашем коде
#include <stdio.h>
static int serial_fputchar(const char ch, FILE *stream) { ((void*)stream); Serial.write(ch); return ch; }
static FILE *serial_stream = fdevopen(serial_fputchar, NULL);
#define PIN_DIO 2
#define PIN_CLK 3
#define PIN_STB 4
#define INIT_6x12 2
#define INIT_7x11 3
#define LED_DATA_LENGTH 14
//
// Глобальные переменные
//
#define ALL_LEDS 0x0ff0
static uint16_t ledGRID[LED_DATA_LENGTH / 2] = {// текущее состояние экрана
0x0200,
0,
0,
0,
0,
0,
0
};
static uint8_t currentBrightness = 1; // текущая яркость
//
// Запись одиночной команды в TM1628
//
void writeSingleCommand(const uint8_t command) {
digitalWrite(PIN_STB, LOW);
shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, command);
digitalWrite(PIN_STB, HIGH);
delayMicroseconds(1); // Пауза до следующей команды
}
//
// Запись состояния дисплея в TM1628
//
void updateDisplay(void) {
writeSingleCommand(0x40); // запись данных, автоматический адрес
digitalWrite(PIN_STB, LOW);
shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0xC0); // Установка адреса в 0
uint8_t * p = (uint8_t *) ledGRID;
for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p); // запись данных
digitalWrite(PIN_STB, HIGH);
delayMicroseconds(1); // Пауза до следующей команды
}
//
// Установить яркость от 0 (выключено) до 8
// (возвращает старую яркость)
//
static inline uint8_t setBrightness(const uint8_t newBrighness) {
const uint8_t res = currentBrightness;
currentBrightness = (newBrighness > 8) ? 8 : newBrighness;
if (currentBrightness == 0) writeSingleCommand(0x80); // Выключить дисплей
else writeSingleCommand(0x88 + (currentBrightness - 1)); // Установить яркость
return res;
}
void setup(void) {
stdout = serial_stream; // эта строка первая в setup
Serial.begin(115200);
//
// Инициализация пинов
pinMode(PIN_CLK, OUTPUT);
pinMode(PIN_DIO, OUTPUT);
pinMode(PIN_STB, OUTPUT);
digitalWrite(PIN_STB, HIGH);
digitalWrite(PIN_CLK, HIGH);
//
// Инициализация экрана
writeSingleCommand(INIT_6x12); // Режим отображения
setBrightness(currentBrightness);
//
// Выводим содержимое регистров
updateDisplay();
uint8_t *p = (uint8_t *)(&(ledGRID[0]));
for (int i = 0; i < 14; i++, p++) {
printf("0x%02X%c", *p, i % 2 ? '\n' : ' ');
}
}
void loop(void) {}
Тогда, для начала разберитесь кто из ledGRID[0-6]
лишний (может, и никто, но это надо проверить). Для этого присваивайте им по одному 0 (вместо 0x0ff0) и смотрите что погасло. Если при каком-то ledGRID[х]
не погасло ничего, значит он лишний - забудьте про него. А у тех, при которых что-то гаснет, запишите что именно. Так Вы узнаете, кто из ledGRID[x]
за что отвечает.
Следующим ходом перебирайте биты (как я писал выше). Все 8 битов. Так Вы узнаете какой бит отвечает за какой сегмент (спец. символ и т.п.). Для этого удобнее переписать так
void showTest(void) {
memcpy(saveGRID, ledGRID, sizeof(saveGRID));
const byte bt = 0x0FF0;
ledGRID[0] = bt;
ledGRID[1] = bt;
....
чтобы в одном месте менять.
Когда Вы всё это проделаете, Вы будете точно знать как зажечь нужную Вам комбинацию сегментов в любом разряде. Собственно и всё.
Нет все нужные. При каждом что-то гаснет. Сейчас перепираю.
Спасибо, что откликнулись.
Давайте. Вам нужно про все 7 элементов знать за что в них отвечает каждый бит. Тогда Вы легко и непринуждённо сможете зажечь всё, что угодно.
Получилась вот такая табличка
0x0020 play (0x0030)
0x0040 = a - 4 (0x0050)
0x0080 = a - 3 (0x0090)
0x0100 = a - 2 (0х0500)
0x0200 = a - 1 (0х0600)
0x0020 rec (0x0030)
0x0040 = b - 4 (0x0050)
0x0080 = b - 3 (0x0090)
0x0100 = b - 2 (0х0500)
0x0200 = b - 1 (0х0600)
0x0020 usb (0x0030)
0x0040 = c - 4 (0x0050)
0x0080 = c - 3 (0x0090)
0x0100 = c - 2 (0х0500)
0x0200 = c - 1 (0х0600)
0x0020 disc (0x0030)
0x0040 = d - 4 (0x0050)
0x0080 = d - 3 (0x0090)
0x0100 = d - 2 (0х0500)
0x0200 = d - 1 (0х0600)
0x0020 DP (0x0030)
0x0040 = e - 4 (0x0050)
0x0080 = e - 3 (0x0090)
0x0100 = e - 2 (0х0500)
0x0200 = e - 1 (0х0600)
0x0020 hdd (0x0030)
0x0040 = f - 4 (0x0050)
0x0080 = f - 3 (0x0090)
0x0100 = f - 2 (0х0500)
0x0200 = f - 1 (0х0600)
0x0020 lan (0x0030)
0x0040 = g - 4 (0x0050)
0x0080 = g - 3 (0x0090)
0x0100 = g - 2 (0х0500)
0x0200 = g - 1 (0х0600)
При этих значениях зажигается по одному сегменту в каждом разряде.
При значениях в скобках эффект аналогичный
Я не понимаю, что тут написано, поясните
я просто не знал как правильно это создавать,
0х0020 доп. сегмент “g”-это сегмент разряда “4” это № разряда
Я вставлял эти значения в каждую строчку
#define ALL_LEDS 0x0ff0
static uint16_t ledGRID[LED_DATA_LENGTH / 2] = {// текущее состояние экрана
0x0200,
0,
0,
0,
0,
0,
0
};
Либj я опять ничего не понял, либо тут что-то не так.
Давайте Вы распишете отдельно ledGRID[0]
(все остальные сделайте пока 0 - чтобы ничего лишнего не светилось). Что загорается при каждом бите? Примерно так (это только пример):
Биты ledGRID[0]
0x0010 - разр 1. сег. a
0x0020 - разр 1. сег. b
...
ledGRId[0]
0x0020 play доп. сег.
0x0040 = сег "a" разр 4
0x0080 = сег "a" разр 3
0x0100 = сег "a" разр 2
0x0200 = сег "a" разр 1
ledGRId[1]
0x0020 rec
0x0040 = сег "b" разр 4
0x0080 = сег "b" разр 3
0x0100 = сег "b" разр 2
0x0200 = сег "b" разр 1
ledGRId[2]
0x0020 usb
0x0040 =сег "c" разр 4
0x0080 =сег "c" разр 3
0x0100 =сег "c" разр 2
0x0200 =сег "c" разр 1
ledGRId[3]
0x0020 disc
0x0040 =сег "d" разр 4
0x0080 =сег "d" разр 3
0x0100 =сег "d" разр 2
0x0200 =сег "d" разр 1
ledGRId[4]
0x0020 dP
0x0040 =сег "e" разр 4
0x0080 =сег "e" разр 3
0x0100 =сег "e" разр 2
0x0200 =сег "e" разр 1
ledGRId[5]
0x0020 hdd
0x0040 =сег "f" разр 4
0x0080 =сег "f" разр 3
0x0100 =сег "f" разр 2
0x0200 =сег "f" разр 1
ledGRId[6]
0x0020 lan
0x0040 =сег "g" разр 4
0x0080 =сег "g" разр 3
0x0100 =сег "g" разр 2
0x0200 =сег "g" разр 1
В каждом ledGRID зажигается только по одному сегменту или “a”, “b” и т.д
А остальные три бита (0x0010, 0x0400, 0x0400)
Ни на что не влияют?
И ещё меня смутила dp. Она (десятичная точка) разве не у каждого разряда своя? Или что это?
Ну это я понял, значит я их перепутал и они транспонированы, но это нормально. С этим можно жить.
Ответьте там про dp. И доп. вопрос - сколько сегментов у разрядов? По семь a-g) или по 8 (a-g, десятичная точка).
Вы что-то говорили про двоеточие. Где оно в Вашей таблице?
при каких то значениях загорается сразу два сегмента в двух разряда.
При этих значениях загораются по одному сегменту
DP - это двоеточие
4 разряда с цифрами
При 0x0300 Зажигаются сегменты в 1 и 2 разряде
При 0x0070 Зажигаются сегмент в 4 разряде и доп символ