Вывод бегущей строки на светодиодной матрице 8×8 с Arduino (обучение работе с Proteus)

Данная статья написана специально для обучения работе с симулятором Proteus и демонстрирует, как использовать Arduino для управления светодиодной матрицей 8×8 с выводом бегущего текста.
Проект позволяет понять принципы динамической индикации, работы с портами микроконтроллера и сдвиговыми регистрами.

Бегущая строка на матрице 8×8

В качестве примера используется готовый скетч, который отображает строку ARDUINO-KID.RU в виде бегущей надписи. Проект предназначен для симуляции и не требует подключения реального оборудования.

Назначение проекта

Цель проекта — показать, как Arduino управляет светодиодной матрицей 8×8, включая:

  • формирование символов на основе шрифтовой таблицы;
  • динамическое обновление строк и столбцов матрицы;
  • реализацию эффекта бегущей строки;
  • работу с портами микроконтроллера на низком уровне.

Подобный принцип используется в электронных табло, бегущих строках, информационных панелях и рекламных дисплеях.

Используемые компоненты

  • Arduino UNO;
  • Светодиодная матрица 8×8;
  • Сдвиговые регистры (управление строками и столбцами);
  • Proteus 8 или 9 с поддержкой Arduino.

Принцип работы матрицы 8×8

Светодиодная матрица 8×8 состоит из 64 светодиодов, объединённых в строки и столбцы. В каждый момент времени активируется только одна строка или столбец, а за счёт быстрого обновления создаётся иллюзия постоянного свечения.

В данном проекте управление осуществляется через:

  • линии данных;
  • тактовые входы;
  • регистры защёлки;
  • прямую работу с портом PORTD.

Шрифтовая таблица

В скетче используется массив font_5x7, который содержит побитовые представления символов ASCII. Каждый символ описывается пятью байтами, где каждый бит соответствует светодиоду в столбце.

Это позволяет формировать любые текстовые строки и выводить их на матрицу с плавным смещением.

Arduino-скетч

/*
  8x8 DOT MATRIX DISPLAY Demo Application (MIT License)

  Created on 04 May, 2015
  by Elochukwu Ifediora (fedy0)
*/


#define shcp_colun 10          // coln
#define stcp_colun 8          // coln
#define ds_colun 9             // coln
#define shcp_row 7          //  row
#define ds_row 11           //row
#define oe_row 12

//int ledPins[] = {0,1,2,3,4,5,6};

int scr_speed, p, j, i, lenth, temp;
int data_row, data_colon;
int move_data[48];
int colun_data[49] = {1, 0, 0, 0, 0, 0, 0, 0,
                      0, 0, 0, 0, 0, 0, 0, 0,
                      0, 0, 0, 0, 0, 0, 0, 0,
                      0, 0, 0, 0, 0, 0, 0, 0,
                      0, 0, 0, 0, 0, 0, 0, 0,
                      0, 0, 0, 0, 0, 0, 0, 0};
char inputString[100];

