LED-матрица + MAX7219 + MaxMatrix.lib

vk007
Offline
Зарегистрирован: 16.06.2015

Итак, повторю вопрос:

x = 14 / 10;
и
y = 14 % 10;

Чему будут равны x и y?

P.S. Новая страница в нашем обсуждении. Надеюсь вы увидели мое предыдущее сообщение.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

x=14/10+4

y=10*1+4

vk007
Offline
Зарегистрирован: 16.06.2015

Нет, раскладывать не надо, я это приводил только для понимания. Просто напишите, чему будут равны х и у?

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

x=1

y=4

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

LC.setColumn(channel / 10, channel % 10, CountDigits[j][i]);  так?

vk007
Offline
Зарегистрирован: 16.06.2015

Вот, то, что надо. Надеюсь, что не угадали, а все-таки поняли.

Т.е. разделив любое целое число от 0 до 99 нацело с помощью / мы получим десятки, а применив оператор % - получим единицы.

Десятки нам надо вывести на матрицу 2, а единицы на матрицу 3.

Попробуйте сначала написать просто скетч, и уже потом вывод числа оформите в виде функции. А я уже завтра посмотру, что у вас получилось.

vk007
Offline
Зарегистрирован: 16.06.2015

Jenek_Anapa пишет:

LC.setColumn(channel / 10, channel % 10, CountDigits[j][i]);  так?

Нет, совсем не то. Сейчас мы применили / и % чтобы разделить число на десятки и единицы, а в LC.setColumn это был как-бы лайфхак, чтобы одной функцией можно было выводить данные на разные матрицы. Ведь каналов-то у нас 16, а на одной матрице всего 8 столбиков. Т.е. сначала надо было выводить первых 8 столбиков на матрицу 0, и вторых 8 - на матрицу 1.

Вот channel / 8 и срабатывало как 0 для channel от 0 до 7, а потом как 1 для channel от 8 до 15.
А channel % 8 постепенно принимало значения 0 - 7 (для channel от 0 до 7), а потом еще раз 0 - 7 (для channel от 8 до 15).

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

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

 

vk007
Offline
Зарегистрирован: 16.06.2015

В общем, пока разбирайтесь. Завтра посмотрим, что получится.

И, если заметили, то я бывает правлю свои последние сообщения, чтобы что-то уточнить или дополнить. Обращайте на это внимание.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

спасибо учту 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
[code]
#include "LedControl.h"

                                                  //Синтаксис создания класса LedControl(dataPin,clockPin,csPin,numDevices)
                                                  //Где LedControl - объект класса
                                                  //dataPin  - пин на плате Arduino к которому будет подключен пин DIN
                                                  //clockPin - пин на плате Arduino к которому будет подключен пин CLK
                                                  //csPin    - пин на плате Arduino к которому будет подключен пин CS
                                                  //numDevices - количество устройств на шине

                                                  //Создать объект класса matrix в нашем случае с одним подключенным устройством
LedControl LC = LedControl(12, 11, 10, 4);
int channel;
int j;
void setup() 
{
   for(byte i = 0; i < 4; i++){       //цик котрый обращаеться каждой из матриц                                        
 
  LC.shutdown(i, false);         //Устройству с адресом 0 по SPI интерфейсу выйти из спящего режима по умолчанию
                                 
  LC.setIntensity(i, 1);          //Установить яркость Led матрицы на 8 из 15 
  LC.clearDisplay(i);             //Очистить дисплей
   }
}

                                     //Объявляем массив из 10-ти символов
                                     //Каждый символ включает в себя массив из 8-ти байт
                                     //закодированных числом в шестнадцатиричном коде  
byte CountDigits[10][8] = 
{
  {0x3c, 0x66, 0x66, 0x66,  0x66, 0x66, 0x66, 0x3c},  //0
  {0x18, 0x38, 0x18, 0x18,  0x18, 0x18, 0x18, 0x7e},  //1
  {0x7c, 0x06, 0x06, 0x06,  0x0c, 0x18, 0x30, 0x7e},  //2
  {0x7c, 0x06, 0x06, 0x3c,  0x06, 0x06, 0x06, 0x7c},  //3
  {0x06, 0x0e, 0x1e, 0x36,  0x66, 0x7e, 0x06, 0x06},  //4
  {0x7e, 0x60, 0x60, 0x7c,  0x06, 0x06, 0x06, 0x7c},  //5
  {0x1c, 0x30, 0x60, 0x7c,  0x66, 0x66, 0x66, 0x3c},  //6
  {0x7e, 0x06, 0x06, 0x0c,  0x0c, 0x18, 0x18, 0x18},  //7
  {0x3c, 0x66, 0x66, 0x3c,  0x66, 0x66, 0x66, 0x3c},  //8
  {0x3c, 0x66, 0x66, 0x66,  0x3e, 0x06, 0x0c, 0x38}   //9
 
 
};

