Подключение светодиодной матрицы 8х8 к микроконтроллеру AVR ATmega8

Подключение светодиодной матрицы 8х8 к микроконтроллеру AVR: внешний вид

В этой статье мы рассмотрим подключение светодиодной матрицы 8х8 к микроконтроллеру ATmega8 (семейство AVR), на которой после этого можно отображать буквы алфавита. Типовая светодиодная матрица 8х8 показана на следующем рисунке.

Внешний вид светодиодной матрицы 8х8

Светодиодная матрица 8х8 содержит 64 светодиода, которые упорядочены в форме матрицы, поэтому эта конструкция и называется светодиодной матрицей. Такую матрицу можно сделать самостоятельно, соединив 64 диода, но это будет пустой тратой времени – проще использовать уже готовую конструкцию, показанную на рисунке. Светодиодные матрицы выпускаются различных размеров и цветов – можно выбрать ту, которая вам больше всего подходит.

Светодиодная матрица 8х8 стоит столько же, сколько и 64 светодиода, а работать с ней проще. Расположение ее контактов показано на следующем рисунке. Чтобы исключить ошибки при ее подключении необходимо пронумеровать ее контакты в точном соответствии с приведенным рисунком. Далее в статье мы более подробно рассмотрим внутреннюю схему соединений светодиодной матрицы.

Необходимые компоненты

Аппаратное обеспечение

Микроконтроллер ATmega8
Источник питания с напряжением 5 Вольт
Программатор AVR-ISP, USBASP или другой подобный
Конденсатор 100 мкФ (соединенный по питанию)
Резистор 1 кОм (8 шт.)

Программное обеспечение

Atmel Studio версии 6.1 (или выше)
Progisp или flash magic (необязательно)

Работа схемы

Схема подключения светодиодной матрицы 8х8 к микроконтроллеру AVR ATmega8 приведена на следующем рисунке.

Схема подключения светодиодной матрицы 8х8 к микроконтроллеру AVR ATmega8

В схеме необходимо сделать следующие соединения светодиодной матрицы с микроконтроллером:
PORTD, PIN0 —————— к контакту PIN13 светодиодной матрицы
PORTD, PIN1 —————— к контакту PIN03 светодиодной матрицы
PORTD, PIN2 —————— к контакту PIN04 светодиодной матрицы
PORTD, PIN3 —————— к контакту PIN10 светодиодной матрицы
PORTD, PIN4 —————— к контакту PIN06 светодиодной матрицы
PORTD, PIN5 —————— к контакту PIN11 светодиодной матрицы
PORTD, PIN6 —————— к контакту PIN15 светодиодной матрицы
PORTD, PIN7 —————— к контакту PIN16 светодиодной матрицы

PORTB, PIN0 —————— к контакту PIN09 светодиодной матрицы
PORTB, PIN1 —————— к контакту PIN14 светодиодной матрицы
PORTB, PIN2 —————— к контакту PIN08 светодиодной матрицы
PORTB, PIN3 —————— к контакту PIN12 светодиодной матрицы
PORTC, PIN0 —————— к контакту PIN01 светодиодной матрицы
PORTC, PIN1 —————— к контакту PIN07 светодиодной матрицы
PORTC, PIN2 —————— к контакту PIN02 светодиодной матрицы
PORTC, PIN3 —————— к контакту PIN05 светодиодной матрицы

В используемой нами светодиодной матрице 64 светодиода упорядочены в форму матрицы. Таким образом, мы имеем 8 строк (рядов) и 8 столбцов, как показано на следующем рисунке. В каждой строке все положительные выводы светодиодов объединены в общую линию. То есть имеем один общий положительный вывод для всех 8 светодиодов в одном ряду. Данная схема соединений представлена на следующем рисунке.

Общие выводы для строк светодиодной матрицы

Таким образом, для 8 строк светодиодной матрицы мы имеем 8 общих положительных выводов. Рассмотрим 1-ю строку – светодиоды от D1 до D8 объединены в общий положительный вывод, который обозначен в контактах светодиодной матрицы как PIN9.

При этом следует иметь ввиду, что все общие положительные выводы строк светодиодной матрицы пронумерованы в каком то строгом порядке – они могут быть пронумерованы в случайном порядке. И это нужно учитывать при подключении светодиодной матрицы.

То есть если мы хотим включить все или хотя бы один светодиод в первой строке матрицы, приведенной на рисунке, то мы должны подать питание на PIN9, а не на PIN0.

А если мы хотим включить все или хотя бы один светодиод в третьей строке матрицы, приведенной на рисунке, то мы должны подать питание на PIN8, а не на PIN2.

То есть чтобы включить все или хотя бы один светодиод в какой-либо строке матрицы, мы должны подать питание на общий контакт этой строки. Но этого недостаточно – чтобы зажечь необходимые светодиоды нам еще нужно подать землю на другие их концы. Этот вопрос мы рассмотрим далее в нашей статье.