char font_5x7[95][6] = {
  {0x00, 0x00, 0x00, 0x00, 0x00},// (space)
  {0x00, 0x00, 0x5F, 0x00, 0x00},// !
  {0x00, 0x07, 0x00, 0x07, 0x00},// "
  {0x14, 0x7F, 0x14, 0x7F, 0x14},// #
  {0x24, 0x2A, 0x7F, 0x2A, 0x12},// $
  {0x23, 0x13, 0x08, 0x64, 0x62},// %
  {0x36, 0x49, 0x55, 0x22, 0x50},// &
  {0x00, 0x05, 0x03, 0x00, 0x00},// '
  {0x00, 0x1C, 0x22, 0x41, 0x00},// (
  {0x00, 0x41, 0x22, 0x1C, 0x00},// )
  {0x08, 0x2A, 0x1C, 0x2A, 0x08},// *
  {0x08, 0x08, 0x3E, 0x08, 0x08},// +
  {0x00, 0x50, 0x30, 0x00, 0x00},// ,
  {0x08, 0x08, 0x08, 0x08, 0x08},// -
  {0x00, 0x60, 0x60, 0x00, 0x00},// .
  {0x20, 0x10, 0x08, 0x04, 0x02},// /
  {0x3E, 0x51, 0x49, 0x45, 0x3E},// 0
  {0x00, 0x42, 0x7F, 0x40, 0x00},// 1
  {0x42, 0x61, 0x51, 0x49, 0x46},// 2
  {0x21, 0x41, 0x45, 0x4B, 0x31},// 3
  {0x18, 0x14, 0x12, 0x7F, 0x10},// 4
  {0x27, 0x45, 0x45, 0x45, 0x39},// 5
  {0x3C, 0x4A, 0x49, 0x49, 0x30},// 6
  {0x01, 0x71, 0x09, 0x05, 0x03},// 7
  {0x36, 0x49, 0x49, 0x49, 0x36},// 8
  {0x06, 0x49, 0x49, 0x29, 0x1E},// 9
  {0x00, 0x36, 0x36, 0x00, 0x00},// :
  {0x00, 0x56, 0x36, 0x00, 0x00},// ;
  {0x00, 0x08, 0x14, 0x22, 0x41},// <
  {0x14, 0x14, 0x14, 0x14, 0x14},// =
  {0x41, 0x22, 0x14, 0x08, 0x00},// >
  {0x02, 0x01, 0x51, 0x09, 0x06},// ?
  {0x32, 0x49, 0x79, 0x41, 0x3E},// @
  {0x7E, 0x11, 0x11, 0x11, 0x7E},// A
  {0x7F, 0x49, 0x49, 0x49, 0x36},// B
  {0x3E, 0x41, 0x41, 0x41, 0x22},// C
  {0x7F, 0x41, 0x41, 0x22, 0x1C},// D
  {0x7F, 0x49, 0x49, 0x49, 0x41},// E
  {0x7F, 0x09, 0x09, 0x01, 0x01},// F
  {0x3E, 0x41, 0x41, 0x51, 0x32},// G
  {0x7F, 0x08, 0x08, 0x08, 0x7F},// H
  {0x00, 0x41, 0x7F, 0x41, 0x00},// I
  {0x20, 0x40, 0x41, 0x3F, 0x01},// J
  {0x7F, 0x08, 0x14, 0x22, 0x41},// K
  {0x7F, 0x40, 0x40, 0x40, 0x40},// L
  {0x7F, 0x02, 0x04, 0x02, 0x7F},// M
  {0x7F, 0x04, 0x08, 0x10, 0x7F},// N
  {0x3E, 0x41, 0x41, 0x41, 0x3E},// O
  {0x7F, 0x09, 0x09, 0x09, 0x06},// P
  {0x3E, 0x41, 0x51, 0x21, 0x5E},// Q
  {0x7F, 0x09, 0x19, 0x29, 0x46},// R
  {0x46, 0x49, 0x49, 0x49, 0x31},// S
  {0x01, 0x01, 0x7F, 0x01, 0x01},// T
  {0x3F, 0x40, 0x40, 0x40, 0x3F},// U
  {0x1F, 0x20, 0x40, 0x20, 0x1F},// V
  {0x7F, 0x20, 0x18, 0x20, 0x7F},// W
  {0x63, 0x14, 0x08, 0x14, 0x63},// X
  {0x03, 0x04, 0x78, 0x04, 0x03},// Y
  {0x61, 0x51, 0x49, 0x45, 0x43},// Z
  {0x00, 0x00, 0x7F, 0x41, 0x41},// [
  {0x02, 0x04, 0x08, 0x10, 0x20},// "\"
  {0x41, 0x41, 0x7F, 0x00, 0x00},// ]
  {0x04, 0x02, 0x01, 0x02, 0x04},// ^
  {0x40, 0x40, 0x40, 0x40, 0x40},// _
  {0x00, 0x01, 0x02, 0x04, 0x00},// `
  {0x20, 0x54, 0x54, 0x54, 0x78},// a
  {0x7F, 0x48, 0x44, 0x44, 0x38},// b
  {0x38, 0x44, 0x44, 0x44, 0x20},// c
  {0x38, 0x44, 0x44, 0x48, 0x7F},// d
  {0x38, 0x54, 0x54, 0x54, 0x18},// e
  {0x08, 0x7E, 0x09, 0x01, 0x02},// f
  {0x08, 0x14, 0x54, 0x54, 0x3C},// g
  {0x7F, 0x08, 0x04, 0x04, 0x78},// h
  {0x00, 0x44, 0x7D, 0x40, 0x00},// i
  {0x20, 0x40, 0x44, 0x3D, 0x00},// j
  {0x00, 0x7F, 0x10, 0x28, 0x44},// k
  {0x00, 0x41, 0x7F, 0x40, 0x00},// l
  {0x7C, 0x04, 0x18, 0x04, 0x78},// m
  {0x7C, 0x08, 0x04, 0x04, 0x78},// n
  {0x38, 0x44, 0x44, 0x44, 0x38},// o
  {0x7C, 0x14, 0x14, 0x14, 0x08},// p
  {0x08, 0x14, 0x14, 0x18, 0x7C},// q
  {0x7C, 0x08, 0x04, 0x04, 0x08},// r
  {0x48, 0x54, 0x54, 0x54, 0x20},// s
  {0x04, 0x3F, 0x44, 0x40, 0x20},// t
  {0x3C, 0x40, 0x40, 0x20, 0x7C},// u
  {0x1C, 0x20, 0x40, 0x20, 0x1C},// v
  {0x3C, 0x40, 0x30, 0x40, 0x3C},// w
  {0x44, 0x28, 0x10, 0x28, 0x44},// x
  {0x0C, 0x50, 0x50, 0x50, 0x3C},// y
  {0x44, 0x64, 0x54, 0x4C, 0x44},// z
  {0x00, 0x08, 0x36, 0x41, 0x00},// {
  {0x00, 0x00, 0x7F, 0x00, 0x00},// |
  {0x00, 0x41, 0x36, 0x08, 0x00},// }
  {0x08, 0x10, 0x08, 0x10, 0x00},// ~
};