void loop() 
{  
  
  int channel = 12;
 showNumber() ;
}          
                 
                                                                                         
void showNumber() 
{  
  if(channel / 10 == 1)
  
  {
        int e  = channel % 10;
        for(int i = 0; i < 8; i ++) //листает строки
        {
           LC.setRow(2, i, CountDigits[e][i]);
        }
    int j = 1;
    for(int i = 0; i < 8; i ++) //листает строки
    {
                                                  
     LC.setRow(3, i, CountDigits[j][i]);// команда вывода массива
    }                                                                                
   }
  else{
        int e  = channel % 10;
        for(int i = 0; i < 8; i ++) //листает строки
        {
           LC.setRow(2, i, CountDigits[e][i]);
        }
   
     } 
  }      
 
[/code]


 Здравствуйте ,вот, но только как в фукцию перенес весь код так все престало работать а понять не могу в чем дело 

 

vk007
Offline
Зарегистрирован: 16.06.2015

Ну ничего, хоть что-то, начало положено. Давайте корректировать. Для начала начнем с объявления функции.

В двух словах, функция - это блок кода, который мы можем вызвать из основной программы неоднократно. При каждом вызове функция может делать одно и то же действие, а еще может выполнять действия, в зависимости от того, что мы ей подсунем. И в данном случае нас интересует второе - выводить разные числа. Но откуда функция будет знать, какое число она должна вывести? А вот это мы и будем указывать с качестве входящего параметра. Например, знакомая функция delay. Вызывается, например, как delay(1000); Т.е. результатом вызова будет пауза 1000 мс. А если написать delay(200); - то 200 мс. Т.е. числа 1000 и 200 - это как раз и являются входным параметром для функции delay(). Ну а нам надо в качестве параметра надо передавать число, которое мы хотим увидеть на табло.

vk007
Offline
Зарегистрирован: 16.06.2015

Так вот, объявлять нашу функцию правильно так:

void showNumber(byte number)
{
// тут тело функции
}

Переменная number будет принимать то значение, которое мы напишем при вызове нашей функции.
Например, напишем в программе showNumber(12); значит number будет равно 12 и дальше в функции мы будем его анализировать и обрабатывать.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

я понял тоест в нашем случе будет переменная channel

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

тогда и  в функции придеться все поменять на number?

 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

тогда и  в функции придеться все поменять на number?

 

vk007
Offline
Зарегистрирован: 16.06.2015

Ну давайте для ясности в основной программе оставим channel, а в функции number. Это все-таки разные переменные. Хотя для справедливости надо сказать их можно называть одинаково, но это вас запутает окончательно. Не будем этого делать. Еще раз - это разные переменные.

vk007
Offline
Зарегистрирован: 16.06.2015

Вот кстати, у вас в строке 13 объявлена глобальной переменная channel: int channel;

А в строке 48 объявлена локальная переменная тоже с именем channel, int channel = 12;

И поверьте - это две разные переменные с одинаковым именем.

Удалите строку 13.

Точно то же касается переменной j.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

вот как , я не знал об этом 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
void loop() 
{  
  
  byte number = 12;
 showNumber(byte number) ;
}          
                 
                                                                                         
void showNumber(byte number) 
{  
  if(number / 10 == 1)
  
  {
        int e  = number % 10;
        for(int i = 0; i < 8; i ++) //листает строки
        {
           LC.setRow(2, i, CountDigits[e][i]);
        }
    int j = 1;
    for(int i = 0; i < 8; i ++) //листает строки
    {
                                                  
     LC.setRow(3, i, CountDigits[j][i]);// команда вывода массива
    }                                                                                
   }
  else{
        int e  = number % 10;
        for(int i = 0; i < 8; i ++) //листает строки
        {
           LC.setRow(2, i, CountDigits[e][i]);
        }
   
     } 
  }      

компилятор на number вот тут ругаетьсяshowNumber(byte number) 

vk007
Offline
Зарегистрирован: 16.06.2015

Теперь объявили функцию вы правильно, но как вы ее вызываете??? Прочитайте внимательно мое сообщение #263.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

все теперь понятно , разобрался 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

ли бо же так как у нас будут меняться  значения мы можем там поставить переменную а в переменную передовать значения ?

vk007
Offline
Зарегистрирован: 16.06.2015

Я писал, давайте не будем давать переменным одинаковые имена, хоть они и в разных блоках. А вы и в loop и в нашей функции используете две переменные с одинаковыми именами number. Запутаетесь довольно быстро!

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

это 04 строка ? я ее удолил она же нам пока без надобности 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
[code]
void loop() 
{  
  
 showNumber(16) ;
}          
                 
                                                                                         
void showNumber(byte number) 
{  
  if(number / 10 == 1)
  
  {
        int e  = number % 10;
        for(int i = 0; i < 8; i ++) //листает строки
        {
           LC.setRow(2, i, CountDigits[e][i]);
        }
    int j = 1;
    for(int i = 0; i < 8; i ++) //листает строки
    {
                                                  
     LC.setRow(3, i, CountDigits[j][i]);// команда вывода массива
    }                                                                                
   }
  else{
        int e  = number % 10;
        for(int i = 0; i < 8; i ++) //листает строки
        {
           LC.setRow(2, i, CountDigits[e][i]);
        }
   
     } 
  }      

[/code]

 

vk007
Offline
Зарегистрирован: 16.06.2015

Уже лучше, но для понимания лучше было бы переменную, в которой записано число, оставить. В вашем проекте ведь числа будут выводиться разные, а не только 16.

byte channel = 16;
showNumber(channel);

 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

хорошо я понял 

vk007
Offline
Зарегистрирован: 16.06.2015

ОК. С вызовом, надеюсь, разобрались. Давайте приступим к самой функции. Попробуйте дописать в функции свои комментарии к каждой строке, как вы понимаете там все должно работать.
Сюда пишите только код функции, не надо все программу, т.е.

void showNumber(byte number)
{
  // тут код
}

И еще, если вы пишете код в самой Arduino IDE, а не в каком-то постороннем редакторе, то желательно перед его копированием и вставкой сюда форматируйте его (Ctrl+T). Тогда правильно выставятся отступы и будет легче его читать.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
[code]
void showNumber(byte number) //  имя функции с входными данными в скобках
{  
  if(number / 10 == 1)      // тут мы сравниваем даные для то го чтобы выводить  десятки или нет , тоесть есть переменная  бльше 10 то выполняем код , если нет то идем дальше 
  
  {
        int e  = number % 10;                            // определяем  остаток  от деленя чтобы выводить в переменую еденицы с адресом для буфера 
        for(int i = 0; i < 8; i ++)                      //листает строки  из бувера 
        {
           LC.setRow(2, i, CountDigits[e][i]);         // выводим вс на матрицу  еденицы 
        }
    int j = 1;                                         // так как у нас  значение десятков не будет првышать больше десяти то в переменную для буфере заносим 1 , так как в условии эта часть кода будет выполняться при значенияю бльше деясти 
    for(int i = 0; i < 8; i ++) //листает строки        // листаем строки  символа  
    {
                                                  
     LC.setRow(3, i, CountDigits[j][i]);           //     выводим в матрицу с номером матрици 
    }                                                                                
   }
  else{
        int e  = number % 10;                            // а если у нас значения меньше десять то выводим только еденицы 
        for(int i = 0; i < 8; i ++)                   //листает строки
        {
           LC.setRow(2, i, CountDigits[e][i]);    // выводим в матрицу 
        }
   
     } 
  }      

[/code]

 

vk007
Offline
Зарегистрирован: 16.06.2015

Ну ОК, ваша мысль мне ясна. Пошли дальше. Попробуйте теперь скомпилировать скетч и посмотреть, что будет на матрице. Полный скетч выложите здесь.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
[code]
#include "LedControl.h"

