Вывод на индикатор с гашением старших разрядов если они равны нулю

Доброго времени суток. Такая проблемка. Нужно вывести на индикатор с отправкой данных по Serial трех значное число от 0 до 255 . С этим я справился ниже будет пример как я вывожу. Дальше по тз потребовалось погасить старшие разряды если они равны нулю. Например сейчас у меня выводится 043 а хочется вывести 43 погасив первый разряд индикатора.

unsigned char skor[3] = {0, 0, 0};

//конвертируем скорость для вывода на индикатор
void dig_convert_skor(unsigned int i_conv1)
{
  unsigned char tmp = 0;

  //конвертируем skor_tek
  tmp = i_conv1 %10;
  skor[2] =  tmp;         //Разряд 3
  tmp = i_conv1 /10 %10;
  skor[1] =  tmp;         //Разряд 2
  tmp = i_conv1 /100 %10;
  skor[0] =  tmp;         //Разряд 1
}

 //сотни
 Serial1.print(char(0x1B));     //подача служебной команды на установку курсора.  
 Serial1.print(char(29));       //установка курсора на 29 знакоместо (0-47 допустимое значение)
Serial1.print(skor[0]);    //отправка текущая скорость Разряд 1

//десятки
 Serial1.print(char(0x1B));     //подача служебной команды на установку курсора.  
Serial1.print(char(30));       //установка курсора на 30 знакоместо (0-47 допустимое значение)
Serial1.print(skor[1]);    //отправка текущая скорость Разряд 2

//единицы
Serial1.print(char(0x1B));     //подача служебной команды на установку курсора.  
Serial1.print(char(31));       //установка курсора на 31 знакоместо (0-47 допустимое значение)
Serial1.print(skor[2]);    //отправка текущая скорость Разряд 3

Прошу помощи как мне правильно погасить ненужные нули.

Вывести в эти позиции “пробел” .

А уж как в вашем индикаторе пробел показать - никто кроме вас не знает

пробел я вывожу так

Serial1.print(char(0x1B));  //подача служебной команды на установку курсора.  
Serial1.print(char(29));    //установка курсора на 29 знакоместо (0-47 допустимое значение)
Serial1.print(" ");         //отправка пробела для очистки знакоместа от преведущей надписи Разряд 1

я о том как условие правильно написать попробовал написать если разряд равен нулю то гасить его но тут проблема у меня ведь три разряда и если цифра 105 то у меня погаснет 2й разряд и получится 1 5

значит условие должно быть сложнее - для каждого разряда свое.
Для старшего просто, если нуль - то ставим пробел.
Для второго и третьего - если в разряде нуль и более старший разряд - пробел…

А можно просто к исходной цифре привязатся, если она меньше 100- гасим первый разряд, а если меньше 10 - два первых.

Это ж все логика, думайте!

@b707 опять обсуждаем кривой и неполный код? Ну, потом не жалуйтесь :frowning:

2 лайка

не, мы обсуждаем алгоритм.

1 лайк

Попробуй как-то так сделать:

bool f=false;
for (int i=0;i<=2;i++){
  Serial1.print(char(0x1B));
  Serial1.print(char(i+29));
  if (skor[i]!='0') {f=true;};
  if (f) {serial1.print(skor[i]);} else {serial1.print(' ');}
}

незачет.

Ваш код будет работать так, как описано тут:

Форматированный вывод спасет отца русской демократии.

@alexval2007 , посмотрел Ваш код (хотя и не следовало т.к. вставлен он не по правилам).
Вы, когда в тетрадке пишите, тоже открываете тетрадку, находите нужную страницу, вписываете одну букву и закрываете тетрадку, а для следующей буквы проделываете ту же самую последовательность?

Ставим курсор
Если число меньше ста печатаем пробел, иначе печатаем сотни
Если число меньше десяти печатаем пробел, иначе печатаем десятки
Печатаем единицы.

1 лайк

Еще вариант:

  1. char buf[3]; // создаем буфер для работы с представлением трехзначного числа
  2. sprintf(buf,“%3d”,value); // заполняем его нужными нам символами
  3. // посимвольно выводим на индикатор
    Впрочем, Kakmyc уже упомянул эту методу.

Ну если

а не всякие там printf и т.п. то алгоритм должен подойти.
А недочеты топикстартер уж сам поправит.

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

//=================================================================
unsigned long TimerOld = 0;          //Предыдущее время Millis для цикла 0,4с
unsigned long TimerTek = 0;          //Текущее время в Millis
unsigned long TimerProshlo = 0;   //Прошедшее с предыдущего время в Millis

