Главная Новости

Урок 6.1 Статическая индикация в AVR микроконтроллерах

Опубликовано: 06.09.2018

видео Урок 6.1 Статическая индикация в AVR микроконтроллерах

Светодиодная полоса серии KB-2620

Предположим вы пишите программу, которая должна выводить числа. Например: часы, секундомер, термометр и т.п. Для вывода информации можно воспользоваться жк дисплеем, но по ряду причин, это может быть не всегда удобно, красиво или дорого. Поэтому применяют семисегментный индикатор, который является набором из 7 светодиодов.


Программирование МК AVR. Урок 6. Бегущие огни

Для примера рассмотрим индикатор SA56, каждая черточка это светодиод. Кроме того их можно по разному объединить. В данном случае обратите внимание общий анод, т.е. «+» Если на ножки 7, 6, 4… подавать землю, то соответственно будут зажигаться соответствующие сегменты a, b, c…

Теперь разберемся, как все это дело прикрутить к микроконтроллеру.

Для собственного удобства, отметим каждый светодиод по порядку от 0 до 6. И подсоединим их в соответствии с их номерами, к порту В например.

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

Итак, исходные данные: 7сегментник с общим анодом (общий «+»), нужно вывести все цифры подряд от 0 до 9, такой счетчик

Начнем с 0. Смотрим на картинку с обозначенными номерами светодиодов, получается чтобы высветить 0 нужно зажечь все светодиоды, кроме 6.

Так как у нас номера светодиодов соответствуют номерам порта, то нам нужно включить ножки с 0 по 5 включительно. Чтобы их включить достаточно вывести в порт значение PORTB=0b00111111;

Вроде все верно, но не забываем что у нас общий «+», поэтому, чтобы светодиод загорелся, нам нужно в порт выводить 0 (землю). Поэтому инвертируем данное число и получим PORTB=0b11000000;

Аналогично 1: светодиоды 1 и 2, т.е. окончательно в порт нужно вывести PORTB=0b11111001;

Думаю дальше разберетесь самостоятельно. Для тех кто не понял что означает запись PORTB=0b00111111; рекомендую ознакомиться со статьей про конфигурацию портов

Теперь попробуем собрать полученную информацию в одну кучу и написать прошивку, которая считает от 0 до 9 и выводит полученную информацию на индикатор.

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 #include <mega8.h> #include <delay.h> void main ( void ) { int number = 0 ; PORTB = 0x00 ; DDRB = 0xFF ; while ( 1 ) { switch ( number ) { case 0 : { PORTB = 0xC0 ; break ; } case 1 : { PORTB = 0xF9 ; break ; } case 2 : { PORTB = 0xA4 ; break ; } case 3 : { PORTB = 0xB0 ; break ; } case 4 : { PORTB = 0x99 ; break ; } case 5 : { PORTB = 0x92 ; break ; } case 6 : { PORTB = 0x82 ; break ; } case 7 : { PORTB = 0xF8 ; break ; } case 8 : { PORTB = 0x80 ; break ; } case 9 : { PORTB = 0x90 ; break ; } } delay_ms ( 1000 ) ; number ++; if ( number == 10 ) number = 0 ; } ; }

 

В прошивке сложного ничего нет, используется оператор switch который в зависимости от того, какое число в переменной number зажигает нужные светодиоды.

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

rss