#define EN 3
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define SIG A0

LedControl LC = LedControl(12, 11, 10, 4);
byte channel;

void setup()
{
  Serial.begin(9600);

  for (byte i = 0; i < 4; i++)  //цик котрый обращаеться каждой из матриц
  {
    LC.shutdown(i, false); //отключени энергосберегающего режима
    LC.setIntensity(i, 8); // установка яркости
    LC.clearDisplay(i);    // очистка матрицы
  }

  pinMode(S0, OUTPUT); // определение пина  на выход
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);

  digitalWrite(S0, LOW); // запись в пин низкого уровня
  digitalWrite(S1, LOW);
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);

  pinMode(EN, OUTPUT);      // пин которы определяет чтение с мултика
  digitalWrite(EN, LOW);    // запись низкого уровня
}


byte CountDigits[10][8] =
{
  {0x3c, 0x66, 0x66, 0x66,  0x66, 0x66, 0x66, 0x3c},  //0
  {0x18, 0x38, 0x18, 0x18,  0x18, 0x18, 0x18, 0x7e},  //1
  {0x7c, 0x06, 0x06, 0x06,  0x0c, 0x18, 0x30, 0x7e},  //2
  {0x7c, 0x06, 0x06, 0x3c,  0x06, 0x06, 0x06, 0x7c},  //3
  {0x06, 0x0e, 0x1e, 0x36,  0x66, 0x7e, 0x06, 0x06},  //4
  {0x7e, 0x60, 0x60, 0x7c,  0x06, 0x06, 0x06, 0x7c},  //5
  {0x1c, 0x30, 0x60, 0x7c,  0x66, 0x66, 0x66, 0x3c},  //6
  {0x7e, 0x06, 0x06, 0x0c,  0x0c, 0x18, 0x18, 0x18},  //7
  {0x3c, 0x66, 0x66, 0x3c,  0x66, 0x66, 0x66, 0x3c},  //8
  {0x3c, 0x66, 0x66, 0x66,  0x3e, 0x06, 0x0c, 0x38}   //9


};
void loop()
{
  byte controlPin[] = { S0, S1, S2, S3 }; //массив кторый определеться сам с размером , 4 пина адресной шины мультиплексора
  for (byte i = 0; i < 4; i ++)           // цикл котрый крутит ячейки массива
  {
    digitalWrite(controlPin[i], bitRead(channel, i)); // digitalWrite(S0, bitRead(channel, 0)); установит на пине, указанном в S0,
    //состояние, которое определяется с помощью bitRead(channel, 0).
    // Так вот bitRead "пристально вглядывыется" в число, что находится в переменной channel,
    //а конкретно "смотрит" в данном примере на его нулевой бит. И если он будет равен 1,
    //то digitalWrite на пине S0 (в данном случае) выставит высокий уровень, т.е. 1 (HIGH).
    // Если же бит будет равен 0, то и на пине выставится 0 (LOW).
  }

  int val = analogRead(SIG); // считываем данные спорта и записываем в переменную
  val = constrain(val, 0, 700); //  значение, так чтобы оно была в области допустимых значений, заданной параметрами.
  val = map(val, 0, 700, 0, 8); //математическая функция где val переменая получает данные с порта , преобразует в диапозн текуший , и преабразует в диапазан с задаными параметрами
  LC.setColumn(channel / 8, channel % 8, 255 >> (8 - val)); //вывод на матрицы 
 
   showNumber(channel) ;

  //x     x/8      x%8  / - это целочисленное деление, т.е. остается только целая часть  
  //0      0       0    % - это, наоборот, как раз "хвост" от деления.                                                   
  //1      0       1    >> - это оператор побитового сдвига
  //2      0       2
  //3      0       3    В функции LC.setColumn в первом параметре указывается номер матрицы, на котрую выводим данные (от 0 до 3 в нашем случае).
  //4      0       4    Второй параметр - это номер столбца в этой матрице (может принимать значение от 0 до 7, т.к. в каждой матрице всего восемь столбцов).
  //5      0       5    Третий параметр - это непосредственно сами данные для отображения столбца.
  //6      0       6
  //7      0       7    В нашем случае, за исходные данные берем полностью "горящий" столбик, т.е. все точки зажжены или все биты
  //8      1       0    установлены в 1 - 11111111 (число 255 в десятичном виде). Если сдвигать этот столбик вправо (>>), то единички будут
  //9      1       1    двигаться в направлении младшего бита (вправо), а в сташем бите будет появляться 0. Например, сдвинули 11111111
  //10     1       2    вправо на один раз - получили 01111111. Сдинули 11111111 вправо на пять раз - получили 00000111. Т.е., чем больше
  //11     1       3    сдвигаем, тем короче столбик. Но, так как в нашем случае надо, чем больше значение переменной val, тем длиннее
  //12     1       4    столбик (а значит надо меньше его двигать), то мы используем формулу 8 - val. Чем будет больше val, тем меньше
  //13     1       5    сдвинется столбик.
  //14     1       6
  //15     1       7    С целочисленным делением ( / ), думаю, что понятно. Одно число делим на второе,
  //16     2       0    дробную часть игнорируем и, как результат, оставляем только целую часть.
  //17     2       1    Теперь с оператором %. Тут все с точностью до наоборот. Тут целая часть игнорируется,
  //                    а результатом операции будет то, что останется от деления.
  //                    Например, 11 % 5. Представляем себе как 11 = 5 * 2 + 1. Т.е. число 5 в числе 11 "уместится" дважды
  //                    и еще плюс единица. Вот эта единица и будет результатом этой операции.
  //                    Или другой пример: 25 % 7 записываем как 25 = 7 * 3 + 4. Т.е. результат: 4.

  // и тд
  channel++;                       //прибавляем по еденице
  if (channel == 16) channel = 0; // оператор сравнения ,если  переменная == 16 ,то  обнуляем  ,channel- номер канала c мультиплексора
}



