Как прокручивать данные в светодиодной матрице через несколько модулей?

led c avr data

Я долгое время боролся с этой проблемой и знаю, что есть люди, которые с этим справились.

Но у меня недостаточно опыта работы с языком C, чтобы иметь навыки проектирования или разработки таких сложных функций.

Я хочу прокручивать данные, например текст, символы или числа, как в замечательных проектах на YouTube о точечной матрице.

Как это: Как сделать дисплей с бегущей строкой текста дома

Я знаю, как отображать символы, но не знаю, как их прокручивать. Если я пытаюсь, то не получаю желаемого результата.

Это моя функция для отображения символов:

void draw(void)
{
  s=0;
  uint8_t data_shift_buf;
  for (l=0;l<26;l++)            // для печати 26 букв
  {
    for (row=1;row<9;row++)     // для 8 строк матрицы
    {

        SPI_TX_m16(data = (row<<8) | (Alphabet[s]),4);// попытка задать данные по столбцу
        s++;_delay_ms(300);
    }
  }
}

, 👍0

Обсуждение

Что это значит? Светодиодная матрица с несколькими модулями... что вы высвечиваете?, @jsotola

Очевидно, что «сквозь». Не стесняйтесь уточнить вопрос, как я только что сделал., @Nick Gammon

Какой именно модуль у вас установлен? Возможно, это поможет: http://www.gammon.com.au/forum/?id=11516, @Nick Gammon

@NickGammon Спасибо за редактирование :) Например, вот это: http://www.belajarduino.com/2016/08/4in1-dot-matrix-led-module-32x8-pixel.html, @R1S8K

Да, MAX7219 — с его помощью можно прокручивать. См. ссылку выше. Не знаю, как ответить, не скопировав/вставив всю ссылку. :), @Nick Gammon

@NickGammon Большое спасибо, я просмотрел ссылку и нашел много информации о разработке MAX7219, а также нашел интересный комментарий в конце поста: «Также есть демонстрация прокрутки текста, однако она прокручивает по одному чипу за раз, а не по одному пикселю за раз. ", именно это я и ищу! Мне нужна прокрутка по пикселям., @R1S8K

В следующем абзаце под этим говорится: *Библиотека обновлена 2 октября 2015 года для обеспечения плавной прокрутки. Добавлен новый пример, демонстрирующий это. Для достижения этого для каждого модуля отображения (8 x 8 пикселей) код вычисляет пиксели для байта до, текущего байта и байта после. Затем он применяет смещение пикселей для выбора начальной точки где-то среди этих 24 (по горизонтали) пикселей.*, @Nick Gammon

ВАУ, это должно быть потрясающе, я уже несколько дней пытаюсь решить эту проблему. Да, он вычисляет для первого и второго отображения, хорошо, спасибо большое за поддержку., @R1S8K

Также ознакомьтесь с библиотекой Parola.h. https://github.com/MajicDesigns/MD_Parola Она может прокручиваться вверх, вниз, влево, вправо и на больших количествах дисплеев., @CrossRoads

Спасибо за ответ. Эта библиотека для меня очень сложная, поэтому я долго пытался, пока не справился сам. Умею только прокручивать вправо. Но функция длинная по сравнению с функциями в библиотеке Parola, она написана на C++. Очень интересно делать такие вещи в маленьких функциях., @R1S8K


1 ответ


Лучший ответ:

0

Это функция для решения моей проблемы.

void draw(void)
{
uint32_t map_buffer=0;int8_t i,k;
uint8_t data_reg[4] = {0xaa,0xbb,0xff,0xff};      // случайные данные для записи
uint8_t dis_buf[4],no_device,no_col;s=0;l=3;

for (i=0;i<4;i++)
map_buffer |= data_reg[i] << i*8;                 // загрузка данных в map_buffer

for (col=0;col<32;col++)                          // для 8 столбцов матрицы
{
    map_buffer >>= 1;                            // начинаем сдвигать данные на 1 пиксель
    for (i=0;i<4;i++)
    dis_buf[i] = map_buffer >> i*8;              // загрузка сдвинутых данных в буферы отображения
    for (i=0;i<4;i++)
    {
        for (row=1;row<9;row++)                 // для 8 строк матрицы
        {
            SPI_TX_m(data = (row<<8) | (dis_buf[i]),i);
        }
    }_delay_ms(1000);
}

}

,