byte skor_tek2 = 0;        //скорость текущая
byte skor_dop = 0;         //допустимая скорость
unsigned char skor_zds[6] = {0, 0, 0, 0, 0, 0};
//=================================================================
//конвертируем скорость для вывода на индикатор
//skor_tek2, skor_dop
void dig_convert_skor(unsigned int i_conv1, unsigned int i_conv2)
{
  unsigned char tmp = 0;

  //конвертируем skor_tek2
  tmp = i_conv1 %10;
  skor[2] =  tmp;         //Разряд 3
  
  tmp = i_conv1 /10 %10;
  skor[1] =  tmp;         //Разряд 2
  
  tmp = i_conv1 /100 %10;
  skor[0] =  tmp;         //Разряд 1

  //конвертируем skor_dop
  tmp = i_conv2  %10;
  skor[5] =  tmp;         //Разряд 6
  tmp = i_conv2 /10 %10;
  skor[4] =  tmp;         //Разряд 5
  tmp = i_conv2 /100 %10;
  skor[3] =  tmp;         //Разряд 4 
}
//=================================================================
void loop()
{
     TimerTek = millis();
     TimerProshlo = TimerTek - TimerOld;
     if (TimerProshlo >= 400)//Сообщения отправляемые с циклом 400ms
     {
        //конвертируем скорость для вывода на индикатор
        //skor_tek2, skor_dop
        dig_convert_skor(skor_tek2, skor_dop);
        display_state();            //Обновим состояние дисплея . 
      
        TimerOld = millis(); 
      }//конец if (TimerProshlo >= 400)//Сообщения отправляемые с циклом 400ms
}
//================================================
void display_state() 
{

     //Выводим допустимую скорость. Сотни.
     if (skor[3] > 0)//если разряд больше нуля то выводим сотни
     {
       Serial1.print(char(0x1B));  //подача служебной команды на установку курсора.  
       Serial1.print(char(13));    //установка курсора на 13 знакоместо (0-47 допустимое значение)
       Serial1.print(skor[3]); //отправка допустимая скорость Разряд 4
     }
     else //Иначе тушим разряд.
     {
       Serial1.print(char(0x1B));  //подача служебной команды на установку курсора.  
       Serial1.print(char(13));    //установка курсора на 13 знакоместо (0-47 допустимое значение)
       Serial1.print(" ");         //отправка пробела для очистки знакоместа от преведущей надписи Разряд 4
     }

     //Выводим допустимую скорость. Десятки.
     if ((skor[4] == 0) && (skor[3] == 0))//если разряд десятков равен 0 и разряд сотен равен 0 то тушим разряд.
     {
       Serial1.print(char(0x1B));  //подача служебной команды на установку курсора.  
       Serial1.print(char(14));    //установка курсора на 14 знакоместо (0-47 допустимое значение)
       Serial1.print(" ");         //отправка пробела для очистки знакоместа от преведущей надписи Разряд 5
     }
     else //Иначе выводим разряд десятков
     {
       Serial1.print(char(0x1B));  //подача служебной команды на установку курсора.  
       Serial1.print(char(14));    //установка курсора на 14 знакоместо (0-47 допустимое значение)
       Serial1.print(skor[4]); //отправка отправка допустимая скорость Разряд 5
     }

     //Выводим допустимую скорость. Единицы.
     Serial1.print(char(0x1B));    //подача служебной команды на установку курсора.  
     Serial1.print(char(15));      //установка курсора на 15 знакоместо (0-47 допустимое значение)
     Serial1.print(skor[5]);   //отправка отправка допустимая скорость Разряд 6
}
//================================================

а вы подумайте.
Вы, похоже, не понимаете даже как ваш собственный код работает

Научитесь таки правильно вставлять код, в таком виде обсуждать его невозможно

Снимок экрана в 2023-03-05 17-05-33

уже озвучено в ветке - смотрите просто на число. Если оно меньше ста - гасим первую цифру, а если меньше 10-ти - две цифры.

Ну Вы все тут такие быстрые. Я еще свое сообщение отредактировать не успел как зацитировали…))))

извиняюсь за неправильный вывод кода форум новый сразу не разобрался.

Ну, если именно исходный алгоритм лечить, то можно делать так:
0. Присваиваем переменной char c значение " " (пробел)

  1. Последовательно проходя разряды числа слева направо (сотни, десятки, единицы → d) выполняем:
    если d==0 выводим c
    иначе {
    выводим d
    присваиваем переменной c значение “0” (ноль)
    }