void showNumber(byte number) //  имя функции с входными данными в скобках
{
  if (number / 10 == 1)     // тут мы сравниваем даные для то го чтобы выводить  десятки или нет , тоесть есть переменная  бльше 10 то выполняем код , если нет то идем дальше

  {
    int e  = number % 10;                            // определяем  остаток  от деленя чтобы выводить в переменую еденицы с адресом для буфера
    for (int i = 0; i < 8; i ++)                     //листает строки  из бувера
    {
      LC.setRow(2, i, CountDigits[e][i]);         // выводим  на матрицу  еденицы
    }
    int j = 1;                                         // так как у нас  значение десятков не будет првышать больше десяти то в переменную для буфере заносим 1 , так как в условии эта часть кода будет выполняться при значенияю бльше деясти
    for (int i = 0; i < 8; i ++) //листает строки        // листаем строки  символа
    {

      LC.setRow(3, i, CountDigits[j][i]);           //     выводим в матрицу с номером матрици
    }
  }
  else {
    int e  = number % 10;                            // а если у нас значения меньше десять то выводим только еденицы
    for (int i = 0; i < 8; i ++)                  //листает строки
    {
      LC.setRow(2, i, CountDigits[e][i]);    // выводим в матрицу
    }

  }
}

[/code]

Страшное  дело что происходит 

vk007
Offline
Зарегистрирован: 16.06.2015

Не, не до такой степени :) Торопитесь. Мы еще не закончили с выводом цифр.

В loop напишите только

byte channel = 16;
showNumber(channel);

 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

аааааа так это я уже проверял все работает так как надо 

vk007
Offline
Зарегистрирован: 16.06.2015

Уверены? Тогда ответьте, что должно показываться на экране и что показывается на самом деле?

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

на самом деле и показывает 16 и 17 даже  и еденицы без ноля

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

яже сразу вывожу и записываю в ардуинку и на матрице смотрю , у меня вся подключено сразу 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

20 покзывает как ноль 

vk007
Offline
Зарегистрирован: 16.06.2015

Ясно. Тогда, чтобы я понял, как у вас подключены матрицы, скажите пожалуйста, на каких матрицах в реальности у вас показываются цифры? А также, на каких матрицах показывались столбики?

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

cs   d10

clk   d11

din   d12

vk007
Offline
Зарегистрирован: 16.06.2015

Нет, я не о том. У вас всего 4 матрицы. Слева - направо: 1-я, 2-я, 3-я, 4-я. Цифры на каких видно, на 1-2 или 3-4? И столбики на каких были видны?

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

