@Vlad_9854

Как объединить цифры жк экрана с драйвером ht1621b?

Добрый день! имеется жк от приборной панели с драйвером ht1621b. я накидал скетч для определения адресов и битов сегментов, и на основе него зажег 2 цифры дисплея. Но возникло 2 вопроса, как допустим эти цифры сделать не статичными , а динамичными (допустим отсчет секунд ). И второй как объединить 2 цифры (адрес первой 29, второй 27)в одну. Что бы я мог одной командой выводить на него 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)
65747c7d0b6e9722225787.jpeg
  • Вопрос задан
  • 52 просмотра
Пригласить эксперта
Ответы на вопрос 1
@dima20155
you don't choose c++. It chooses you
Для объединения двух цифр в одну вам нужно просто в своей функции принимать число не больше 99, разбивать на цифры и выводить на соответствующие экраны.
примерно так:
void numberToHT1621(int number) {
    if (number > 99) {
        number &= 0xffff;
    }
    int first_digit = number % 10;
    int second_digit = number / 10;
    
    // printf("%d %d", second_digit, first_digit);  // for debug
    
    // write number on display
    Write_1621(27, first_digit);
    Write_1621(29, second_digit);
}


Для таймера же я бы предложил вам реализовать функцию (а может даже класс?), которая каждые N тиков таймера микроконтроллера (или же при каждом прерывании аппаратного таймера, если они у вас настроены) будет отображать на дисплее новое число.

Вот вам ооочень неоптимальный, но рабочий, для микроконтроллера пример взятый абсолютно с полтолка.
При этом у вас должен быть какой-то цикл событий или что-то ещё, который будет постоянно вызывать updateTimer у данного таймера.

Среда Ардуино поддерживает аппаратные таймеры, но можно и просто в функции loop постоянно вызывать updateTimer.

class CountdownTimer {
public:
    CountdownTimer(int timeInMCUTicks) : time(timeInMCUTicks) { }
    void updateTimer(int ticks = 1) {
        if (time <= 0) {
            time = 0;
            numberToHT1621(time);
            return;
        }

        numberToHT1621(time);
        time -= ticks;
    }
private:
    int time;
};
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы