семисегментный индикатор от 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, вот оно у Вас и гаснет.
#define PIN_DIO 12 #define PIN_CLK 11 #define PIN_STB 10 int sot,dec,ones,nom; int num=201; // // Глобальные переменные // static uint16_t ledGRID[6][7]; // текущее состояние экрана 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) { uint8_t *a=(uint8_t *) ledGRID[0]; uint8_t *b=(uint8_t *) ledGRID[1]; uint8_t *c=(uint8_t *) ledGRID[2]; uint8_t *d=(uint8_t *) ledGRID[3]; uint8_t *e=(uint8_t *) ledGRID[4]; uint8_t *f=(uint8_t *) ledGRID[5]; 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++, a++,b++,c++,d++,e++,f++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *a|*b|*c|*d|*e|*f); // 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 kol, int cifr) { nom=kol; switch (kol) { case 0: kol=2;break; case 1: kol=4;break; case 2: kol=8;break; case 4: kol=32;break; case 5: kol=64;break; } ledGRID[3][0]=0;ledGRID[3][1]=0;ledGRID[3][2]=0;ledGRID[3][3]=0;ledGRID[3][4]=0;ledGRID[3][5]=0;ledGRID[3][6]=16; // switch (cifr) { case 0: ledGRID[nom][0]=kol;ledGRID[nom][1]=kol;ledGRID[nom][2]=kol;ledGRID[nom][3]=kol;ledGRID[nom][4]=kol;ledGRID[nom][5]=kol;ledGRID[nom][6]=0;break; // case 1: Serial .begin(115200); Serial .println(1); ledGRID[nom][0]=0;ledGRID[nom][1]=kol;ledGRID[nom][2]=kol;ledGRID[nom][3]=0;ledGRID[nom][4]=0;ledGRID[nom][5]=0;ledGRID[nom][6]=0;break; // case 2: ledGRID[nom][0]=0;ledGRID[nom][1]=kol;ledGRID[nom][2]=0;ledGRID[nom][3]=kol;ledGRID[nom][4]=kol;ledGRID[nom][5]=kol;ledGRID[nom][6]=kol;break; // case 3: ledGRID[nom][0]=0;ledGRID[nom][1]=kol;ledGRID[nom][2]=kol;ledGRID[nom][3]=0;ledGRID[nom][4]=kol;ledGRID[nom][5]=kol;ledGRID[nom][6]=kol;break; // case 4: ledGRID[nom][0]=kol;ledGRID[nom][1]=kol;ledGRID[nom][2]=kol;ledGRID[nom][3]=0;ledGRID[nom][4]=0;ledGRID[nom][5]=0;ledGRID[nom][6]=kol;break; // case 5: ledGRID[nom][0]=kol;ledGRID[nom][1]=0;ledGRID[nom][2]=kol;ledGRID[nom][3]=0;ledGRID[nom][4]=kol;ledGRID[nom][5]=kol;ledGRID[nom][6]=kol;break; // case 6: ledGRID[nom][0]=kol;ledGRID[nom][1]=0;ledGRID[nom][2]=kol;ledGRID[nom][3]=kol;ledGRID[nom][4]=kol;ledGRID[nom][5]=kol;ledGRID[nom][6]=kol;break; // case 7: ledGRID[nom][0]=0;ledGRID[nom][1]=kol;ledGRID[nom][2]=kol;ledGRID[nom][3]=0;ledGRID[nom][4]=kol;ledGRID[nom][5]=0;ledGRID[nom][6]=0;break; // case 8: ledGRID[nom][0]=kol;ledGRID[nom][1]=kol;ledGRID[nom][2]=kol;ledGRID[nom][3]=kol;ledGRID[nom][4]=kol;ledGRID[nom][5]=kol;ledGRID[nom][6]=kol;break; // case 9: ledGRID[nom][0]=kol;ledGRID[nom][1]=kol;ledGRID[nom][2]=kol;ledGRID[nom][3]=0;ledGRID[nom][4]=kol;ledGRID[nom][5]=kol;ledGRID[nom][6]=kol;break; // case 10: ledGRID[nom][0]=0;ledGRID[nom][1]=0;ledGRID[nom][2]=1;ledGRID[nom][3]=0;ledGRID[nom][4]=0;ledGRID[nom][5]=0;ledGRID[nom][6]=0;break; // case 11: ledGRID[nom][0]=0;ledGRID[nom][1]=0;ledGRID[nom][2]=0;ledGRID[nom][3]=0;ledGRID[nom][4]=0;ledGRID[nom][5]=1;ledGRID[nom][6]=0;break; // case 12: ledGRID[nom][0]=0;ledGRID[nom][1]=0;ledGRID[nom][2]=0;ledGRID[nom][3]=1;ledGRID[nom][4]=0;ledGRID[nom][5]=0;ledGRID[nom][6]=0;break; // case 13: ledGRID[nom][0]=1;ledGRID[nom][1]=0;ledGRID[nom][2]=0;ledGRID[nom][3]=0;ledGRID[nom][4]=0;ledGRID[nom][5]=0;ledGRID[nom][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) { //выделяем сотни sot=num/100; setData(0,sot); //выделяем десятки dec=(num-sot*100)/10; setData(1,dec); //выделяем единицы ones=num-sot*100-dec*10; setData(2,ones); setData(4,9); setData(5,9); updateDisplay(); } ///// Всё! Веселье закончилось!Можно, конечно, только непонятно что для Вас проще. Посмотрите мой оригинальный код. У меня вывод цифры занимает три строчки (251-254) а сами цифры определены дефайнами через сегменты (строки №61-70). Там же рядом, чуть ниже и буковки определены.
Но, может, Вам проще так, как у Вас.
Всегда проще ср#ть когда штаны сами спадают. Но если спадают - то и вопросов быть не может.
По Вашему коду и делал .... Только из другой темы. проблема в том что массив обрабатывается странно моим железом
ledGRID[1]=2;ledGRID[2]=2;break;
[1]-здесь сегмент который длжен зажется ....[1]=2 а где двойка там порядковый номер цифры которая должна зажется по этому такое извращение с двухмерным массивом...... в любом случае огромное вам спасибо за ваш код если бы не вы навряд ли я бы справился с этим экранчиком
А в вашем коде было наоборот ledGRID[1]=2;l где единица там порядковый номер цифры а где двойка там передаются сегменты которые должны загореться
И 14 а не 16 потому что у меня в цифре 7 сегментов (точки нет)