Почему же, весьма любопытно
Туда просто всё лишнее сброшено.
//имитатор 20 светодиодов на цветном дисплее st7735 128*160
//
const unsigned char ris_1[]PROGMEM = {//РИСУНОК СВЕТОДИОДА
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XE0,0X00,0X00,0X1F,0XF8,0X00,
0X00,0X30,0X0C,0X00,0X00,0X60,0X36,0X00,0X00,0XC0,0X1B,0X00,0X00,0XC0,0X0D,0X00,
0X01,0X80,0X05,0X80,0X01,0X80,0X06,0X80,0X01,0X80,0X06,0X80,0X01,0X80,0X06,0X80,
0X01,0X80,0X06,0X80,0X01,0X80,0X06,0X80,0X01,0X80,0X06,0X80,0X01,0X80,0X06,0X80,
0X01,0X80,0X02,0X80,0X01,0X80,0X00,0X80,0X07,0XFF,0XFF,0XE0,0X04,0X00,0X00,0X20,
0X04,0X00,0X00,0X20,0X04,0X00,0X00,0X20,0X07,0XFF,0XFF,0XE0,0X07,0XFF,0XFF,0XE0,
0X00,0X00,0X00,0X00,0X00,0X30,0X0C,0X00,0X00,0X30,0X0C,0X00,0X00,0X30,0X0C,0X00,
0X00,0X30,0X0C,0X00,0X00,0X30,0X0C,0X00,0X00,0X00,0X0C,0X00,0X00,0X00,0X00,0X00
};
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
// TFT_SCL 13
// TFT_SDA 11
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
#define off tft.Color565(100,100,100)//выключен - серый цвет
#define red tft.Color565(255,0,0)//красный цвет
#define green tft.Color565(0,255,0)//зелёный цвет
#define yellow tft.Color565(255,255,0)//жёлтый цвет
#define blue tft.Color565(0,255,255)//голубой цвет
#define orange tft.Color565(255,127,0)//оранжевый цвет
#define white tft.Color565(255,255,255)//белый цвет
//функция отрисовки картинки по заданным координатам,размерам и цветам
void drawBitmapFast(int16_t x, int16_t y, const uint8_t bitmap[],
int16_t w, int16_t h, uint16_t color, uint16_t bg) {
uint8_t b(0);
uint8_t bc(0);
uint16_t tc(0);
int16_t c = w * h;
// tft.startWrite();
tft.setAddrWindow(x, y, x+w-1, y+h-1);
SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
digitalWrite(TFT_DC, HIGH);
digitalWrite(TFT_CS, LOW);
asm volatile(
"mloop_%=: \n"
" LPM %[b],%a[bm]+ \n"
" LDI %[bc],1 \n"
"loop_%=: \n"
" SBRC %[b],7 \n"
" MOVW %[tc],%[color] \n"
" SBRS %[b],7 \n"
" MOVW %[tc],%[bg] \n"
" IN __tmp_reg__,%[spdr]-1 \n"
" OUT %[spdr],%B[tc] \n"
" RJMP .+0 \n"
" RJMP .+0 \n"
" RJMP .+0 \n"
" RJMP .+0 \n"
" RJMP .+0 \n"
" RJMP .+0 \n"
" RJMP .+0 \n"
" RJMP .+0 \n"
" IN __tmp_reg__,%[spdr]-1 \n"
" OUT %[spdr],%A[tc] \n"
" SBIW %[c],1 \n"
" BREQ exit_%= \n"
" NOP \n"
" LSL %[b] \n"
" LSL %[bc] \n"
" BRCS mloop_%= \n"
" RJMP .+0 \n"
" NOP \n"
" RJMP loop_%= \n"
"exit_%=: \n"
: [tc] "=&r" (tc)
: [b] "l" (b), [bm] "z" (bitmap), [bc] "d" (bc), [color] "w" (color), [bg] "w" (bg),
[spdr] "M" (_SFR_IO_ADDR(SPDR)), [c] "w" (c)
: );
// tft.endWrite();
digitalWrite(TFT_CS, HIGH);
SPI.endTransaction();
}
//
void leds_off(){//отрисовка всех светодиодов выключенными
for(int i=0;i<160;i=i+32){
for(int j=0;j<128;j=j+32){
drawBitmapFast(i, j, ris_1, 32, 32,off,tft.Color565(0,0,0) );
}
}
}
//
void led_(byte N,uint16_t color_){//отрисовка светодиода по номеру включенным заданным цветом или выключенным
if(N>=0&&N<20){
drawBitmapFast(32*(N%5), 32*(N/5), ris_1, 32, 32,color_,tft.Color565(0,0,0) );
}
}
//
void fun_setup(){//перемещённый "сетап"
tft.initR(INITR_BLACKTAB);
tft.setRotation(3);
tft.fillScreen(ST7735_BLACK);
leds_off();//рисуем все светодиоды выключенными
}
//
Я примерно таким же способом мигаю светодиодами, показывая код ошибки.
Как Вы читаете при таком форматировании код?)
Я далёк от программирования и ещё дальше от английского. Но мне близки записи типа: F=ma;F=F1+F2+F3+…; P=mV; - поэтому пояснения на русском к каждой строке, хотя лень своё берёт. Поэтому никак не читаю, чужое и своё через N - месяцев, помню только общие идеи.
Почему-то Вам близки исключительно механические выражения
Лень писать…, а так я знаю больше
Это нелогично.
Индикатор отсутствия не должен совпадать ни с одним из допустимых значений.
Видимо никто и не может понять, чего Вы хотите, потому что Ваша формулировка внутренне противоречива.
У Вас ошибка не в коде, а ДО кода. Ошибка стадии проектирования. Невозможно написать правильный код, если в проекте ошибка.
Все там логично, если внимательно прочитать первый (#0) пост и посмотреть на результат алгоритма…
Ок, более подробно ещё раз могу рассказать по приезду домой… Мне не сложно…))
Если это очередной стеб, я не против, можно и так… Тем более, как я понял, мой вопрос уже решён (но это не точно) Если что серьёзно, то могу продолжить после рейса, как доберусь домой…
А он и не совполает. Если в конкретный момент времени нельзя выбрать ни один элемент то функция вернёт 0 и следующий её вызов снова вернёт ноль… И так будет пока не станет возможным для выбора какой либо элемент, но если продолжать нажимать при имеющейся хотя бы одном элементе готовым к выбору, функция все равно в конце всех элементов вернёт 0 и затем все по кругу…
А если будет доступен нулевой элемент - функция тоже вернет 0.
И как Вы будете различать нулевой элемент и отсутствие доступных элементов?
Народ перестаньте кормить тролля
Наконец то более менее понятно…
Но ведь моя програмка из #149 именно это и делает. "Срисовал"логику с вашей
Почему тогда
Объясните пжлст, где моя ошибка

