Нет, совсем не то. Сейчас мы применили / и % чтобы разделить число на десятки и единицы, а в 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).
[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]
Здравствуйте ,вот, но только как в фукцию перенес весь код так все престало работать а понять не могу в чем дело
Ну ничего, хоть что-то, начало положено. Давайте корректировать. Для начала начнем с объявления функции.
В двух словах, функция - это блок кода, который мы можем вызвать из основной программы неоднократно. При каждом вызове функция может делать одно и то же действие, а еще может выполнять действия, в зависимости от того, что мы ей подсунем. И в данном случае нас интересует второе - выводить разные числа. Но откуда функция будет знать, какое число она должна вывести? А вот это мы и будем указывать с качестве входящего параметра. Например, знакомая функция delay. Вызывается, например, как delay(1000); Т.е. результатом вызова будет пауза 1000 мс. А если написать delay(200); - то 200 мс. Т.е. числа 1000 и 200 - это как раз и являются входным параметром для функции delay(). Ну а нам надо в качестве параметра надо передавать число, которое мы хотим увидеть на табло.
void showNumber(byte number)
{
// тут тело функции
}
Переменная number будет принимать то значение, которое мы напишем при вызове нашей функции.
Например, напишем в программе showNumber(12); значит number будет равно 12 и дальше в функции мы будем его анализировать и обрабатывать.
Ну давайте для ясности в основной программе оставим channel, а в функции number. Это все-таки разные переменные. Хотя для справедливости надо сказать их можно называть одинаково, но это вас запутает окончательно. Не будем этого делать. Еще раз - это разные переменные.
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)
Я писал, давайте не будем давать переменным одинаковые имена, хоть они и в разных блоках. А вы и в loop и в нашей функции используете две переменные с одинаковыми именами number. Запутаетесь довольно быстро!
[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]
Уже лучше, но для понимания лучше было бы переменную, в которой записано число, оставить. В вашем проекте ведь числа будут выводиться разные, а не только 16.
ОК. С вызовом, надеюсь, разобрались. Давайте приступим к самой функции. Попробуйте дописать в функции свои комментарии к каждой строке, как вы понимаете там все должно работать.
Сюда пишите только код функции, не надо все программу, т.е.
void showNumber(byte number)
{
// тут код
}
И еще, если вы пишете код в самой Arduino IDE, а не в каком-то постороннем редакторе, то желательно перед его копированием и вставкой сюда форматируйте его (Ctrl+T). Тогда правильно выставятся отступы и будет легче его читать.
[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]
[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]
Ясно. Тогда, чтобы я понял, как у вас подключены матрицы, скажите пожалуйста, на каких матрицах в реальности у вас показываются цифры? А также, на каких матрицах показывались столбики?
Понятно, у меня немного другие матрицы и подключены они иначе, и я привык к такому расположению. Теперь буду знать, т.е. у вас получается по номерам матрицы идут как 3, 2, 1, 0. Тогда нам надо будет подкорректировать вывод столбцов, потому как сейчас канал 0 отображается самым правым, а самым левым - канал 15. Это мы сделаем потом, а сейчас вернемся и подчистим вывод цифр.
Сейчас ваш алгоритм таков: из числа number вы выделяете десятки и сравниваете их с 1 и, если там действительно 1, то вы выводите на экран единицы и десятки. А если какое-то другое число получилось, то только единицы. Это немного неправильно.
1) Вот смотрите, вызвали вы, например, функцию чтобы вывести на экран число 13 - оно отобразилось (1 на первой матрице, 3 - на второй). Потом возникла необходимость вывести число 5. Что мы ожидаем получить на экране? Число 5. Но там будет 15. А все потому, что единица останется от 13. Ведь мы ее так и оставили светиться на первой матрице, а надо было бы ее оттуда убрать.
2) Если передать в фунцию числа от 20 до 99, то выведутся только единицы, а десятки - нет. Для вашей задачи это не требуется - у вас диапазон ограничен шестнадцатью числами, но лучше сделать вывод универсальным, тем более, что изменить в коде надо всего ничего.
3) Ну и вы не учитываете то, что нам в любом случае надо выводить единицы. Тогда зачем код для их вывода повторять дважды - и в блоке "if" (если условие сработает), и снова его же в блоке "else"?
Я вам предложу немного другой алгоритм, он и короче и работает правильно:
1. Вычисляем единицы числа и выводим их на соответствующую матрицу.
2. Проверяем число на "меньше 10" - if(number < 10) и если это так, то очищаем матрицу (ту, куда выводятся десятки). Иначе в эту матрицу вычисляем и выводим десятки.
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]);
}
}
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]. Но если вам так будет тяжело понять код, то пускай остается как есть.
Очень полезные замечания , я все исправил и конечно же я бы не вспомнил бы через время , я сейчас просто очень сильно сосредотачиваюсь на вычислениях и их устройствах , так что я стараюсь коспектировать по максимуму и впитывать все
Итак, повторю вопрос:
x = 14 / 10;
и
y = 14 % 10;
Чему будут равны x и y?
P.S. Новая страница в нашем обсуждении. Надеюсь вы увидели мое предыдущее сообщение.
x=14/10+4
y=10*1+4
Нет, раскладывать не надо, я это приводил только для понимания. Просто напишите, чему будут равны х и у?
x=1
y=4
LC.setColumn(channel / 10, channel % 10, CountDigits[j][i]); так?
Вот, то, что надо. Надеюсь, что не угадали, а все-таки поняли.
Т.е. разделив любое целое число от 0 до 99 нацело с помощью / мы получим десятки, а применив оператор % - получим единицы.
Десятки нам надо вывести на матрицу 2, а единицы на матрицу 3.
Попробуйте сначала написать просто скетч, и уже потом вывод числа оформите в виде функции. А я уже завтра посмотру, что у вас получилось.
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).
спасибо ,за урок , попробую разобраться дальне но пока совсем запутался ,
В общем, пока разбирайтесь. Завтра посмотрим, что получится.
И, если заметили, то я бывает правлю свои последние сообщения, чтобы что-то уточнить или дополнить. Обращайте на это внимание.
спасибо учту
Ну ничего, хоть что-то, начало положено. Давайте корректировать. Для начала начнем с объявления функции.
В двух словах, функция - это блок кода, который мы можем вызвать из основной программы неоднократно. При каждом вызове функция может делать одно и то же действие, а еще может выполнять действия, в зависимости от того, что мы ей подсунем. И в данном случае нас интересует второе - выводить разные числа. Но откуда функция будет знать, какое число она должна вывести? А вот это мы и будем указывать с качестве входящего параметра. Например, знакомая функция delay. Вызывается, например, как delay(1000); Т.е. результатом вызова будет пауза 1000 мс. А если написать delay(200); - то 200 мс. Т.е. числа 1000 и 200 - это как раз и являются входным параметром для функции delay(). Ну а нам надо в качестве параметра надо передавать число, которое мы хотим увидеть на табло.
Так вот, объявлять нашу функцию правильно так:
Переменная number будет принимать то значение, которое мы напишем при вызове нашей функции.
Например, напишем в программе showNumber(12); значит number будет равно 12 и дальше в функции мы будем его анализировать и обрабатывать.
я понял тоест в нашем случе будет переменная channel
тогда и в функции придеться все поменять на number?
тогда и в функции придеться все поменять на number?
Ну давайте для ясности в основной программе оставим channel, а в функции number. Это все-таки разные переменные. Хотя для справедливости надо сказать их можно называть одинаково, но это вас запутает окончательно. Не будем этого делать. Еще раз - это разные переменные.
Вот кстати, у вас в строке 13 объявлена глобальной переменная channel: int channel;
А в строке 48 объявлена локальная переменная тоже с именем channel, int channel = 12;
И поверьте - это две разные переменные с одинаковым именем.
Удалите строку 13.
Точно то же касается переменной j.
вот как , я не знал об этом
компилятор на number вот тут ругаетьсяshowNumber(byte number)
Теперь объявили функцию вы правильно, но как вы ее вызываете??? Прочитайте внимательно мое сообщение #263.
все теперь понятно , разобрался
ли бо же так как у нас будут меняться значения мы можем там поставить переменную а в переменную передовать значения ?
Я писал, давайте не будем давать переменным одинаковые имена, хоть они и в разных блоках. А вы и в loop и в нашей функции используете две переменные с одинаковыми именами number. Запутаетесь довольно быстро!
это 04 строка ? я ее удолил она же нам пока без надобности
Уже лучше, но для понимания лучше было бы переменную, в которой записано число, оставить. В вашем проекте ведь числа будут выводиться разные, а не только 16.
хорошо я понял
ОК. С вызовом, надеюсь, разобрались. Давайте приступим к самой функции. Попробуйте дописать в функции свои комментарии к каждой строке, как вы понимаете там все должно работать.
Сюда пишите только код функции, не надо все программу, т.е.
И еще, если вы пишете код в самой Arduino IDE, а не в каком-то постороннем редакторе, то желательно перед его копированием и вставкой сюда форматируйте его (Ctrl+T). Тогда правильно выставятся отступы и будет легче его читать.
Ну ОК, ваша мысль мне ясна. Пошли дальше. Попробуйте теперь скомпилировать скетч и посмотреть, что будет на матрице. Полный скетч выложите здесь.
Страшное дело что происходит
Не, не до такой степени :) Торопитесь. Мы еще не закончили с выводом цифр.
В loop напишите только
аааааа так это я уже проверял все работает так как надо
Уверены? Тогда ответьте, что должно показываться на экране и что показывается на самом деле?
на самом деле и показывает 16 и 17 даже и еденицы без ноля
яже сразу вывожу и записываю в ардуинку и на матрице смотрю , у меня вся подключено сразу
20 покзывает как ноль
Ясно. Тогда, чтобы я понял, как у вас подключены матрицы, скажите пожалуйста, на каких матрицах в реальности у вас показываются цифры? А также, на каких матрицах показывались столбики?
cs d10
clk d11
din d12
Нет, я не о том. У вас всего 4 матрицы. Слева - направо: 1-я, 2-я, 3-я, 4-я. Цифры на каких видно, на 1-2 или 3-4? И столбики на каких были видны?
1я и 2я циферки , 3я и4я столбики , все как и задумывалось (с лева на право )
я кода вот последнию кашу залил , столбики работали а цыфры с большой скорость матало по кругу
Понятно, у меня немного другие матрицы и подключены они иначе, и я привык к такому расположению. Теперь буду знать, т.е. у вас получается по номерам матрицы идут как 3, 2, 1, 0. Тогда нам надо будет подкорректировать вывод столбцов, потому как сейчас канал 0 отображается самым правым, а самым левым - канал 15. Это мы сделаем потом, а сейчас вернемся и подчистим вывод цифр.
хорошо )
Сейчас ваш алгоритм таков: из числа number вы выделяете десятки и сравниваете их с 1 и, если там действительно 1, то вы выводите на экран единицы и десятки. А если какое-то другое число получилось, то только единицы. Это немного неправильно.
1) Вот смотрите, вызвали вы, например, функцию чтобы вывести на экран число 13 - оно отобразилось (1 на первой матрице, 3 - на второй). Потом возникла необходимость вывести число 5. Что мы ожидаем получить на экране? Число 5. Но там будет 15. А все потому, что единица останется от 13. Ведь мы ее так и оставили светиться на первой матрице, а надо было бы ее оттуда убрать.
2) Если передать в фунцию числа от 20 до 99, то выведутся только единицы, а десятки - нет. Для вашей задачи это не требуется - у вас диапазон ограничен шестнадцатью числами, но лучше сделать вывод универсальным, тем более, что изменить в коде надо всего ничего.
3) Ну и вы не учитываете то, что нам в любом случае надо выводить единицы. Тогда зачем код для их вывода повторять дважды - и в блоке "if" (если условие сработает), и снова его же в блоке "else"?
Я вам предложу немного другой алгоритм, он и короче и работает правильно:
1. Вычисляем единицы числа и выводим их на соответствующую матрицу.
2. Проверяем число на "меньше 10" - if(number < 10) и если это так, то очищаем матрицу (ту, куда выводятся десятки). Иначе в эту матрицу вычисляем и выводим десятки.
Вот и весь алгоритм. Пробуйте переписать функцию.
и правда просто и функцинонально
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]. Но если вам так будет тяжело понять код, то пускай остается как есть.
Очень полезные замечания , я все исправил и конечно же я бы не вспомнил бы через время , я сейчас просто очень сильно сосредотачиваюсь на вычислениях и их устройствах , так что я стараюсь коспектировать по максимуму и впитывать все