1я и 2я  циферки , 3я и4я столбики , все как и задумывалось (с лева на право )

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

я кода вот последнию кашу залил , столбики работали а цыфры с большой скорость матало по кругу 

vk007
Offline
Зарегистрирован: 16.06.2015

Понятно, у меня немного другие матрицы и подключены они иначе, и я привык к такому расположению. Теперь буду знать, т.е. у вас получается по номерам матрицы идут как 3, 2, 1, 0. Тогда нам надо будет подкорректировать вывод столбцов, потому как сейчас канал 0 отображается самым правым, а самым левым - канал 15. Это мы сделаем потом, а сейчас вернемся и подчистим вывод цифр.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

хорошо )

vk007
Offline
Зарегистрирован: 16.06.2015

Сейчас ваш алгоритм таков: из числа number вы выделяете десятки и сравниваете их с 1 и, если там действительно 1, то вы выводите на экран единицы и десятки. А если какое-то другое число получилось, то только единицы. Это немного неправильно.

1) Вот смотрите, вызвали вы, например, функцию чтобы вывести на экран число 13 - оно отобразилось (1 на первой матрице, 3 - на второй). Потом возникла необходимость вывести число 5. Что мы ожидаем получить на экране? Число 5. Но там будет 15. А все потому, что единица останется от 13. Ведь мы ее так и оставили светиться на первой матрице, а надо было бы ее оттуда убрать.

2) Если передать в фунцию числа от 20 до 99, то выведутся только единицы, а десятки - нет. Для вашей задачи это не требуется - у вас диапазон ограничен шестнадцатью числами, но лучше сделать вывод универсальным, тем более, что изменить в коде надо всего ничего.

3) Ну и вы не учитываете то, что нам в любом случае надо выводить единицы. Тогда зачем код для их вывода повторять дважды - и в блоке "if" (если условие сработает), и снова его же в блоке "else"?

Я вам предложу немного другой алгоритм, он и короче и работает правильно:
1. Вычисляем единицы числа и выводим их на соответствующую матрицу.
2. Проверяем число на "меньше 10" - if(number < 10) и если это так, то очищаем матрицу (ту, куда выводятся десятки). Иначе в эту матрицу вычисляем и выводим десятки.

Вот и весь алгоритм. Пробуйте переписать функцию.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
void showNumber(byte number)
{
  int e  = number % 10;
  for (int i = 0; i < 8; i ++)
  {
    LC.setRow(2, i, CountDigits[e][i]);
  }
  if (number < 10 ) LC.clearDisplay(0);


  else
  {
    int j = number / 10;
    for (int i = 0; i < 8; i ++)
      LC.setRow(3, i, CountDigits[j][i]);
  }
}

 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

и правда просто и функцинонально 

vk007
Offline
Зарегистрирован: 16.06.2015

1) Почему LC.clearDisplay(0);? У вас же десятки выводятся не на нулевую матрицу, а на 3.

2) Не принципиально, но... Вы полным ходом используете тип int. Но ведь у вас все числа положительные и меньше 255 (причем значительно). Зачем тратить лишнюю память? Тут везде типа byte хватит с запасом. Если программа несложная, то это не принципиально, но с ростом сложности программы, особенно, если применяются посторонние библиотеки и классы String и подобные, проблема нехватки памяти начинает сильно тревожить. И тогда начинается ловля блох - где бы чего урезать, чтобы хватило памяти.

3) У вас есть переменные e и j. Это вы сейчас помните, что они значат, а через некоторое время вспомните? Старайтесь давать переменным осмысленные имена, от этого размер кода не зависит. В данном случае вместо e и j подошли бы имена ones (единицы) и tens (десятки), да хотя бы edinicy и desyatki, если с английским не очень. Ну i - это классика, все понимают, что это простой счетчик, обычно используемый в циклах.

В данном случае без e и j можно вообще обойтись, поскольку в коде они упоминаются всего по одному разу. Например, вместо CountDigits[e][i] можно сразу писать CountDigits[number % 10][i]. Но если вам так будет тяжело понять код, то пускай остается как есть.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

Очень полезные замечания , я все исправил  и конечно же я бы не вспомнил бы через время , я сейчас просто очень сильно сосредотачиваюсь на вычислениях и их устройствах , так что я стараюсь коспектировать по максимуму и впитывать все