1

Тема: Драйвер VFD PT6312 на примере ИВ-21

Основная статья - http://rcl-radio.ru/?p=131596

http://rcl-radio.ru/wp-content/uploads/ … 2-v2.6.pdf

#define STB 4 
#define DIN 2 
#define CLK 3

#define SET 5
#define UP  6
#define DW  7

#include <Wire.h>
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
DS3231 clock;RTCDateTime DateTime;

int a[8];
long times,times0;
int hour,minut,secon,temp,set;
bool d,mig;

void setup(){
  Serial.begin(9600);clock.begin();
//  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  pinMode(STB,OUTPUT);
  pinMode(DIN,OUTPUT);
  pinMode(CLK,OUTPUT);
  pinMode(SET,INPUT_PULLUP);  
  pinMode(UP,INPUT_PULLUP);
  pinMode(DW,INPUT_PULLUP);  
  delay(100);
  digitalWrite(STB,HIGH);delay(200);
  // PWM OUTPUT D9 TIMER 1 
  TCCR1A = 0;TCCR1B = 0;
  TCCR1A = (1 << COM1A1)|(1 << WGM11);
  TCCR1B = (1 << WGM13)|(1 << WGM12)|(1 << CS10);
  DDRB =  1 << DDB1; // OUTPUT PWM (OCR1A)
  OCR1A = 16;
  ICR1 = 40;
  write_byte1_PT6312(0b01000100);// command 2
  write_byte1_PT6312(0b00000100);// command 1 8dig/14seg
  write_byte1_PT6312(0b10001111);// command 4 display on
  }

void loop(){ 
  DateTime = clock.getDateTime();
  hour = DateTime.hour;
  minut = DateTime.minute;
  secon = DateTime.second;
  if(millis()-times>10000){temp=clock.readTemperature()*10;times=millis();}

  if(digitalRead(SET)==LOW){set++;if(set>3){set=0;} delay(300);} 
  if(digitalRead(UP)==LOW&&set==1){hour++;if(hour>23){hour=23;} clock.setDateTime(2024, 2, 22, hour, minut, secon);delay(100);} 
  if(digitalRead(DW)==LOW&&set==1){hour--;if(hour<0){hour=0;} clock.setDateTime(2024, 2, 22, hour, minut, secon);delay(100);} 
  if(digitalRead(UP)==LOW&&set==2){minut++;if(minut>59){minut=59;} clock.setDateTime(2024, 2, 22, hour, minut, secon);delay(100);} 
  if(digitalRead(DW)==LOW&&set==2){minut--;if(minut<0){minut=0;} clock.setDateTime(2024, 2, 22, hour, minut, secon);delay(100);} 
  if(digitalRead(UP)==LOW&&set==3){secon=0; clock.setDateTime(2024, 2, 22, hour, minut, secon);delay(100);} 
  if(digitalRead(DW)==LOW&&set==3){secon=0; clock.setDateTime(2024, 2, 22, hour, minut, secon);delay(100);} 

  if(millis()-times0<200){mig=1;}
  if(millis()-times0>200){mig=0;}
  if(millis()-times0>400){times0=millis();}

if(secon<55||set>0){ d=0;
  if(set!=3){a[0]=secon%10;}
  if(set!=3){a[1]=secon/10%10;}
  if(set==3&&mig==0){a[0]=secon%10;}
  if(set==3&&mig==0){a[1]=secon/10%10;}
  if(set==3&&mig==1){a[0]=10;}
  if(set==3&&mig==1){a[1]=10;}  
  a[2]=11;
  if(set!=2){a[3]=minut%10;}
  if(set!=2){a[4]=minut/10%10;}
  if(set==2&&mig==0){a[3]=minut%10;}
  if(set==2&&mig==0){a[4]=minut/10%10;}
  if(set==2&&mig==1){a[3]=10;}
  if(set==2&&mig==1){a[4]=10;}
  a[5]=11;
  if(set!=1){a[6]=hour%10;}
  if(set!=1){a[7]=hour/10%10;}
  if(set==1&&mig==0){a[6]=hour%10;}
  if(set==1&&mig==0){a[7]=hour/10%10;}
  if(set==1&&mig==1){a[6]=10;}
  if(set==1&&mig==1){a[7]=10;}
  }
if(secon>=55&&set==0){ d=1;
  a[0]=10;
  a[1]=13;
  a[2]=12;
  a[3]=temp%10;
  a[4]=temp/10%10;
  a[5]=temp/100%10;
  a[6]=10;
  a[7]=10;
  }
  
            //dp g f e d c b a 
  write_byte2_PT6312(0b11000000,seg(a[0],0));//GR1
  write_byte2_PT6312(0b11000010,seg(a[1],0));//GR2
  write_byte2_PT6312(0b11000100,seg(a[2],0));//GR3
  write_byte2_PT6312(0b11000110,seg(a[3],0));//GR4
  write_byte2_PT6312(0b11001000,seg(a[4],d));//GR5
  write_byte2_PT6312(0b11001010,seg(a[5],0));//GR6
  write_byte2_PT6312(0b11001100,seg(a[6],0));//GR7
  write_byte2_PT6312(0b11001110,seg(a[7],0));//GR8
  }  