перестаньте кормить тролля
А мне , собственно , всё равно - тролль не тролль. Я , решая задачки, (если они мне интересны) сам учусь понемногу.
Пусть даже будет хоть Chat GPT)))

как Вы будете различать нулевой элемент и отсутствие доступных элементов?
В нулевом посте я же писал. Согласен, из ветки сделали бардак.
0 - не выбрано ничего. 1 - выбран первый элемент, 2 - второй…
Пример: Есть 3 элемента всего. И все три имеют на момент времени возможность их выбора. То последовательность результатов функции таков (одно значение = один вызов функции) : 1,2,3,0,1,2,3,0,1,2…
А вот так это выглядит на экране.
Допустим есть три элемента(А, Б, В) а в данный момент к выбору готовы А и В
Перед первым нажатием на экране так:
Off Off On
Первое нажатие и каждая следующая строка это нажатие кнопки(т.е. вызов функции getNextIndex)
*Off. Off On
Off Off *On
Off Off On
*Off Off On
Off Off *On
Ну и т. д… Т.е. второй элемент мы пропускаем, его нельзя выбирать… Выбранный элемент отмечен звёздочкой. Но в любой момент времени может изменится возможность выбора элемента…
На самом деле там не так это все случайно… Там это происходит логично и интуитивно понятно, но расписывать полный алгоритм моей программы не вижу смысла…
Вы меня считаете троллем, а я считаю что тролли это те кто заходят в ветку и гадят. Типа вашего поста…

