СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

Светодиодный дисплей 8*8

Категория: Прочее

Нажмите, чтобы узнать подробности

Просмотр содержимого документа
«Светодиодный дисплей 8*8»

Матричный индикатор

Сегментные индикаторы, будь то шкалы или цифры, состоят из отдельных светодиодов, соединенных вместе. Например, у группы светодиодов могут быть соединены все катоды. Такой индикатор имеет приписку «с общим катодом», в противном случае — «с общим анодом». А что будет, если мы разместим светодиоды не в виде цифры или шкалы, а в виде сетки? Получится уже вполне себе графический индикатор. То есть такой, на котором можно отобразить не только число, но и какое-то изображение. Такая сетка называется матричным индикатором, а в случае использования светодиодов — светодиодной матрицей. Разрешение матричного индикатора — это количество точек по горизонтали и вертикали. Например, самые распространенные индикаторы имеют разрешение 8×8 точек.




Если требуется светодиодная матрица с большим разрешением, то её просто-напросто составляют из нескольких 8×8 индикаторов. Как это делать, мы увидим позже. А пока разберемся как соединяются все 64 светодиода внутри матрицы. Конечно, можно бы было как и в случае семисегментного индикатора соединить все светодиоды общим катодом или анодом. В этом случае нам бы потребовалось либо 64 вывода контроллера, либо 8 сдвиговых регистров. Оба варианта весьма расточительны. Более правильный вариант — объединить светодиоды в группы по 8 штук с общим катодом. Пусть это будут столбцы матрицы. Затем, параллельные светодиоды в этих столбцах объединить снова в группы по 8 штук уже с общим анодом. Получится вот такая схема:




Предположим, стоит задачазажечь светодиод R6C3. Для этого нам потребуетсяподать высокий уровень сигнала на вывод R6, а вывод C3 соединить с землей.




Не выключая эту точку, попробуем зажечьдругую — R3C7. Положительный контакт питаниясоединим с R3 и землю с C7. Но в таком случае строки R6 и R3 будут пересекаться с колонками C3 и C7 не в двух, а в четырех местах! Следовательно изажжется не две, а четыре точки. Проблема!




Очевидно, что помочь сможет всё та жединамическая индикация. Если мы будем включать точки R6C3 и R3C7 по-очереди очень быстро, то сможем использовать персистентность зрения — способность интерпретировать быстро сменяющиеся изображения как одно целое.

Светодиодная матрица и сдвиговые регистры

В нашем уроке мы будем подключать к Ардуино Уно самую простую светодиодную матрицу8×8 красного свечения. Нумерация выводов начинается с нижнеголевого угла. При этом, нумерация ног 1-16 не связана никакой логикой с нумерацией колонок и строк C и R.




Попробуем использовать в схеме управления матричным индикатором 8-битные сдвиговые регистры. Один регистр подключим к выводам индикатора, отвечающим за колонки, а второйк выводам строк.






Важное замечание №1.Необходимо, чтобы резисторы в этой схеме были налиниях, идущих от первого сдвигового регистра. Этот сдвиговый регистр отвечает за колонки.При таком подключении, каждый резистор будет задавать ток только для одного светодиода на каждом шаге динамического алгоритма.Следовательно, все светодиоды будут светиться равномерно.Важное замечание №2.Указанная выше схема носит сугубо ознакомительный характер. Правильнее будет включить в разрыв между вторым регистром и матрицей дополнительную силовую микросхему, например транзисторную сборку ULN2003.



Программа

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




За колонки у нас будет отвечать первый сдвиговый регистр, а за строки второй. Следовательно, вывод строки будет состоять из двух последовательных записей в регистр: сначала передаем код строки, затем код точек в этой строке. В этой программе мы также воспользуемся ускоренной версиейфункции digitalWrite. Это необходимо для того, чтобы процесс динамической индикации проходил очень быстро. В противном случае, мы увидим заметное мерцание матрицы.

Исходный код

const byte data_pin = PD2;

const byte st_pin = PD3;

const byte sh_pin = PD4;


unsigned long tm, next_flick;

const unsigned int to_flick = 500;


byte line = 0;