byte seg(int a, bool dp){
  byte segm;
  switch(a){
    case 0: segm=0b00111111+(dp<<7);break;
    case 1: segm=0b00000110+(dp<<7);break;
    case 2: segm=0b01011011+(dp<<7);break;
    case 3: segm=0b01001111+(dp<<7);break;
    case 4: segm=0b01100110+(dp<<7);break;
    case 5: segm=0b01101101+(dp<<7);break;
    case 6: segm=0b01111101+(dp<<7);break;
    case 7: segm=0b00000111+(dp<<7);break;
    case 8: segm=0b01111111+(dp<<7);break;
    case 9: segm=0b01101111+(dp<<7);break;
    case 10:segm=0b00000000;break;// пусто
    case 11:segm=0b01000000;break;// -
    case 12:segm=0b01100011;break;// градус
    case 13:segm=0b00111001;break;// С
    }
    return segm;
  }

void write_byte1_PT6312(byte data){
     digitalWrite(STB,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(CLK,HIGH);
     }  
     digitalWrite(STB,HIGH);delay(1);
  }  

void write_byte2_PT6312(byte reg, byte data){
     digitalWrite(STB,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CLK,LOW);
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(CLK,HIGH);
     }  
     delay(1);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(CLK,HIGH);
     }    
     digitalWrite(STB,HIGH);delay(1);
  }    

2

Re: Драйвер VFD PT6312 на примере ИВ-21

Программная регулировка яркости

#define STB 4 
#define DIN 2 
#define CLK 3

#define SET 5
#define UP  6
#define DW  7

#include <Wire.h>
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
#include <EEPROM.h>
DS3231 clock;RTCDateTime DateTime;

int a[8];
long times,times0;
int hour,minut,secon,temp,set,br;
bool d,mig;

void setup(){
  Serial.begin(9600);clock.begin();
//  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  pinMode(STB,OUTPUT);
  pinMode(DIN,OUTPUT);
  pinMode(CLK,OUTPUT);
  pinMode(SET,INPUT_PULLUP);  
  pinMode(UP,INPUT_PULLUP);
  pinMode(DW,INPUT_PULLUP);  
  delay(100);
  digitalWrite(STB,HIGH);delay(200);
  // PWM OUTPUT D9 TIMER 1 
  TCCR1A = 0;TCCR1B = 0;
  TCCR1A = (1 << COM1A1)|(1 << WGM11);
  TCCR1B = (1 << WGM13)|(1 << WGM12)|(1 << CS10);
  DDRB =  1 << DDB1; // OUTPUT PWM (OCR1A)
  OCR1A = 16;
  ICR1 = 40;
  br = EEPROM.read(0);if(br>7){br=7;}
  write_byte1_PT6312(0b01000100);// command 2
  write_byte1_PT6312(0b00000100);// command 1 8dig/14seg
  write_byte1_PT6312(0b10001000+br);// command 4 display on
  }