Теперь сосредоточимся на общих отрицательных выводах столбцов. На представленном ниже рисунке видно, что в рассматриваемом случае все отрицательные выводы первого столбца объединены в контакт PIN13.

Общие выводы для столбцов светодиодной матрицы

Нумерация общих выводов столбцов, как и строк, также не упорядочена – в представленном примере общий вывод первого столбца выходит на PIN13, а второго – на PIN3.

Теперь если на PIN13 подать землю, то на все светодиоды первого столбца будет подана земля. Соединяя отрицательные выводы светодиодов каждого столбца, мы получим следующую картину:

Внутренняя схема соединений в светодиодной матрице

И теперь мы уже получили полную внутреннюю схему соединений светодиодной матрицы. Теперь если нам, к примеру, необходимо зажечь светодиод D10 в матрице, мы должны подать напряжение питания на PIN14 и землю на PIN3. Эта ситуация показана на следующем рисунке.

Зажигаем один светодиод в матрице

А если нам нужно зажечь светодиод D1, то необходимо подать питание на PIN9 и землю на PIN13. Направление прохождения тока через светодиод D1 в этом случае показано на рисунке ниже.

Зажигаем еще один светодиод

А теперь перейдем к более сложным вещам при управлении светодиодной матрицей. Предположим, что нам необходимо одновременно зажечь D1 и D10. Для этого мы должны подать питание на PIN9, PIN14 и землю на PIN13, PIN3. Но при этом кроме нужных нам светодиодов зажгутся еще светодиоды D2 и D9 поскольку они подключены к тем же самым общим выводам что и необходимые нам светодиоды. Эта ситуация показана на следующем рисунке.

Попытка зажечь сразу два светодиода

Чтобы исключить подобную проблему мы должны в каждый момент времени зажигать только один светодиод. К примеру, в момент времени t=0 мс мы включаем светодиод D1, потом при t = 1 мс мы D1 выключаем, а светодиод D2 включаем. Потом в момент времени t = 2 мс D2 выключаем, а D1 снова включаем. И далее продолжаем в том же духе.

Здесь нам на помощь приходит тот факт, что человеческий глаз не может различать частоту большую чем 30 Гц. Поэтому мы должны включать/выключать светодиоды с частотой не менее 30 Гц. В этом случае человеческий глаз будет воспринимать светодиоды непрерывно горящими, хотя на самом деле это не так – светодиоды будут непрерывно включаться и выключаться. Подобная технология называется мультиплексированием.
С использованием этой технологии в каждый момент времени мы будем переключать только одну строку светодиодной матрицы, а далее у нас будет задействован непрерывный цикл по всем 8 строкам. Для человеческого глаза это будет незаметно.

Предположим теперь, что мы хотим отобразить на светодиодной матрице букву “A”.

Отображение буквы "А" на светодиодной матрице

В этом случае, как уже обсуждалось ранее, мы должны использовать следующую методику.

В момент времени t = 0 мс на PIN09 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на PIN3,PIN4,PIN10,PIN6,PIN11,PIN15 подается земля (на все остальные общие контакты столбцов матрицы в это время подается высокий уровень). То есть зажигаем нужные нам светодиоды в первой строке.

В момент времени t = 1 мс на PIN14 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на все общие контакты столбцов матрицы в это время подается земля. То есть зажигаем нужные нам светодиоды во второй строке.

В момент времени t = 2 мс на PIN08 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на PIN13,PIN3,PIN15,PIN16 подается земля (на все остальные общие контакты столбцов матрицы в это время подается высокий уровень).

В момент времени t = 3 мс на PIN12 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на PIN13,PIN3,PIN15,PIN16 подается земля (на все остальные общие контакты столбцов матрицы в это время подается высокий уровень).

В момент времени t = 4 мс на PIN01 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на все общие контакты столбцов матрицы в это время подается земля.

В момент времени t = 5 мс на PIN07 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на все общие контакты столбцов матрицы в это время подается земля.

В момент времени t = 6 мс на PIN02 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на PIN13,PIN3,PIN15,PIN16 подается земля (на все остальные общие контакты столбцов матрицы в это время подается высокий уровень).

В момент времени t = 7 мс на PIN05 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на PIN13,PIN3,PIN15,PIN16 подается земля (на все остальные общие контакты столбцов матрицы в это время подается высокий уровень).

При использовании данной технологии мы будем непрерывно наблюдать на светодиодной матрице зажженную букву “A”. Это продемонстрировано на приведенном рисунке.

Исходный код программы на языке С (Си) с пояснениями

Программа для отображения на светодиодной матрице различных букв с помощью микроконтроллера ATmega8 представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