const byte data[8] = {

0b00111100,

0b01000010,

0b10100101,

0b10000001,

0b10100101,

0b10011001,

0b01000010,

0b00111100

};


void latchOn(){

digitalWriteFast(st_pin, HIGH);

digitalWriteFast(st_pin, LOW);

}


void fill( byte d ){

for(char i=0; i

digitalWriteFast(sh_pin, LOW);

digitalWriteFast(data_pin, d & (1

digitalWriteFast(sh_pin, HIGH);

}

}


void setPinFast(byte pin){

DDRD |= _BV(pin);

}


void digitalWriteFast(byte pin, byte sig){

if( sig )

PORTD |= _BV(pin);

else

PORTD &= ~_BV(pin);

}


void setup() {

setPinFast(data_pin);

setPinFast(st_pin);

setPinFast(sh_pin);

setPinFast(oe_pin);

}


void loop() {

tm = micros();

if( tm next_flick ){

next_flick = tm + to_flick;

line++;

if( line == 8 )

line = 0;

// передаем код строки

fill( ~(1

// зажигаем точки в строке № line

fill( data[line] );

// открываем защелку

latchOn();

}

}

После загрузки программы на Ардуино, на индикаторе появится смайл.

Анимация на светодиодной матрице

А теперь доработаемпрограмму таким образом, чтобы изображение на индикаторе менялось каждые пол секунды.

const byte data_pin = PD2;

const byte st_pin = PD3;

const byte sh_pin = PD4;


unsigned long tm, next_flick, next_switch;

const unsigned int to_flick = 500;

const unsigned long to_switch = 500000;


byte line = 0;

byte frame = 0;


const byte data[2][8] = {

{ 0b00111100,

0b01000010,

0b10100101,

0b10000001,

0b10100101,

0b10011001,

0b01000010,

0b00111100

},

{ 0b00111100,

0b01000010,

0b10100101,

0b10000001,

0b10000001,

0b10111101,

0b01000010,

0b00111100

}};


void latchOn(){

digitalWriteFast(st_pin, HIGH);

digitalWriteFast(st_pin, LOW);

}


void fill( byte d ){

for(char i=0; i

digitalWriteFast(sh_pin, LOW);

digitalWriteFast(data_pin, d & (1

digitalWriteFast(sh_pin, HIGH);

}

}


void setPinFast(byte pin){

DDRD |= _BV(pin);

}


void digitalWriteFast(byte pin, byte sig){

if( sig )

PORTD |= _BV(pin);

else

PORTD &= ~_BV(pin);

}


void setup() {

setPinFast(data_pin);

setPinFast(st_pin);

setPinFast(sh_pin);


}


void loop() {

tm = micros();

if( tm next_flick ){

next_flick = tm + to_flick;

line++;

if( line == 8 )

line = 0;

fill( ~(1

fill( data[frame][7-line] );

latchOn();

}

tm = micros();

if( tm next_switch ){

next_switch = tm + to_switch;

frame = !frame;

}

}

Загружаем программу на Ардуино и наблюдаем результат.




Масштабирование светодиодной матрицы

Светодиодная матрицас разрешением 8×8подойдет для отображения двух цифр или простого символа. Если требуетсявывести на индикатор какое-то более или менее полезное изображение, необходимо объединить матрицы. Делается это с помощью добавления новых сдвиговых регистров как по вертикали, так и по горизонтали. Следует отметить, чтобыстродействия контроллера Ардуино Уно в связке со сдвиговыми регистрами хватит разве что на дисплей 16×16.Дальнейшее увеличение размеров светодиодного дисплея приведет к появлению заметного мерцания.

Заключение

Собрав схему управления матрицей, у многих может возникнуть вопрос: «Ну неужели за 30 лет никто не придумал более простого способа работы с матрицей?» На самом деле, придумали. Существуют специализированные микросхемы для работы с разными типами дисплеев, в том числе и для работы со светодиодной матрицей, например с помощью микросхемы MAX7219. Такой способ позволит нам легко объединять несколько матриц с один большой дисплей, без необходимости сильно усложнять электрическую схему.


Скачать

Рекомендуем курсы ПК и ППК для учителей

Вебинар для учителей

Свидетельство об участии БЕСПЛАТНО!