void loop(){ 
  DateTime = clock.getDateTime();
  hour = DateTime.hour;
  minut = DateTime.minute;
  secon = DateTime.second;
  if(millis()-times>10000){temp=clock.readTemperature()*10;times=millis();}

  if(digitalRead(SET)==LOW){set++;if(set>4){set=0;} delay(300);} 
  if(digitalRead(UP)==LOW&&set==1){hour++;if(hour>23){hour=23;} clock.setDateTime(2024, 2, 22, hour, minut, secon);delay(100);} 
  if(digitalRead(DW)==LOW&&set==1){hour--;if(hour<0){hour=0;} clock.setDateTime(2024, 2, 22, hour, minut, secon);delay(100);} 
  if(digitalRead(UP)==LOW&&set==2){minut++;if(minut>59){minut=59;} clock.setDateTime(2024, 2, 22, hour, minut, secon);delay(100);} 
  if(digitalRead(DW)==LOW&&set==2){minut--;if(minut<0){minut=0;} clock.setDateTime(2024, 2, 22, hour, minut, secon);delay(100);} 
  if(digitalRead(UP)==LOW&&set==3){secon=0; clock.setDateTime(2024, 2, 22, hour, minut, secon);delay(100);} 
  if(digitalRead(DW)==LOW&&set==3){secon=0; clock.setDateTime(2024, 2, 22, hour, minut, secon);delay(100);} 
  if(digitalRead(UP)==LOW&&set==4){br++; EEPROM.update(0,br);if(br>7){br=7;}write_byte1_PT6312(0b10001000+br);delay(200);} 
  if(digitalRead(DW)==LOW&&set==4){br--; EEPROM.update(0,br);if(br<0){br=0;}write_byte1_PT6312(0b10001000+br);delay(200);} 

  if(millis()-times0<200){mig=1;}
  if(millis()-times0>200){mig=0;}
  if(millis()-times0>400){times0=millis();}
if(set<4){
if(secon<55||set>0){ d=0;
  if(set!=3){a[0]=secon%10;}
  if(set!=3){a[1]=secon/10%10;}
  if(set==3&&mig==0){a[0]=secon%10;}
  if(set==3&&mig==0){a[1]=secon/10%10;}
  if(set==3&&mig==1){a[0]=10;}
  if(set==3&&mig==1){a[1]=10;}  
  a[2]=11;
  if(set!=2){a[3]=minut%10;}
  if(set!=2){a[4]=minut/10%10;}
  if(set==2&&mig==0){a[3]=minut%10;}
  if(set==2&&mig==0){a[4]=minut/10%10;}
  if(set==2&&mig==1){a[3]=10;}
  if(set==2&&mig==1){a[4]=10;}
  a[5]=11;
  if(set!=1){a[6]=hour%10;}
  if(set!=1){a[7]=hour/10%10;}
  if(set==1&&mig==0){a[6]=hour%10;}
  if(set==1&&mig==0){a[7]=hour/10%10;}
  if(set==1&&mig==1){a[6]=10;}
  if(set==1&&mig==1){a[7]=10;}
  }
if(secon>=55&&set==0){ d=1;
  a[0]=10;
  a[1]=13;
  a[2]=12;
  a[3]=temp%10;
  a[4]=temp/10%10;
  a[5]=temp/100%10;
  a[6]=10;
  a[7]=10;
  }
}
if(set==4){
  a[0]=10;
  a[1]=10;
  a[2]=10;
  a[3]=br;
  a[4]=10;
  a[5]=14;
  a[6]=15;
  a[7]=10;
  }
  
            //dp g f e d c b a 
  write_byte2_PT6312(0b11000000,seg(a[0],0));//GR1
  write_byte2_PT6312(0b11000010,seg(a[1],0));//GR2
  write_byte2_PT6312(0b11000100,seg(a[2],0));//GR3
  write_byte2_PT6312(0b11000110,seg(a[3],0));//GR4
  write_byte2_PT6312(0b11001000,seg(a[4],d));//GR5
  write_byte2_PT6312(0b11001010,seg(a[5],0));//GR6
  write_byte2_PT6312(0b11001100,seg(a[6],0));//GR7
  write_byte2_PT6312(0b11001110,seg(a[7],0));//GR8
  }  

