Помогите пожалуйста разобраться с кодом.

zxc1by1

✩✩✩✩✩✩✩
16 Дек 2022
1
0
Здравствуйте, делаю часы на основе адресной светодиодной матрицы. Нашел код с уже готовым алфавитом и методами вывода их на матрицу. Но мне нужно разобраться как именно этот код работает, помогите понять.
Методы для вывода текста:
void setPixel (byte x, byte y, uint32_t color) {
   uint16_t curLed;
   if (x%2==0){
      curLed=MATRIX_HEIGHT*x+y;
   }
   else {
      curLed=(MATRIX_HEIGHT*(x+1)-1)-y;
   }
 
   leds[curLed]=color;
}

byte getPixel (uint8_t vertPixels, byte startY, uint32_t color) {
   byte pixel;
   for (int k = 7; k >=0; k--) {//
        pixel = ((vertPixels >> k) & 0x01);
        if (pixel==1){
            setPixel (curX, curY, color);
        }
        curY++;
    }
    curY=startY;
    curX++;
}



void showText(String text, byte startX, byte startY, uint32_t color){//вывод статического текста
    int i;
    byte n;
    bool isRusLetter=false;
    byte vertPixels;
 
    curX=startX;
    curY=startY;
 
    for (i=0;i<text.length();i++){
        if (int(text[i])>=0){//цифры и символы
            n=fontNumStr.indexOf(text[i]);
            for (byte j=0;j<4;j++){
               vertPixels=pgm_read_byte(&(font7num[n][j]));
               if ((j==0)||(vertPixels>0)){//только первая колонка и не пустые колонки
                   getPixel (vertPixels, startY, color);
               }
                if (curX>=MATRIX_WIDTH) {
                    break;
                }
            }
            curX++;
            if (curX>=MATRIX_WIDTH) {
                break;
            }
        }
        else {//русские буквы
            if (isRusLetter==true){
                isRusLetter=false;
                n=112+int(text[i]);
                for (byte j=0;j<7;j++){
                     vertPixels=pgm_read_byte(&(font7let[n][j]));

                     if ((j==0)||(vertPixels>0)||((n==27)&&(j<6))){//только первая колонка, не пустые колонки и исключения буквы Ы
                         getPixel (vertPixels, startY, color);
                     }
                      if (curX>=MATRIX_WIDTH) {
                          break;
                      }

                }
                curX++;
                if (curX>=MATRIX_WIDTH) {
                    break;
                }
            }
            else {
               isRusLetter=true;
            }
        }
    }
}

void runText(String text, byte startY, uint32_t color, int speedText){//вывод бегущей строки
    int i;
    byte n;
    bool isRusLetter=false;
    byte vertPixels;
   
    curY=startY;
    curX=startRunLineX;
    FastLED.clear();

    int l=0;
    for (i=0;i<text.length();i++){
        if (int(text[i])>0){
            n=fontNumStr.indexOf(text[i]);
            for (byte j=0;j<4;j++){
               vertPixels=pgm_read_byte(&(font7num[n][j]));
               if ((j==0)||(vertPixels>0)){//только первая колонка и не пустые колонки
                   if ((l>=lineStart)&&(l<=lineFin)){
                     getPixel (vertPixels, startY, color);
                   }

                   l++;
               }
               if (j==3){//в конце каждого символа добавляем пробел
                  if ((l>=lineStart)&&(l<=lineFin)){
                      curX++;
                   }
                   l++;
               }
             }
        }
        else {
            if (isRusLetter==true){
                isRusLetter=false;
                n=112+int(text[i]);
                for (byte j=0;j<7;j++){
                     vertPixels=pgm_read_byte(&(font7let[n][j]));

                     if ((j==0)||(vertPixels>0)||((n==27)&&(j<6))){//только первая колонка, не пустые колонки или буква Ы
                         if ((l>=lineStart)&&(l<=lineFin)){
                            getPixel (vertPixels, startY, color);
                         }
                         l++;
                     }
                      if (j==6){//в конце каждого символа добавляем пробел
                          if ((l>=lineStart)&&(l<=lineFin)){
                              curX++;
                           }
                           l++;
                       }
                }
            }
            else {
               isRusLetter=true;
            }
        }
    }
    lineFin++;
    if (lineFin>=MATRIX_WIDTH) {
        lineStart++;
    }
   
    if (startRunLineX>0){//каждый кадр смещаем начало отрисовки бегущей строки на 1 пиксель влево от правого края матрицы
        startRunLineX--;
    }

    if (lineStart>l){//воспроизводим с начала
      l=0;
      lineStart=0;
      lineFin=0;
      startRunLineX=MATRIX_WIDTH-1;
    }
   
    FastLED.show();
    delay(speedText);
}
Алфавит:
const uint8_t font7num[][4] PROGMEM = {
  {0x7C,0x82,0x82,0x7C}, //0
  {0x40,0xFE,0x00,0x00}, //1
  {0x46,0x8A,0x92,0x62}, //2
  {0x44,0x82,0x92,0x6C}, //3
  {0x18,0x28,0x48,0xFE}, //4
  {0xF4,0xA2,0xA2,0x9C}, //5
  {0x7C,0x92,0x92,0x4C}, //6
  {0x80,0x8E,0xB0,0xC0}, //7
  {0x6C,0x92,0x92,0x6C}, //8
  {0x64,0x92,0x92,0x7C}, //9
  {0x0,0x0,0x0,0x0}, //
  {0xFA,0x0,0x0,0x0}, //!
  {0x3,0x0,0x0,0x0}, //,
  {0x2,0x0,0x0,0x0}, //.
  {0x22,0x0,0x0,0x0}, //:
  {0x23,0x0,0x0,0x0}, //;
  {0x40,0x9A,0x90,0x60}, //?
};

