Алгоритм выбора с условием

Почему же, весьма любопытно

1 лайк

Туда просто всё лишнее сброшено.

//имитатор 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();//рисуем все светодиоды выключенными 
}
//
1 лайк

Я примерно таким же способом мигаю светодиодами, показывая код ошибки.
Как Вы читаете при таком форматировании код?)

Я далёк от программирования и ещё дальше от английского. Но мне близки записи типа: F=ma;F=F1+F2+F3+…; P=mV; - поэтому пояснения на русском к каждой строке, хотя лень своё берёт. Поэтому никак не читаю, чужое и своё через N - месяцев, помню только общие идеи.

Почему-то Вам близки исключительно механические выражения :wink:

Лень писать…, а так я знаю больше :slight_smile:

Это нелогично.
Индикатор отсутствия не должен совпадать ни с одним из допустимых значений.
Видимо никто и не может понять, чего Вы хотите, потому что Ваша формулировка внутренне противоречива.

У Вас ошибка не в коде, а ДО кода. Ошибка стадии проектирования. Невозможно написать правильный код, если в проекте ошибка.

Все там логично, если внимательно прочитать первый (#0) пост и посмотреть на результат алгоритма…
Ок, более подробно ещё раз могу рассказать по приезду домой… Мне не сложно…))
Если это очередной стеб, я не против, можно и так… Тем более, как я понял, мой вопрос уже решён (но это не точно) Если что серьёзно, то могу продолжить после рейса, как доберусь домой…

А он и не совполает. Если в конкретный момент времени нельзя выбрать ни один элемент то функция вернёт 0 и следующий её вызов снова вернёт ноль… И так будет пока не станет возможным для выбора какой либо элемент, но если продолжать нажимать при имеющейся хотя бы одном элементе готовым к выбору, функция все равно в конце всех элементов вернёт 0 и затем все по кругу…

А если будет доступен нулевой элемент - функция тоже вернет 0.
И как Вы будете различать нулевой элемент и отсутствие доступных элементов?

Народ перестаньте кормить тролля

1 лайк

Наконец то более менее понятно…

Но ведь моя програмка из #149 именно это и делает. "Срисовал"логику с вашей
Почему тогда

Объясните пжлст, где моя ошибка

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

1 лайк

В нулевом посте я же писал. Согласен, из ветки сделали бардак.
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 байтах, которые хоть глобальными сделай, особо и не заметно будет, разве что на самых маленьких Тиньках…

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

Они точно не для моего случая

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

1 лайк

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

1 лайк

Непонятно, откуда берется такая последовательность.
Распишите подробно логику.

Откуда это следует?

Никакой логики, а тем более интуитивной понятности не вижу.

Впрочем, мне оно и не надо. Не хотите - не расписывайте.