В этой статье мы рассмотрим подключение светодиодной матрицы 8х8 к микроконтроллеру ATmega8 (семейство AVR), на которой после этого можно отображать буквы алфавита. Типовая светодиодная матрица 8х8 показана на следующем рисунке.
Светодиодная матрица 8х8 содержит 64 светодиода, которые упорядочены в форме матрицы, поэтому эта конструкция и называется светодиодной матрицей. Такую матрицу можно сделать самостоятельно, соединив 64 диода, но это будет пустой тратой времени – проще использовать уже готовую конструкцию, показанную на рисунке. Светодиодные матрицы выпускаются различных размеров и цветов – можно выбрать ту, которая вам больше всего подходит.
Светодиодная матрица 8х8 стоит столько же, сколько и 64 светодиода, а работать с ней проще. Расположение ее контактов показано на следующем рисунке. Чтобы исключить ошибки при ее подключении необходимо пронумеровать ее контакты в точном соответствии с приведенным рисунком. Далее в статье мы более подробно рассмотрим внутреннюю схему соединений светодиодной матрицы.
Необходимые компоненты
Аппаратное обеспечение
- Микроконтроллер ATmega8 (купить на AliExpress).
- Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
- Светодиодная матрица 8х8.
- Конденсатор 100 мкФ (соединенный по питанию) (купить на AliExpress).
- Резистор 1 кОм (8 шт.) (купить на AliExpress).
- Источник питания с напряжением 5 Вольт.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Программное обеспечение
- Atmel Studio версии 6.1 (или выше).
- Progisp или flash magic (необязательно).
Работа схемы
Схема подключения светодиодной матрицы 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 представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#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); } } |
2 ответа к “Подключение светодиодной матрицы 8х8 к микроконтроллеру AVR ATmega8”
Очень хороший сайт.
Спасибо, стараемся