Управление жк через ht1621b

Добрый день! имеется жк от приборной панели с драйвером ht1621b. я накидал скетч для определения адресов и битов сегментов, и на основе него зажег 2 цифры дисплея. Но возник вопрос как допустим на эти цифры сделать не статичными цифры , а динамичными (допустим отсчет секунд ).
Прошу помочь с кодом.
Скетч индикации 2 цифр.

#define CS   13  //Pin 13 as chip selection output
#define WR   12  //Pin 12 as read clock output
#define DATA 8  //Pin 7 as Serial data output

#define CS1    digitalWrite(CS, HIGH) 
#define CS0    digitalWrite(CS, LOW)
#define WR1    digitalWrite(WR, HIGH) 
#define WR0    digitalWrite(WR, LOW)
#define DATA1  digitalWrite(DATA, HIGH) 
#define DATA0  digitalWrite(DATA, LOW)


#define sbi(x, y)  (x |= (1 << y))   
#define cbi(x, y)  (x &= ~(1 <<y ))  
#define uchar   unsigned char 
#define uint   unsigned int 

//定义HT1621的命令 
#define  ComMode    0x52  //4COM,1/3bias  1000    010 1001  0  
#define  RCosc      0x30  //1000 0011 0000 
#define  LCD_on     0x06  //1000     0000 0 11 0 
#define  LCD_off    0x04  
#define  Sys_en     0x02  //1000   0000 0010 
#define  CTRl_cmd   0x80  
#define  Data_cmd   0xa0  


/*0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,H,h,L,n,N,o,P,r,t,U,-, ,*/

const char num[]={B11110101,B01100000,B10110110,B11110010,B01100011,B11010011,B11010111,B01110000,B11110111,B11110011}; // биты чисел
                 //    0        1          2         3        4         5         6          7          8       9
char dispnum[6]={0x00,0x00,0x00,0x00,0x00,0x00};



void SendBit_1621(uchar sdata,uchar cnt)
{ 
  //data cnt HT1621
  uchar i; 
  for(i=0;i<cnt;i++) 
  { 
    WR0;
    if(sdata&0x80) DATA1; 
    else DATA0;
    WR1;
    sdata<<=1; 
  } 
}

void SendCmd_1621(uchar command) 
{ 
  CS0; 
  SendBit_1621(0x80,4);  
  SendBit_1621(command,8); 
  CS1;                     
}

void Write_1621(uchar addr,uchar sdata)
{ 
  addr<<=2; 
  CS0; 
  SendBit_1621(0xa0,3);     
  SendBit_1621(addr,6);     
  SendBit_1621(sdata,8);   
  CS1; 
} 

void HT1621_all_off(uchar num) 
{
  uchar i; 
  uchar addr=0; 
  for(i=0;i<num;i++) 
  { 
    Write_1621(addr,0x00); 
    addr+=2; 
  } 
}

void Init_1621(void)
{
  SendCmd_1621(Sys_en);
  SendCmd_1621(RCosc);    
  SendCmd_1621(ComMode);  
  SendCmd_1621(LCD_on);
}    

void setup() {
  pinMode(CS, OUTPUT); // 
  pinMode(WR, OUTPUT); // 
  pinMode(DATA, OUTPUT); //
  CS1;
  DATA1;
  WR1;
  delay(50);
  Init_1621();
  HT1621_all_off(16); //1621
  delay(1000);
  
}

void loop() {
  
Write_1621( 29,num[8]); // зажигаем левую цифру
Write_1621( 27,num[8]);// зажигаем правую цифру 
 
}

(Адрес левой цифры-29, правой-27)

В 104 строке измени num[5], если выведет «85», значит ты просто тупишь:

void loop() {

number = 26;
Write_1621( 29,num[number / 10]);  // зажигаем левую цифру
Write_1621( 27,num[number % 10]);  // зажигаем правую цифру 
 
}

это да, если менять значение

num

что цифры меняются. Но я же хочу допустим вывести отсчет секунд

(millis() / 1000)

. но как это сделать что он показывал именно мои цифры(num)?

Ты реально тупишь!
Я же выше пример привел с числом «26»!!!

вот такая ошибка

И у меня еще вопрос, как объединить 2 сегмента (29 и 27) в один . Что бы я мог одной командой выводить на него 2-ух значное число, допустим с датчика температуры

Мама не говорила, что врать не хорошо? ))

Ну так объяви переменную.

uint8_t number = 26;

Учи программирование, я не буду тебе элементарные весчи исправлять.

Это всё в моём примере имеется. Присваиваешь переменной number значение температуры и она будет выведена на дисплей.

1 лайк

спасибо огромное). Всё завелось

На здоровье ))

Не отдавай своё здоровье. Мы уже не молоды. В крайнем случае эти слова внукам можно сказать, но ни как не незнакомому чаловеку.

1 лайк

ещё вопросик, как убрать нули перед значением?

давай BOOM :rofl:

1 лайк

Какие нули? Перед каким значением?
Ёлки иголки, почитай книжку чтоль…

Добрый день, есть один вопрос, я делаю вольтметр на lcd с драйвером HT1621B. Нашёл в интернете пример расчета напряжения и это значение вывожу на дисплей по одной цифре.

{
vin = float(analogRead(analogInput))/80.94;

}
uint8_t volt = vin;

Write_1621( 2,num1[volt / 10]);  //зажигаем первую цифру 
Write_1621( 4,num1[volt % 10]);  //зажигаем вторую цифру
// адрес первой цифры 2, второй 4, третьей 6

Но столкнулся с проблемой, получается вывести только целую часть этого значения(значение выглядит так “volt=13.23”), но хочется вывести хотя-бы одно значение после запятой. Подскажите пожалуйста как это сделать.

Вам надо разобраться с типами данных. Выведите в монитор порта значение переменной volt после 5 строки

как раз таки в монитор порте все легче
Serial.println(volt,1); //поставил запятую и всё
А как выводить по одной цифре на сегмент экрана я не знаю

Попробуйте))

точнее знаю как первые 2 цифры выводить, а после запятой не знаю