byte seg(int a, bool dp){
  byte segm;
  switch(a){
    case 0: segm=0b00111111+(dp<<7);break;
    case 1: segm=0b00000110+(dp<<7);break;
    case 2: segm=0b01011011+(dp<<7);break;
    case 3: segm=0b01001111+(dp<<7);break;
    case 4: segm=0b01100110+(dp<<7);break;
    case 5: segm=0b01101101+(dp<<7);break;
    case 6: segm=0b01111101+(dp<<7);break;
    case 7: segm=0b00000111+(dp<<7);break;
    case 8: segm=0b01111111+(dp<<7);break;
    case 9: segm=0b01101111+(dp<<7);break;
    case 10:segm=0b00000000;break;// пусто
    case 11:segm=0b01000000;break;// -
    case 12:segm=0b01100011;break;// градус
    case 13:segm=0b00111001;break;// С
    case 14:segm=0b01010000;break;// r
    case 15:segm=0b01111100;break;// b
    }
    return segm;
  }

void write_byte1_PT6312(byte data){
     digitalWrite(STB,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(CLK,HIGH);
     }  
     digitalWrite(STB,HIGH);delay(1);
  }  

void write_byte2_PT6312(byte reg, byte data){
     digitalWrite(STB,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CLK,LOW);
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(CLK,HIGH);
     }  
     delay(1);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(CLK,HIGH);
     }    
     digitalWrite(STB,HIGH);delay(1);
  }    

3

Re: Драйвер VFD PT6312 на примере ИВ-21

Фото проекта

http://forum.rcl-radio.ru/uploads/images/2024/02/093eb7b2c94baec8576b6b44b4c9f5e0.png

http://forum.rcl-radio.ru/uploads/images/2024/02/9bd9c3efae24f718c4da4c18199d9470.png

http://forum.rcl-radio.ru/uploads/images/2024/02/c063595790a94a1ce8885fbb1cd01490.png

http://forum.rcl-radio.ru/uploads/images/2024/02/84038116e6a9623e68acedaa49a14648.png

http://forum.rcl-radio.ru/uploads/images/2024/02/de066e4ceba5994016312e00e6413b06.png

http://forum.rcl-radio.ru/uploads/images/2024/02/f826dacfb206b3e355f432c01340e1a8.png

http://forum.rcl-radio.ru/uploads/images/2024/02/fbfe81d43c59d91a0554550decbe0315.png

http://forum.rcl-radio.ru/uploads/images/2024/02/df6f243a9840c4d85d49e487ff6927da.png

http://forum.rcl-radio.ru/uploads/images/2024/02/1b86c50f4e6c6a45e890fa5ebeb04820.png

Re: Драйвер VFD PT6312 на примере ИВ-21

Здравствуйте, есть плата индикации на 6312 от двд филипса, 7 сеток 15 сегментов, не  подскажите как его "прикрутить"? Работает то работает, но естественно кашу показывает.http://forum.rcl-radio.ru/uploads/images/2024/03/2e0cfcdf68de4c113229dc10a5cda2a1.jpg http://forum.rcl-radio.ru/uploads/images/2024/03/0396336788ef6b88b9d709215a593388.png

5

Re: Драйвер VFD PT6312 на примере ИВ-21

Архив схемы в полный размер сделайте. Ни чего не видно.

6

Re: Драйвер VFD PT6312 на примере ИВ-21

Скетч который опубликован рассчитан на 7-и сегментные индикаторы, для 16-и сегментного необходима существенная правка скетча.

7

Re: Драйвер VFD PT6312 на примере ИВ-21

Регистр   write_byte1_PT6312(0b00000100);// command 1 8dig/14seg

011: 7 digits, 15 segments

заменить на

  write_byte1_PT6312(0b00000011);// command 1 7dig/15seg

8

Re: Драйвер VFD PT6312 на примере ИВ-21

вот пример отправки символа для одного разряда

write_byte2_PT6312(0b11000000,0b00000001);//GR1

9

Re: Драйвер VFD PT6312 на примере ИВ-21

http://forum.rcl-radio.ru/uploads/images/2024/03/33e72af6d8acd8e2b93d34531470eb6c.png

Так как у Вас 15 сегментов, то нужно отправлять данный по двум адресам

write_byte2_PT6312(0b11000000,0b00000001);//GR1 1 байт адрес 00
write_byte2_PT6312(0b11000001,0b00000001);//GR1 2 байт адрес 01

Эти две строки создадут символ в одном разряде индикатора

10

Re: Драйвер VFD PT6312 на примере ИВ-21

Полная таблица адресов

http://forum.rcl-radio.ru/uploads/images/2024/03/aa0d1539569804e016e408390fe2d475.png

11

Re: Драйвер VFD PT6312 на примере ИВ-21

Спасибо, щас попробую родить.

12

Re: Драйвер VFD PT6312 на примере ИВ-21

В общем сподвигло меня на подвиги, запилил часы на ив-4 и PT6311, плату взял от дохлого двд, Буду допиливать календарь, может ещё метеостанцию прикручу.http://forum.rcl-radio.ru/uploads/images/2024/03/2e7377b4740f01f9485241987347c60d.jpg http://forum.rcl-radio.ru/uploads/images/2024/03/8a277390df4ed34af3d75de885266f1b.jpg



write_byte2_PT6312(0b11000000,seg(a[0],0));//GR1
  write_byte2_PT6312(0b11000001,seg1(a[0],0));//GR1
  write_byte2_PT6312(0b11000010,seg2(a[0],0));//GR1
 
  write_byte2_PT6312(0b11000011,seg(a[7],0));//GR2
  write_byte2_PT6312(0b11000100,seg1(a[7],0));//GR2
  write_byte2_PT6312(0b11000101,seg2(a[7],0));//GR2

  write_byte2_PT6312(0b11000110,seg(a[6],0));//GR3
  write_byte2_PT6312(0b11000111,seg1(a[6],0));//GR3
  write_byte2_PT6312(0b11001000,seg2(a[6],0));//GR3

  write_byte2_PT6312(0b11001001,seg(a[0],0));//GR4
  write_byte2_PT6312(0b11001010,seg1(a[0],0));//GR4
  write_byte2_PT6312(0b11001011,seg2(a[0],0));//GR4

  write_byte2_PT6312(0b11001100,seg(a[4],d));//GR5
  write_byte2_PT6312(0b11001101,seg1(a[4],d));//GR5
  write_byte2_PT6312(0b11001110,seg2(a[4],d));//GR5

  write_byte2_PT6312(0b11001111,seg(a[3],d));//GR6
  write_byte2_PT6312(0b11010000,seg1(a[3],d));//GR6
  write_byte2_PT6312(0b11010001,seg2(a[3],d));//GR6

  write_byte2_PT6312(0b11010010,seg(a[0],0));//GR7
  write_byte2_PT6312(0b11010011,seg1(a[0],0));//GR7
  write_byte2_PT6312(0b11010100,seg2(a[0],0));//GR7

  write_byte2_PT6312(0b11010101,seg(a[1],0));//GR8
  write_byte2_PT6312(0b11010110,seg1(a[1],0));//GR8
  write_byte2_PT6312(0b11010111,seg2(a[1],0));//GR8

  write_byte2_PT6312(0b11011000,seg(a[0],0));//GR9
  write_byte2_PT6312(0b11011001,seg1(a[0],0));//GR9
  write_byte2_PT6312(0b11011010,seg2(a[0],0));//GR9

  write_byte2_PT6312(0b11011011,seg(a[0],0));//GR10
  write_byte2_PT6312(0b11011100,seg1(a[0],0));//GR10
  write_byte2_PT6312(0b11011101,seg2(a[0],0));//GR10


  } 

