Вывод бегущей строки на светодиодной матрице 8×8 с Arduino (обучение работе с Proteus)
Данная статья написана специально для обучения работе с симулятором Proteus и демонстрирует, как использовать Arduino для управления светодиодной матрицей 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 — мигание светодиода