const uint32_t font7let[][7] PROGMEM = {
  {0x1E,0x68,0x88,0x68,0x1E,0x0,0x0}, //А
  {0xFE,0x92,0x92,0xC,0x0,0x0,0x0}, //Б
  {0xFE,0x92,0x92,0x7C,0x0,0x0,0x0}, //В
  {0xFE,0x80,0x80,0x80,0x0,0x0,0x0}, //Г
  {0x3,0x6,0xFA,0x82,0x82,0xFE,0x3}, //Д
  {0xFE,0x92,0x92,0x92,0x92,0x0,0x0}, //Е
  {0xC6,0x28,0x10,0xFE,0x10,0x28,0xC6}, //Ж
  {0x44,0x82,0x92,0x6C,0x0,0x0,0x0}, //З
  {0xFE,0xC,0x30,0x40,0xFE,0x0,0x0}, //И
  {0xFE,0xC,0x90,0x20,0xFE,0x0,0x0}, //Й
  {0xFE,0x10,0x6C,0x82,0x0,0x0,0x0}, //К
  {0x2,0xFC,0x80,0x80,0xFE,0x0,0x0}, //Л›
  {0xFE,0x60,0x10,0x8,0x10,0x60,0xFE}, //М
  {0xFE,0x10,0x10,0x10,0xFE,0x0,0x0}, //Н
  {0x7C,0x82,0x82,0x82,0x7C,0x0,0x0}, //О
  {0xFE,0x80,0x80,0x80,0xFE,0x0,0x0}, //П
  {0xFE,0x90,0x90,0xF0,0x0,0x0,0x0}, //Р
  {0x7C,0x82,0x82,0x82,0x44,0x0,0x0}, //С
  {0x80,0x80,0xFE,0x80,0x80,0x0,0x0}, //Т
  {0xC2,0x32,0xC,0x30,0xC0,0x0,0x0}, //У
  {0x38,0x44,0xFE,0x44,0x38,0x0,0x0}, //Ф
  {0x82,0x6C,0x10,0x6C,0x82,0x0,0x0}, //Х
  {0xFE,0x2,0x2,0x2,0xFE,0x3,0x0}, //Ц
  {0xF0,0x8,0x8,0xFE,0x0,0x0,0x0}, //Ч
  {0xFE,0x2,0x2,0xFE,0x2,0x2,0xFE}, //Ш
  {0xFE,0x2,0x2,0xFE,0x2,0x2,0xFF}, //Щ
  {0x80,0xFE,0x12,0x12,0xC,0x0,0x0}, //Ъ
  {0xFE,0x12,0x12,0xC,0x0,0xFE,0x0}, //Ы
  {0xFE,0x12,0x12,0xC,0x0,0x0,0x0}, //Ь
  {0x44,0x92,0x92,0x7C,0x0,0x0,0x0}, //Э
  {0xFE,0x10,0x7C,0x82,0x82,0x82,0x7C}, //Ю
  {0x66,0x98,0x90,0x90,0xFE,0x0,0x0}, //Я
};
Определения:
#define NUM_LEDS 256
#define MATRIX_WIDTH 16           
#define MATRIX_HEIGHT 16
#define BRIGHTNESS 30

//константы и переменные для работы с текстом
const String fontNumStr="0123456789 !,.:;?";
const String fontLetStr="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
uint16_t curPixel;
uint8_t curX;
uint8_t curY;

CRGB leds[NUM_LEDS];

//переменные для работы с бегущей строкой
uint16_t lineStart=0;//с какого столбца строки начинаем вопроизведение текста
uint16_t lineFin=0;//каким столбцом строки заканчиваем вопроизведение текста
uint8_t startRunLineX=MATRIX_WIDTH-1;//столбец X начала отрисовки бегущей строки
 

Сотнег

★★★★★★★
15 Янв 2020
4,365
1,494

@zxc1by1,
может, вам лучше взять для примера код от часов?
Тут на форуме пара тем про такие часы.