#include <avr/io.h> // заголовок чтобы задействовать контроль данных на контактах
#define F_CPU 1000000 // задание тактовой частоты микроконтроллера
#include <util/delay.h> // заголовок чтобы задействовать функции задержки в программе
int main(void)
{
DDRD = 0xFF; //PORTB,C,D устанавливаются на вывод данных
DDRB = 0xFF;
DDRC = 0xFF;
char PORT[8] = {1,2,4,8,16,32,64,128};//значения контактов для PORTD

static int ALPHA[26][8]={{0,0b01111111,0b11111111,0b11001100,0b11001100,0b11001100,0b11111111,0b01111111},
{0,0b00111100,0b01111110,0b11011011,0b11011011,0b11011011,0b11111111,0b11111111},
{0,0b11000011,0b11000011,0b11000011,0b11000011,0b11100111,0b01111110,0b00111100},
{0,0b01111110,0b10111101,0b11000011,0b11000011,0b11000011,0b11111111,0b11111111},
{0,0b11011011,0b11011011,0b11011011,0b11011011,0b11011011,0b11111111,0b11111111},
{0,0b11011000,0b11011000,0b11011000,0b11011000,0b11011000,0b11111111,0b11111111},
{0b00011111,0b11011111,0b11011000,0b11011011,0b11011011,0b11011011,0b11111111,0b11111111},
{0,0b11111111,0b11111111,0b00011000,0b00011000,0b00011000,0b11111111,0b11111111},
{0b11000011,0b11000011,0b11000011,0b11111111,0b11111111,0b11000011,0b11000011,0b11000011},
{0b11000000,0b11000000,0b11000000,0b11111111,0b11111111,0b11000011,0b11001111,0b11001111},
{0,0b11000011,0b11100111,0b01111110,0b00111100,0b00011000,0b11111111,0b11111111},
{0b00000011,0b00000011,0b00000011,0b00000011,0b00000011,0b00000011,0b11111111,0b11111111},
{0b11111111,0b11111111,0b01100000,0b01110000,0b01110000,0b01100000,0b11111111,0b11111111},
{0b11111111,0b11111111,0b00011100,0b00111000,0b01110000,0b11100000,0b11111111,0b11111111},
{0b01111110,0b11111111,0b11000011,0b11000011,0b11000011,0b11000011,0b11111111,0b01111110},
{0,0b01110000,0b11111000,0b11001100,0b11001100,0b11001100,0b11111111,0b11111111},
{0b01111110,0b11111111,0b11001111,0b11011111,0b11011011,0b11000011,0b11111111,0b01111110},
{0b01111001,0b11111011,0b11011111,0b11011110,0b11011100,0b11011000,0b11111111,0b11111111},
{0b11001110,0b11011111,0b11011011,0b11011011,0b11011011,0b11011011,0b11111011,0b01110011},
{0b11000000,0b11000000,0b11000000,0b11111111,0b11111111,0b11000000,0b11000000,0b11000000},
{0b11111110,0b11111111,0b00000011,0b00000011,0b00000011,0b00000011,0b11111111,0b11111110},
{0b11100000,0b11111100,0b00011110,0b00000011,0b00000011,0b00011110,0b11111100,0b11100000},
{0b11111110,0b11111111,0b00000011,0b11111111,0b11111111,0b00000011,0b11111111,0b11111110},
{0b01000010,0b11100111,0b01111110,0b00111100,0b00111100,0b01111110,0b11100111,0b01000010},
{0b01000000,0b11100000,0b01110000,0b00111111,0b00111111,0b01110000,0b11100000,0b01000000},
{0b11000011,0b11100011,0b11110011,0b11111011,0b11011111,0b11001111,0b11000111,0b11000011}};//символы a,b,c,d,e,f,g,...z в бинарном коде

char NAME[]={2,8,17,2,20,8,19,3,8,6,4,18,19};///circuitdigest character values
uint8_t l =0;

while(1)
{
for (int m=0;m<sizeof NAME;m++)
{
l = NAME[m];
for (int n=0;n<200;n++)//выполняем 200 раз чтобы человеческий глаз мог это увидеть
{
for (int j=0;j<4;j++)
{
PORTB = PORT[j];// строка
PORTD = ~ALPHA[l][j];//показываем половину символа (столбец)
_delay_us(500);
}
PORTB=0x00;//очистить экран (матрицу)
for (int k=0;k<4;k++)
{
PORTC = PORT[k];// ряд
PORTD = ~ALPHA[l][k+4];//показываем другую половину символа (столбец)
_delay_us(500);
}
PORTC=0x00;//очистить экран (матрицу)
}
}

_delay_ms(220);
_delay_ms(220);
_delay_ms(220);
_delay_ms(220);
_delay_ms(220);
}
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
104 просмотров


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *