Ми продовжуємо роботу зі світлодіодами, але кількість світлодіодів збільшимо до 5, створивши ефект “біжучих вогнів”. Для керування світлодіодами будемо використовувати порти Arduino - ми будемо напряму записувати дані в порти пристрою, що краще, ніж працювати з конкретними входами / виходами контролера. Це дозволить встановити значення для світлодіодів за допомогою однієї лише операції.
У Arduino є 3 порти:

B (цифрові входу / виходу з 8 по 13)
C (аналогові входу)
D (цифрові входу / виходу з 0 по 7)

Кожен порт керується 3 регістрами.
Регістр DDR визначає чи буде нога (pin) входом або виходом. За допомогою регістра PORT можна встановити pin в стан HIGH або LOW. За допомогою регістра PIN можна прочитати стан виводів Arduino, коли вони працюють як вхід.

Ми будемо використовувати порт B. Спочатку, ми повинні встановити всі ніжки порта B як цифрові виходи. У порта B є тільки 6 ніжок, біти регістра для В-порту DDRB повинні бути встановлені в 1, якщо пін буде використовуватися як вихід (OUTPUT), і в 0, якщо пін буде використовувати як вхід (INPUT). Біти портів нумеруються з 0 по 7, але не завжди містять всі 8 пінів.
Приклад:
DDRB = B00111110; / / встановити піни порту В з 1 по 5 як виходи, а 0 як вхід.

Зверніть увагу, що в мікроконтролерах фірми Microchip все навпаки. 0 біт - нога працює як вихід, а 1 - як вхід.
У нашому проекті ми будемо використовувати 5 виходів:
DDRB = B00011111; / / встановити ноги порту В з 0 по 4 як виходу

Для запису значень в порт В необхідно використовувати регістр PORTB.
Ввімкнути перший світлодіод можна командою:
PORTB = B00000001;

перший і четвертий:
PORTB = B00001001;

Тепер ми можемо легко вмикати та вимикати світлодіоди, передаючи дані в порт..
Розглянемо оператори зсуву. два оператори двійкового зсуву: оператор зсуву вліво << і оператор зсуву вправо >>. Оператор зсуву вліво << змушує всі біти зсуватися вліво, відповідно оператор зсуву вправо >> зсуває біти вправо. Приклад:
varA = 1; / / 00000001
varA = 1 << 0; / / 00000001
varA = 1 << 1; / / 00000010
varA = 1 << 2; / / 00000100


У нашій програмі буде 2 змінні: перша - upDown вказує на напрям засвічування світлодіодів (“вгору” або “вниз”), а друга - cylon вказує які світлодіоди слід вмикати.

Функція setup () визначає які виводи мікроконтролера (порти) будуть працювати як виходи.

У головному циклі програми loop (), світлодіоди по черзі спалахують “вгору” шляхом збільшення значення змінної cylon, а коли доходить до самого верхнього, то змінній upDown присвоюється 0 і світлодіоди спалахують по черзі “вниз”.
/* Біжучі вогні */ 
unsigned char upDown=1;// розпочинаємо з “руху” догори 
unsigned char cylon=0; // визначаємо черговість засвічування світлодіодів 
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 << cylon; //зсув 
 delay(200); // пауза 200 мс 
} 
 Джерело: http://www.hobbytronics.co.uk 

- Copyright © Основи мікроелектроніки в школі