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

есть программа часов на модуле ds1302 и четырех матрицах MAX7219
#include <iarduino_Encoder_tmr.h>
iarduino_Encoder_tmr enc(5, 6);
#include <DS1302.h>
DS1302 rtc(2, 3, 4); //CE, I/O, SCLK
#include <LedControl.h>
int DIN = 13;
int CS = 12;
int CLK = 11;
byte N[10][4] = { { 62, 65, 65, 62 }, //масив знаков 0-9
{ 0, 127, 2, 0 },
{ 70, 73, 81, 98 },
{ 54, 73, 65, 34 },
{ 127, 8, 8, 15 },
{ 57, 69, 69, 39 },
{ 48, 73, 73, 62 },
{ 7, 25, 97, 1 },
{ 54, 73, 73, 54 },
{ 62, 73, 73, 6 } };
byte nn[10][3] = { { 60, 66, 60 }, //масив знаков 0-9
{ 0, 126, 4 },
{ 76, 82, 100 },
{ 52, 74, 66 },
{ 126, 8, 14 },
{ 50, 74, 78 },
{ 50, 74, 60 },
{ 14, 114, 2 },
{ 52, 74, 52 },
{ 60, 82, 76 } };
byte IND[6][4];
byte k[6];
byte s[6]{ 10, 10, 10, 10, 10, 10 };

int a;
byte hour_;
byte minute_;
byte second_;
LedControl lc = LedControl(DIN, CLK, CS, 4); // установка входов/выходов и количества матриц в индикаторе

void setup() {
lc.shutdown(0, false);
lc.shutdown(1, false);
lc.shutdown(2, false);
lc.shutdown(3, false);
lc.setIntensity(0, 1); // установка яркости матрици
lc.setIntensity(1, 1);
lc.setIntensity(2, 1);
lc.setIntensity(3, 1);
Serial.begin(9600);
enc.begin(); // Инициируем работу с энкодером
// rtc.halt(false);//Управление флагом СН (запуск-останов часов).true: Установить флаг CH. false: очистить флаг CH
/* Когда флаг установлен, тактовый генератор останавливается и DS1302 находится в режиме ожидания с низким энергопотреблением с током менее 100nA. Если флаг сбрасывается, часы начинают отсчет времени.*/
// rtc.writeProtect(false);//Установка или сброс WP-бита. true: Установить WP-бит. false: Сбросить WP бит. WP: (Write-Protect) бит. Блокирует запись информации в DS1302
// rtc.setDOW(FRIDAY); // Set Day-of-Week to FRIDAY
// rtc.setTime(20, 52, 0); // Set the time to 12:00:00 (24hr format)
// rtc.setDate(19, 2, 2017); // Set the date to August 6th, 2010
lc.setColumn(1, 5, 128);
}