byte seg(int a, bool dp){
  byte segm;
  switch(a){
    case 0: segm=0b01101001+(dp<<7);break;
    case 1: segm=0b00010001+(dp<<7);break;
    case 2: segm=0b01000101+(dp<<7);break;
    case 3: segm=0b00100101+(dp<<7);break;
    case 4: segm=0b01101110+(dp<<7);break;
    case 5: segm=0b00101111+(dp<<7);break;
    case 6: segm=0b00101111+(dp<<7);break;
    case 7: segm=0b000000001+(dp<<7);break;
    case 8: segm=0b01101111+(dp<<7);break;
    case 9: segm=0b01101111+(dp<<7);break;
    case 10:segm=0b00000000;break;// пусто
    case 11:segm=0b11111111;break;// -
    case 12:segm=0b00100000;break;// БУКВА М
    case 13:segm=0b01100000;break;// БУКВА Д
    case 14:segm=0b00000000;break;// БУКВА Г
    case 15:segm=0b01111100;break;// b
    }
    return segm;
  }
byte seg1(int a, bool dp){
  byte segm1;
  switch(a){
    case 0: segm1=0b10100111+(dp<<7);break;
    case 1: segm1=0b00110100+(dp<<7);break;
    case 2: segm1=0b10100101+(dp<<7);break;
    case 3: segm1=0b10100100+(dp<<7);break;
    case 4: segm1=0b00000000+(dp<<7);break;
    case 5: segm1=0b10100100+(dp<<7);break;
    case 6: segm1=0b10100110+(dp<<7);break;
    case 7: segm1=0b10010000+(dp<<7);break;
    case 8: segm1=0b10100110+(dp<<7);break;
    case 9: segm1=0b10100100+(dp<<7);break;
    case 10:segm1=0b00000000;break;// пусто
    case 11:segm1=0b11111111;break;// -
    case 12:segm1=0b01101010;break;// БУКВА М
    case 13:segm1=0b01101101;break;// БУКВА Д
    case 14:segm1=0b00000010;break;// БУКВА Г
    case 15:segm1=0b01111100;break;// b
    }
    return segm1;
  }
  byte seg2(int a, bool dp){
  byte segm2;
  switch(a){
    case 0: segm2=0b00000001+(dp<<7);break;
    case 1: segm2=0b00000000+(dp<<7);break;
    case 2: segm2=0b00000000+(dp<<7);break;
    case 3: segm2=0b00000001+(dp<<7);break;
    case 4: segm2=0b00000000+(dp<<7);break;
    case 5: segm2=0b00000000+(dp<<7);break;
    case 6: segm2=0b00000000+(dp<<7);break;
    case 7: segm2=0b00000001+(dp<<7);break;
    case 8: segm2=0b00000000+(dp<<7);break;
    case 9: segm2=0b00000000+(dp<<7);break;
    case 10:segm2=0b00000000;break;// пусто
    case 11:segm2=0b00000011;break;// -
    case 12:segm2=0b000000011;break;// БУКВА М
    case 13:segm2=0b00000001;break;// БУКВА Д
    case 14:segm2=0b00000110;break;// БУКВА Г
    case 15:segm2=0b01111100;break;// b
    }
    return segm2;