void setup()
{
  pinMode(shcp_colun, OUTPUT);
  pinMode(stcp_colun, OUTPUT);
  pinMode(ds_colun, OUTPUT);
  pinMode(shcp_row, OUTPUT);
  pinMode(oe_row, OUTPUT);
  pinMode(ds_row, OUTPUT);
  DDRD = 0b11111111;
}

void loop()
{
  int i = 0;
  char Str [100] = "ARDUINO-KID.RU    ";
  while (i != strlen(Str))
    printf(Str[i++]);
}

void printf(char fedy0) {
  p = fedy0 - 32;
  scroll (font_5x7[p][0],
          font_5x7[p][1],
          font_5x7[p][2],
          font_5x7[p][3],
          font_5x7[p][4]);
}

void scroll(char a, char b, char c, char d, char e)
{
  //   PORTC = a ;
  //  delay(1000);
  int count = 6;
  while (count > 0) {
    move_data[0] = a; a = b; b = c; c = d; d = e; e = 0;

    for (i = 0; i < 48; i++) {
      temp = move_data[i];
      PORTD = temp;
      data_colon = colun_data[i];
      digitalWrite(ds_colun, data_colon);
      digitalWrite(shcp_colun, HIGH); delay(1);
      digitalWrite(shcp_colun, LOW);
      digitalWrite(stcp_colun, HIGH);
      digitalWrite(stcp_colun, LOW);
    }

    for (i = 47; i > 0; i--)
      move_data[i] = move_data[i - 1];
    count--;
  }
}

Работа проекта в Proteus

В симуляции Proteus светодиодная матрица отображает бегущую строку. Данные не изменяются автоматически — движение текста реализуется за счёт программного сдвига массива данных.

Arduino к компьютеру подключать не требуется — вся работа выполняется внутри симулятора.

Запуск проекта в Proteus

  • распакуйте архив с проектом;
  • откройте файл .pdsprj;
  • проверьте путь к файлу .hex в свойствах Arduino;
  • нажмите Run Simulation;
  • наблюдайте бегущую строку на матрице.

Если что-то не работает

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

Подробно разобран первый проект в Proteus:
Первый проект в Proteus — мигание светодиода

📁 Скачать примеры