семисегментный индикатор от dvd
- Войдите на сайт для отправки комментариев
есть плата с кнопками и индикатором на pt6961 пробовал разные библиотеки результат один ...мусор
примеры где использется библиотека spi вообще ноль эмоций
методом тыка натыкал следущий код
// // Подключение пинов // разъём отверстиями кверху и синей стороной шлейфа к себе, тогда рсапиновка: // GND 3,3V CLK DIO STB OUT-IR 5V //TM1628 dvdLED(12, 11, 10); #define PIN_DIO 12 #define PIN_CLK 11 #define PIN_STB 10 int nn=2; int n1=201; // // Глобальные переменные // static uint16_t ledGRID[8]; // текущее состояние экрана static uint8_t currentBrightness = 6; // текущая яркость // Запись одиночной команды в 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) { for (int j = 0; j < 1000; j++) { 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 < 14; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p); // //digitalWrite(PIN_STB, HIGH); delayMicroseconds(1); // Пауза до следующей команды delay(100); }} // // // Установить яркость от 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; } // // Восстановить экран после теста // // // Показать цифру value (0-9) в позиции digit (1-4) // при этом, если у цифры горит дополнительный символ, сохраняем его // static inline void setData(int nn, int n1) { switch (n1) { case 0: ledGRID[0]=nn;ledGRID[1]=nn;ledGRID[2]=nn;ledGRID[3]=nn;ledGRID[4]=nn;ledGRID[5]=nn;ledGRID[6]=0;break; // case 1: Serial .begin(115200); Serial .println(1); ledGRID[0]=0;ledGRID[1]=nn;ledGRID[2]=nn;ledGRID[3]=0;ledGRID[4]=0;ledGRID[5]=0;ledGRID[6]=0;break; // case 2: ledGRID[0]=0;ledGRID[1]=nn;ledGRID[2]=0;ledGRID[3]=nn;ledGRID[4]=nn;ledGRID[5]=nn;ledGRID[6]=nn;break; // case 3: ledGRID[0]=0;ledGRID[1]=nn;ledGRID[2]=nn;ledGRID[3]=0;ledGRID[4]=nn;ledGRID[5]=nn;ledGRID[6]=nn;break; // case 4: ledGRID[0]=nn;ledGRID[1]=nn;ledGRID[2]=nn;ledGRID[3]=0;ledGRID[4]=0;ledGRID[5]=0;ledGRID[6]=nn;break; // case 5: ledGRID[0]=nn;ledGRID[1]=0;ledGRID[2]=nn;ledGRID[3]=0;ledGRID[4]=nn;ledGRID[5]=nn;ledGRID[6]=nn;break; // case 6: ledGRID[0]=nn;ledGRID[1]=0;ledGRID[2]=nn;ledGRID[3]=nn;ledGRID[4]=nn;ledGRID[5]=nn;ledGRID[6]=nn;break; // case 7: ledGRID[0]=0;ledGRID[1]=nn;ledGRID[2]=nn;ledGRID[3]=0;ledGRID[4]=nn;ledGRID[5]=0;ledGRID[6]=0;break; // case 8: ledGRID[0]=nn;ledGRID[1]=nn;ledGRID[2]=nn;ledGRID[3]=nn;ledGRID[4]=nn;ledGRID[5]=nn;ledGRID[6]=nn;break; // case 9: ledGRID[0]=nn;ledGRID[1]=nn;ledGRID[2]=nn;ledGRID[3]=0;ledGRID[4]=nn;ledGRID[5]=nn;ledGRID[6]=nn;break; // case 10: ledGRID[0]=0;ledGRID[1]=0;ledGRID[2]=1;ledGRID[3]=0;ledGRID[4]=0;ledGRID[5]=0;ledGRID[6]=0;break; // case 11: ledGRID[0]=0;ledGRID[1]=0;ledGRID[2]=0;ledGRID[3]=0;ledGRID[4]=0;ledGRID[5]=1;ledGRID[6]=0;break; // case 12: ledGRID[0]=0;ledGRID[1]=0;ledGRID[2]=0;ledGRID[3]=1;ledGRID[4]=0;ledGRID[5]=0;ledGRID[6]=0;break; // case 13: ledGRID[0]=1;ledGRID[1]=0;ledGRID[2]=0;ledGRID[3]=0;ledGRID[4]=0;ledGRID[5]=0;ledGRID[6]=0;break; // } } void setup(void) { // // Инициализация пинов pinMode(PIN_CLK, OUTPUT); pinMode(PIN_DIO, OUTPUT); pinMode(PIN_STB, OUTPUT); digitalWrite(PIN_STB, HIGH); digitalWrite(PIN_CLK, HIGH); // // Инициализация экрана writeSingleCommand(5); // Режим отображения (1 и 2 - ничего не меняется) setBrightness(currentBrightness); } void loop(void) { int dec; //setData(2,3); int sot=n1 / 100; setData(2,sot); updateDisplay(); if(sot>0) { sot=sot * 100; n1 =n1-sot; } sot=n1 / 10; setData(4,sot); if(sot>0) { sot=sot * 10; n1 =n1-sot; } updateDisplay(); delay(500); } ///// Всё! Веселье закончилось!
на индикаторе шесть цифр планировал использовать для термофена первые 3 цифры температура потом "-" две цифры обороты кулера
как организовать вывод этого на экран ? если вызывать updateDisplay(); после кажд цифры то преведущая тухнет а так for (int8_t i = 0; i < 14; i++, p++,s++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p|*s); горят обе но тут надо двумерный массив ? а как его потом обрабатывать? создовать 6 переменых типа "*p" и обновлять сразу все значения на экране? " i < 14; " а здесь почему 14 а не 7? по числу сегментов
Ужас! Как Вы над моим кодом поиздевались. Мама родная не узнает. Надо ж так!
преведущая тухнет
Так Вы ж её и гасите в строках 101-127. Не гасите, глядишь и не протухнет.
а здесь почему 14 а не 7? по числу сегментов
А хрен Вас знает, почему у Вас 14, должно быть 16 ( 8 из строки №19 умноженное на 2) и число сегментов тут ну абсолютно не при делах. Только вот нафига Вы забили так много, мне непонятно. Код то Вы брали не из оригинала, а из попытки натянуть его на железо какого-то парня, может он там накосячил (кстати, в оригинальном коде было 10, но через константу).
спасибо большое за ответ....извиняюсь за тот ужас что натворил с вашим кодом в попытках на тянуть на свое железо :)....проблема в том что эти строки 101-127 как раз его зажигают
это цифра один где "nn" это код цифры которая должна загорется (код 2,4,6 первая вторая третья) а "[1]","[2]" это это позиция черточки в этой цифре
и если я делаю так
то у меня загорится 1 во второй цифре
а если потом зделать вот так
то единица потухнет в первой цифре(будет помигивать) а во второй загорится
а если передать вот так
то будет гореть 11
Одно зажигают - другое гасят.....разжуйте пожалусто :)
Ну, Вы как-то странно к этому подходите. Вместо того, чтобы исследовать точное значение каждого бита, Вы пытаетесь решать проблему цифр методом тыка - так не работает, вечно будет что-то вылазить. Хотите сделать нормально, идите пошагово.
1. уберите нафиг все попытки выводить цифры
2. уберите, наконец всю самодеятельность про 14. В этом месте должно быть sizeof(ledGRID).
3. установите массив ledGRID полностью в 0 и выведите. Ничего не должно светиться.
4. устанавливайте в массиве единицу ledGRID в одном бите (все остальные должны быть нули) и выводите. Записывайте какой сегмент при этом загорелся (или никакой). Проделайте это для всех битов и Вы будете знать как зажечь конкретный сегмент. Если окажется (а это вполне вероятно), что в массиве ledGRID задействованы только первые N байтов, а остальные ничего не включают, можно уменьшить массив (отбросив ненужные байты), при этом в выводе по-прежнему будет sizeof(ledGRID) и это будет правильно.
5. Только тогда (когда Вы знаете как зажечь каждый сегмент) набирайте цифры из сегментов и, когда надо зажигать цифру - устанавливайте в 1 нужные биты (сегменты), но не трогайте остальные! Сейчас же Вы остальным присваиваете 0, вот оно у Вас и гаснет.
Можно, конечно, только непонятно что для Вас проще. Посмотрите мой оригинальный код. У меня вывод цифры занимает три строчки (251-254) а сами цифры определены дефайнами через сегменты (строки №61-70). Там же рядом, чуть ниже и буковки определены.
Но, может, Вам проще так, как у Вас.
Всегда проще ср#ть когда штаны сами спадают. Но если спадают - то и вопросов быть не может.
По Вашему коду и делал .... Только из другой темы. проблема в том что массив обрабатывается странно моим железом
ledGRID[1]=2;ledGRID[2]=2;break;
[1]-здесь сегмент который длжен зажется ....[1]=2 а где двойка там порядковый номер цифры которая должна зажется по этому такое извращение с двухмерным массивом...... в любом случае огромное вам спасибо за ваш код если бы не вы навряд ли я бы справился с этим экранчиком
А в вашем коде было наоборот ledGRID[1]=2;l где единица там порядковый номер цифры а где двойка там передаются сегменты которые должны загореться
И 14 а не 16 потому что у меня в цифре 7 сегментов (точки нет)