RE:7 сегментный дисплей от DVD на контроллере ТМ 1628

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

//По случаю попал мне дисплей от DVD на контроллере TM1628, решил подключить к arduine, покопался в примерах,
//пошерстил форум, кое-что нарыл, но меня это не устроило. Решил написать скетч, вот что получилось: 
//выводит на дисплей 4 цифры в режиме счёта от 0 до 9999.
//Код работает. В программировании на Си новичок, был знаком  с Ассемблером.  Может  кто знает
//Более простой код.



// тест для дисплея от DVD на контроллере TM1628 IC
// www.blockduino.org

const int dataPin = 9;   // VDIO
const int clockPin = 8;  // VCLK
const int strobePin = 7; // VSTR
const int intensity = 2; // яркость 0-7

   byte led[14]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//массив дисплея
  
 void setup() {
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(strobePin, OUTPUT);

 }
 void loop (){
   long x=0L;//               число для записи в дисплей
   for(long x=0; x<9999; x++){// 
  for(int i=0; i<14; i++){//  очистка дисплея
    led[i]=0x00;
  }

  delay (30);
  //              разбивка числа на цифры для формирования массива
  byte  n1=x/1000;//    1-я цифра
  kodd(0x01,n1);//      подготовка вывода на led 1
  byte  n2=(x/100)%10;//2-я цифра
 kodd(0x02,n2);//       подготовка вывода на led 2 
  byte  n3=(x/10)%10;// 3-я цифра
  kodd(0x80,n3);//      подготовка вывода на led 3
 byte n4=x%10;//        4-я цифра
  kodd(0x04,n4);//      подготовка вывода на led 4
 
//*********************************************************

  digitalWrite(strobePin, HIGH);
  digitalWrite(clockPin, HIGH);

  t_sendCommand(0x88 | min(7, intensity));//      команда 4
  t_sendCommand(0x03);//                          команда 1
  t_sendCommand(0x40);//                          команда 2
  t_sendCommand3(0XC0);//                         команда 3

 
for (int j=0; j<14; j++){//      запись сформированного массива
    t_send(led[j]);//            в led дисплей
}
  digitalWrite(strobePin,HIGH);
}
 }
//***************************************************************
// функции (подпропраммы)
void kodd(byte kod, byte n1)
{
   if (n1==1)
   {
    led[2]+=kod, led[4]+=kod;//                                        запись в массив цифры 1 
   }
   if (n1==2)
   {
    led[0]+=kod, led[2]+=kod, led[12]+=kod, led[8]+=kod, led[6]+=kod;//запись в массив цифры 2
   }
   if (n1==3)
   {
    led[0]+=kod, led[2]+=kod, led[12]+=kod, led[4]+=kod, led[6]+=kod;//запись в массив цифры 3
   }
   if (n1==4)
   {
    led[10]+=kod, led[12]+=kod, led[2]+=kod, led[4]+=kod;             //запись в массив цифры 4
   }
   if (n1==5)
   {
    led[0]+=kod, led[10]+=kod, led[12]+=kod, led[4]+=kod, led[6]+=kod; //запись в массив цифры 5
   }
   if (n1==6)
   {
    led[0]+=kod, led[10]+=kod, led[8]+=kod, led[6]+=kod,led[4]+=kod, led[12]+=kod;//        цифры 6
   }
   if (n1==7)
   {
    led[0]+=kod, led[2]+=kod, led[4]+=kod;                             //запись в массив цифры 7
   }
   if (n1==8)
   {
    led[0]+=kod, led[2]+=kod, led[4]+=kod, led[6]+=kod, led[8]+=kod, led[10]+=kod, led[12]+=kod;// цифры 8
   }
   if (n1==9)
   {
    led[0]+=kod, led[2]+=kod, led[4]+=kod, led[6]+=kod, led[10]+=kod, led[12]+=kod;//        цифры 9 
   }
   if(n1==0)
   {
    led[0]+=kod, led[2]+=kod, led[4]+=kod, led[6]+=kod, led[8]+=kod, led[10]+=kod;//         цифры 0
   }
}
//custom functions
//******************************************************************************************************
void t_sendCommand(byte cmd)//     управление дисплеем
{
  digitalWrite(strobePin, LOW);
  t_send(cmd);
  digitalWrite(strobePin, HIGH);
  
}
void t_sendCommand3(byte cmd)
{
  digitalWrite(strobePin, LOW);
  t_send(cmd);
}

void t_sendData(byte seg)// byte Nled
{
  digitalWrite(strobePin, LOW);
  t_send(seg);                        
  digitalWrite(strobePin, HIGH);
}

void t_send(byte data)
{
  for (int i = 0; i < 8; i++) {                  //пишет 8 бит 
    digitalWrite(clockPin, LOW);
    digitalWrite(dataPin, data & 1 ? HIGH : LOW);// данных в ТМ
    data >>= 1;
    digitalWrite(clockPin, HIGH);
  }
}

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Предлагаю использовать аппаратный SPI - это немного сократит код. Можно еще if заменить на switch. Схему бы еще.

По даташиту на каждый символ по 2 байта, достаточно 1 байта если обычный 7сегментный подключен к выводам SG1-SG8.

Обычно делают массив шрифта(коды соответвующие цифрам) и при передаче делается прямая выборка данных из этого массива, но это при классических схемах - у вас явно что-то другое, поэтому сложно продлагать оптимизации не зная чем управляешь.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

Где в arduine  аппаратный SPI, читал про него,  но вроде среда IDE его не поддерживает, схема стандартная

3 провода: CLC, CS, DATA, и +5v, GND. Управляется командами+DATA.

 

maksim
Offline
Зарегистрирован: 12.02.2012

oleg_kazakof пишет:

Где в arduine  аппаратный SPI, читал про него,  но вроде среда IDE его не поддерживает, схема стандартная

3 провода: CLC, CS, DATA, и +5v, GND. Управляется командами+DATA.

Ох и каша. Вы бы хоть ради приличия сюда заглянули. SPI

Seltvik
Seltvik аватар
Offline
Зарегистрирован: 24.10.2013

Есть в этой теме кто живой? Вопрос простой чиню увлажнитель там дисплей надо логику поменять работы дисплея на esp делаю. Скажите как проще без всего лишнего мусора отправить на нужный грид и сегмент команду для включения. Т.е. речь не про вывод цифр а про то как командовать отдельным сегментом в скетче который выше.