семисегментный индикатор от dvd

Stet
Offline
Зарегистрирован: 25.09.2019

есть плата с кнопками и индикатором на 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? по числу сегментов

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

Ужас! Как Вы над моим кодом поиздевались. Мама родная не узнает. Надо ж так!

Stet пишет:

преведущая тухнет

Так Вы ж её и гасите в строках 101-127. Не гасите, глядишь и не протухнет.

Stet пишет:

а здесь почему 14 а не 7? по числу сегментов

А хрен Вас знает, почему у Вас 14, должно быть 16 ( 8 из строки №19 умноженное на 2) и число сегментов тут ну абсолютно не при делах. Только вот нафига Вы забили так много, мне непонятно. Код то Вы брали не из оригинала, а из попытки натянуть его на железо какого-то парня, может он там накосячил (кстати, в оригинальном коде было 10, но через константу).

Stet
Offline
Зарегистрирован: 25.09.2019

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



case 1:
 ledGRID[1]=nn;ledGRID[2]=nn;break; 

это цифра один где "nn" это код цифры которая должна загорется (код 2,4,6 первая вторая третья) а "[1]","[2]" это это позиция черточки в этой цифре 

и если я делаю так 

ledGRID[1]=4;ledGRID[2]=4;break; 
uint8_t * p = (uint8_t *) ledGRID;
for (int8_t i = 0; i < 14; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p); //

то у меня загорится 1 во второй цифре

а если потом зделать вот так 

ledGRID[1]=2;ledGRID[2]=2;break; 
uint8_t * p = (uint8_t *) ledGRID;
for (int8_t i = 0; i < 14; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p); //

то единица потухнет в первой цифре(будет помигивать) а во второй загорится

а если передать вот так

leD[1]=2;ledGRID[2]=2;break;
ledGRID[1]=2;ledGRID[2]=2;break; 
uint8_t * p = (uint8_t *) ledGRID;
uint8_t * s = (uint8_t *) leD;
for (int8_t i = 0; i < 14; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p|s); //

то будет гореть 11

 

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

Stet пишет:
как раз его зажигают
Одно зажигают - другое гасят. Да, и зажигают как-то странно.

Stet
Offline
Зарегистрирован: 25.09.2019

Одно зажигают - другое гасят.....разжуйте пожалусто :)

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

Ну, Вы как-то странно к этому подходите. Вместо того, чтобы исследовать точное значение каждого бита, Вы пытаетесь решать проблему цифр методом тыка - так не работает, вечно будет что-то вылазить. Хотите сделать нормально, идите пошагово.

1. уберите нафиг все попытки выводить цифры
2. уберите, наконец всю самодеятельность про 14. В этом месте должно быть sizeof(ledGRID).
3. установите массив ledGRID полностью в 0 и выведите. Ничего не должно светиться.
4. устанавливайте в массиве единицу ledGRID в одном бите (все остальные должны быть нули) и выводите. Записывайте какой сегмент при этом загорелся (или никакой). Проделайте это для всех битов и Вы будете знать как зажечь конкретный сегмент. Если окажется (а это вполне вероятно), что в массиве ledGRID задействованы только первые N байтов, а остальные ничего не включают, можно уменьшить массив (отбросив ненужные байты), при этом в выводе по-прежнему будет sizeof(ledGRID) и это будет правильно.
5. Только тогда (когда Вы знаете как зажечь каждый сегмент) набирайте цифры из сегментов и, когда надо зажигать цифру - устанавливайте в 1 нужные биты (сегменты), но не трогайте остальные! Сейчас же Вы остальным присваиваете 0, вот оно у Вас и гаснет.

Stet
Offline
Зарегистрирован: 25.09.2019




#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();  
  }

///// Всё! Веселье закончилось!
 
вот так все работает .....выводит 201-99..... чувствую что можно сделать  проще :)
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Можно, конечно, только непонятно что для Вас проще. Посмотрите мой оригинальный код. У меня вывод цифры занимает три строчки (251-254) а сами цифры определены дефайнами через сегменты (строки №61-70). Там же рядом, чуть ниже и буковки определены.

Но, может, Вам проще так, как у Вас.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Всегда проще ср#ть когда штаны сами спадают. Но если спадают - то и вопросов быть не может. 

Stet
Offline
Зарегистрирован: 25.09.2019

По Вашему коду и делал .... Только из другой темы. проблема в том что массив обрабатывается странно моим железом
ledGRID[1]=2;ledGRID[2]=2;break;
[1]-здесь сегмент который длжен зажется ....[1]=2 а где двойка там порядковый номер цифры которая должна зажется по этому такое извращение с двухмерным массивом...... в любом случае огромное вам спасибо за ваш код если бы не вы навряд ли я бы справился с этим экранчиком

Stet
Offline
Зарегистрирован: 25.09.2019

А в вашем коде было наоборот ledGRID[1]=2;l где единица там порядковый номер цифры а где двойка там передаются сегменты которые должны загореться

Stet
Offline
Зарегистрирован: 25.09.2019

И 14 а не 16 потому что у меня в цифре 7 сегментов (точки нет)