RE:7 сегментный дисплей от DVD на контроллере ТМ 1628
- Войдите на сайт для отправки комментариев
Чт, 11/06/2015 - 17:01
//По случаю попал мне дисплей от 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); } }
Предлагаю использовать аппаратный SPI - это немного сократит код. Можно еще if заменить на switch. Схему бы еще.
По даташиту на каждый символ по 2 байта, достаточно 1 байта если обычный 7сегментный подключен к выводам SG1-SG8.
Обычно делают массив шрифта(коды соответвующие цифрам) и при передаче делается прямая выборка данных из этого массива, но это при классических схемах - у вас явно что-то другое, поэтому сложно продлагать оптимизации не зная чем управляешь.
Где в arduine аппаратный SPI, читал про него, но вроде среда IDE его не поддерживает, схема стандартная
3 провода: CLC, CS, DATA, и +5v, GND. Управляется командами+DATA.
Где в arduine аппаратный SPI, читал про него, но вроде среда IDE его не поддерживает, схема стандартная
3 провода: CLC, CS, DATA, и +5v, GND. Управляется командами+DATA.
Есть в этой теме кто живой? Вопрос простой чиню увлажнитель там дисплей надо логику поменять работы дисплея на esp делаю. Скажите как проще без всего лишнего мусора отправить на нужный грид и сегмент команду для включения. Т.е. речь не про вывод цифр а про то как командовать отдельным сегментом в скетче который выше.