void loop() {
String stringOne = rtc.getTimeStr(FORMAT_LONG); // Считываем из DS1302 в строку stringOne
// Serial.println(stringOne);
k[0] = stringOne.charAt(7) - 48;
k[1] = stringOne.charAt(6) - 48;
k[2] = stringOne.charAt(4) - 48;
k[3] = stringOne.charAt(3) - 48;
k[4] = stringOne.charAt(1) - 48;
k[5] = stringOne.charAt(0) - 48;

if (k[0] != s[0] | k[1] != s[1] | k[2] != s[2] | k[3] != s[3] | k[4] != s[4] | k[5] != s[5]) printType(N, nn, IND, k, s);

a = enc.read(); // Читаем состояние энкодера в переменную a
if (a) { // Если энкодер зафиксировал поворот, то …
if (a == encRIGHT) {
hour_ = k[5] * 10 + k[4] + 1;
if (hour_ > 23) hour_ = 0;
minute_ = k[3] * 10 + k[2];
second_ = k[1] * 10 + k[0];
rtc.setTime(hour_, minute_, second_);
}
if (a == encLEFT) {
hour_ = k[5] * 10 + k[4];
minute_ = k[3] * 10 + k[2] + 1;
if (minute_ > 59) minute_ = 0;
second_ = k[1] * 10 + k[0];
rtc.setTime(hour_, minute_, second_);
}
}
s[0] = k[0];
s[1] = k[1];
s[2] = k[2];
s[3] = k[3];
s[4] = k[4];
s[5] = k[5];
}
void printType(byte N[10][4], byte nn[10][3], byte IND[6][4], byte k[6], byte s[6]) {
byte m;
if (k[0] != s[0]) {
for (m = 8; m > 0; m–) {
IND[0][0] = (IND[0][0] << 1) | (nn[k[0]][0] >> m - 1);
IND[0][1] = (IND[0][1] << 1) | (nn[k[0]][1] >> m - 1);
IND[0][2] = (IND[0][2] << 1) | (nn[k[0]][2] >> m - 1);
lc.setColumn(3, 0, IND[0][0]);
lc.setColumn(3, 1, IND[0][1]);
lc.setColumn(3, 2, IND[0][2]);
}
}
if (k[1] != s[1]) {
for (m = 8; m > 0; m–) {
IND[1][0] = (IND[1][0] << 1) | (nn[k[1]][0] >> m - 1);
IND[1][1] = (IND[1][1] << 1) | (nn[k[1]][1] >> m - 1);
IND[1][2] = (IND[1][2] << 1) | (nn[k[1]][2] >> m - 1);
lc.setColumn(3, 4, IND[1][0]);
lc.setColumn(3, 5, IND[1][1]);
lc.setColumn(3, 6, IND[1][2]);
}
}
if (k[2] != s[2]) {
for (m = 8; m > 0; m–) {
IND[2][0] = (IND[2][0] << 1) | (N[k[2]][0] >> m - 1);
IND[2][1] = (IND[2][1] << 1) | (N[k[2]][1] >> m - 1);
IND[2][2] = (IND[2][2] << 1) | (N[k[2]][2] >> m - 1);
IND[2][3] = (IND[2][3] << 1) | (N[k[2]][3] >> m - 1);
lc.setColumn(2, 3, IND[2][0]);
lc.setColumn(2, 4, IND[2][1]);
lc.setColumn(2, 5, IND[2][2]);
lc.setColumn(2, 6, IND[2][3]);
}
}
if (k[3] != s[3]) {
for (m = 8; m > 0; m–) {
IND[3][0] = (IND[3][0] << 1) | (N[k[3]][0] >> m - 1);
IND[3][1] = (IND[3][1] << 1) | (N[k[3]][1] >> m - 1);
IND[3][2] = (IND[3][2] << 1) | (N[k[3]][2] >> m - 1);
IND[3][3] = (IND[3][3] << 1) | (N[k[3]][3] >> m - 1);
lc.setColumn(1, 0, IND[3][0]);
lc.setColumn(1, 1, IND[3][1]);
lc.setColumn(1, 2, IND[3][2]);
lc.setColumn(1, 3, IND[3][3]);
}
}
if (k[4] != s[4]) {
for (m = 8; m > 0; m–) {
IND[4][0] = (IND[4][0] << 1) | (N[k[4]][0] >> m - 1);
IND[4][1] = (IND[4][1] << 1) | (N[k[4]][1] >> m - 1);
IND[4][2] = (IND[4][2] << 1) | (N[k[4]][2] >> m - 1);
IND[4][3] = (IND[4][3] << 1) | (N[k[4]][3] >> m - 1);
lc.setColumn(1, 7, IND[4][0]);
lc.setColumn(0, 0, IND[4][1]);
lc.setColumn(0, 1, IND[4][2]);
lc.setColumn(0, 2, IND[4][3]);
}
}
if (k[5] != s[5]) {
for (m = 8; m > 0; m–) {
IND[5][0] = (IND[5][0] << 1) | (N[k[5]][0] >> m - 1);
IND[5][1] = (IND[5][1] << 1) | (N[k[5]][1] >> m - 1);
IND[5][2] = (IND[5][2] << 1) | (N[k[5]][2] >> m - 1);
IND[5][3] = (IND[5][3] << 1) | (N[k[5]][3] >> m - 1);
lc.setColumn(0, 4, IND[5][0]);
lc.setColumn(0, 5, IND[5][1]);
lc.setColumn(0, 6, IND[5][2]);
lc.setColumn(0, 7, IND[5][3]);
}
}
}
Фишка этого кода :он на индикаторах позволяет плавно с верху в низ выводить на матрицу новую цифру. Я использую часовой модуль DS3231. Столкнулся с проблемой, в оригинальной программе данные из модуля считываются в строку:

String stringOne = rtc.getTimeStr(FORMAT_LONG); // Считываем из DS1302 в строку stringOne

после они раскладываются в масив k:

k[0] = stringOne.charAt(7) - 48;
k[1] = stringOne.charAt(6) - 48;
k[2] = stringOne.charAt(4) - 48;
k[3] = stringOne.charAt(3) - 48;
k[4] = stringOne.charAt(1) - 48;
k[5] = stringOne.charAt(0) - 48;

Часы нам передают восемь символов ‘10:20:30’ Часы, минуты, секунды, с разделителями. То есть из строки мы берём нулевой, первый, третий, четвёртый, шестой и седьмой символ. Отнимает от каждого символа сорок восемь и получаем из символа число цифры (от 0 до 9). Помещаем всё это в массив (k(6)) шести чисел, которые соответствуют шести цифрам.
В моей проге вытряхнуть эти даныые из моего модуля не получается (ругается компилятор). Я попробовал эти данные вытащить класичиским путем:

time.gettime(); //раскладываем переменные в масив
k[0] = time.seconds;
k[1] = time.minutes;
k[2] = time.Hours;
Но проблема в том чтобы использовать функцию вывода цифр на матрицы

void printType(byte N[10][4], byte nn[10][3], byte IND[6][4], byte k[6], byte s[6])

необходимо чтобы в каждой ячейки масива k лежал только один разряд, где в итоге получится 6 цифр(часы_минуты_секунды). Вот и вопрос, как из переменной(например) k[0] (в которую я поместил общее количиство секунд прочитаное из модуля часов) извлечь отдельно старший раз ряд секунд и отдельно младьший разряд секунд?

Десятки - делим на 10
Единицы - берём остаток от деления на 10

делением на 10?

Если (например) 54секунды / 10 = 5. А как найти потеряную 4 в младьшем разряде общего количиства секунд?

54%10=4

Спасибо , сейчас перекушу и буду пробовать.

Komandir, благодарюполучилось разложить. Выглядит вот так:

  time.gettime();    //раскладываем переменные в масив
  q = time.seconds;  //в пром-ную переменную грузим секунды
  k[1] = (q / 10);   //записываем в масив число десятков секунд
  k[0] = (q % 10);   //записываем в масив еденицы секунд
  q = time.minutes;  //в пром-ную переменную грузим минуты
  k[2] = (q / 10);   //записываем в масив число десятков минут
  k[3] = (q % 10);   //записываем в масив еденицы минут
  q = time.Hours;    //в пром-ну преременную грузим часы
  k[4] = (q / 10);   //записываем в масив число десятков часов
  k[5] = (q % 10);   //записываем в масив еденицы часов
}````

Обратные кавычки нужно ставить для оформления кода, те которые расположены на клавише с буквой Ё (и тильдой).

bukva-io

1 лайк

Понял, сорри.

Так исправь!!!

Готово

Почти справился :)))
есть отличия?

time.gettime();    //раскладываем переменные в масив
  q = time.seconds;  //в пром-ную переменную грузим секунды
  k[1] = (q / 10);   //записываем в масив число десятков секунд
  k[0] = (q % 10);   //записываем в масив еденицы секунд
  q = time.minutes;  //в пром-ную переменную грузим минуты
  k[2] = (q / 10);   //записываем в масив число десятков минут
  k[3] = (q % 10);   //записываем в масив еденицы минут
  q = time.Hours;    //в пром-ну преременную грузим часы
  k[4] = (q / 10);   //записываем в масив число десятков часов
  k[5] = (q % 10);   //записываем в масив еденицы часов
}

И всё равно, как-то не очень наглядно…
Screenshot_13

Кому было адресовано понял ))