Объясните пжлст, где моя ошибка
Я не говорил про ошибку. Ваш код копия моего. Я его не запускал но видел, что там делается все тоже самое… Только У меня массив байтовый используется а у Вас битовый… Байт можно назвать массив из восьми битов…
А сказал что неверно понимаете. Имел ввиду про замечание мне про локальный массив и его область видимости…

А сказал что неверно понимаете. Имел ввиду про замечание мне про локальный массив и его область видимости…
Ну, сами вносите путаницу - цитируете одно, а комментируете другое.
А по поводу массива - я лишь высказал своё мнение (оно может быть ошибочным, т.к. я тоже ещё учусь), но я при нём и останусь.
Если так уж хочется создать массив на время, есть специальные функции , например, malloc и free (это в Си), и др., полно информации в сети.(см. динамическое выделение памяти С/С++)
Это, конечно, если речь идёт не о 5 байтах, которые хоть глобальными сделай, особо и не заметно будет, разве что на самых маленьких Тиньках…

речь идёт не о 5 байтах, которые хоть глобальными сделай, особо и не заметно будет
Я не титьку использую, а на Atmega328P… И уже под завязку 80 и 75 %% Да, там не мало уже всего, но хочется и ещё чего-то полезного туда впихнуть)

специальные функции , например, malloc и free (это в Си),
Они точно не для моего случая

но я при нём и останусь
Боже мой, я никого не заставляю менять свое мнение)) Я всего лишь хотел узнать, правильно ли я выполнил работу с указателями)) Ведь я, как и все надеюсь, тоже учусь…
А в ответ услышал много “тёплых” слов)))
Но раз никто мне на этот вопрос толком не ответил (а кромя Дракулы) то я просто тут “поддерживаю” разговор… В чужих ветках я так не “гажу”…

Боже мой, я никого не заставляю менять свое мнение)) Я всего лишь хотел узнать, правильно ли я выполнил работу с указателями)) Ведь я, как и все надеюсь, тоже учусь…
В начальном сообщении про указатели ничего не было. А дальше случалось разное, но мне до сих пор не понятно что же является целью - создать устройство или научиться разным трюкам в программировании? По отношению к МК эти задачи могут оказаться несовместимыми. Чисто в силу того, что программа для МК пишется один раз и универсальное решение может оказаться более затратным. Это как универсальный инструмент всегда хуже специального. Переходить к массивам следует когда их применение сокращает размер кода. В Вашем случае, когда условий всего четыре простой перебор может оказаться эффективнее. А может не оказаться. Можно сравнить оба подхода и выбрать более эффективный. Мой опыт говорит что в каждом конкретном случае число вариантов разанится, но порог когда выгоднее переходить к массивам больше пяти.

То последовательность результатов функции таков (одно значение = один вызов функции) : 1,2,3,0,1,2,3,0,1,2…
Непонятно, откуда берется такая последовательность.
Распишите подробно логику.

Допустим есть три элемента(А, Б, В) а в данный момент к выбору готовы А и В
Перед первым нажатием на экране так:
Off Off On
Откуда это следует?

Там это происходит логично и интуитивно понятно, но расписывать полный алгоритм моей программы не вижу смысла…
Никакой логики, а тем более интуитивной понятности не вижу.
Впрочем, мне оно и не надо. Не хотите - не расписывайте.