Для получения светодиодной бегущей строки на этом контроллере используем 5 светодиодов. Естественно, будем пользоваться портами Arduino. Это намного приятнее и лучше, чем работать непосредственно с входами\выходами контроллера. Данный факт позволит нам установить значения для светодиодов при помощий лишь одной операции.
У Arduino UNO имеется 3 порта:
- B (цифровые входа/выхода с 8 по 13)
- C (аналоговые входа)
- D (цифровые входа/выхода с 0 по 7)
Каждый порт подвергается управлению 3 регистрами. Регистр DDR сам определит, чем будет pin: вход или выход. Используя регистр PORT устанавливаем pin в состояние HIGH или LOW. При помощи регистра PIN можно считать состояние ножек Arduino, когда они работает на вход.
Будем использовать порт В. Установим ножки порта В как цифровые выхода. Порт В имеет только шесть ног. Mbns регистра для нашего порта В (DDRB) устанавливаются в 1 при использовании ноги как OUTPUT и в 0, если INPUT. Биты порта нумеруются с 0-7, но не обязательно они содержат все 8 ног.
Пример:
DDRB = B00111110; // установить ножки порта В с 1 по 5 как выхода, а 0 как вход.
В нашем проекте бегущего огня мы будем использовать 5 выходов:
DDRB = B00011111; // установить ноги порта В с 0 по 4 как выхода
Для записи значений в порт В необходимо использовать регистр PORTB. Зажечь первый светодиод можно командой:
PORTB = B00000001;
первый и четвертый:
PORTB = B00001001;
При помощи этих команд мы теперь можем легко зажигать и выключать LED.
Рассматриваем операторы сдвига.
Существуют два оператора сдвига: влево и вправо - >.
Пример:
varA = 1; // 00000001
varA = 1
varA = 1
varA = 1
Введем 2 переменные: перваяupDown - куда двигаться - вверх или вниз, а вторая cylon какие LED зажигать.
В функции setup() мы определяем какие ножки должны работать как выхода.
В главном цикле программы loop(), светодиоды по очереди загораются вверх путем увеличения переменной cylon, а когда доходит до самого верхнего, то переменной upDown присваивается 0 и светодиоды загораются вниз по очереди.[szapisi]
/* Бегущая строка. 5 светодиодов */ unsigned char upDown=1; // начинаем с движения вверх unsigned char cylon=0; // определяет очередность LED void setup() { DDRB = B00011111; // устанавливаем порт B с 0 по 4 как выхода } void loop() { if(upDown==1){ // если идем вверх, то cylon++; if(cylon>=4) upDown=0; // когда достигнут наибольший номер LED, то в след. цикле идем вниз } else { cylon--; if(cylon==0) upDown=1; // когда достигнут наименьший номер LED, то в след. цикле идем вверх } PORTB = 1 |