Арифметические операции - это набор из четырех основных математических операций, состоящий из сложения, вычитания, умножения и деления.

Все арифметические операторы существуют в C и C ++ и могут быть перегружены в C ++. 

Symbol   Operator
     Арифметические
 +    
 -    
 *    
 /    
 %    Целочисленный остаток от деления. Модуль. 
     Унарные
 ++    предекремент и постдекремент
 --    преинкремент и постинкремент
    Унарные с присваиванием
 +=    
 -=    
 *=    
 /=    
 %=     

Табл. 1. Арифметические операторы.

Соберём схему бегущих огней.

Рис. 1. Схема бегущих огней на Arduino UNO со светодиодами.

Обратите внимание, все светодиоды на схеме рис. 1 подключены к порту D микроконтроллера. У микроконтроллера ATMega 328 порт D восьмиразрядный. Все 8 бит портов (регистров) DDRD и PORTD в регистровой памяти микроконтроллера управляют этим портом D. Другие два порта микроконтролера, порт B и порт C имеют меньшее число разрядов. Для подключения к Микроконтроллеры восьми светодиодов лучшим выбором будет порт D (на плате Arduino выводы 0... 7).

Состояние каждого бита порта DDRD (0 или 1) настраивает соответствующий ему порт микроконтроллера как вход или выход. Например, если записать в порт D в 5-й бит, считая справа (нумерация начинается с 0), единицу, то порт микроконтроллера PD5 (вывод на плате Arduino UNO отмеченный, как 5) будет работать как выход. Соответственно, управляя этим портом из программы, устанавливая в 0 или 1 5-й бит порта PORTD в регистровой памяти микроконтроллера, можно вывести на pin 5 платы Arduino 0 Вольт или 5 Вольт.

int i = 0;

void setup() {
  pinMode(9,INPUT);
  pinMode(10,INPUT);
  DDRD = 0b11111111;
  PORTD = 0b00000000;
}

void loop() {
  digitalWrite(i, HIGH);
  delay(500);
  digitalWrite(i, LOW);
  i = i + 1;
}

Лист. 1. Программа с переменной типа int и с операцией сложения.

В программе лист. 1 объявлена глобальная переменная i типа int (двухбайтовое целое со знаком в диапазоне от -32768 до 32767) и инициализирована значением 0. В функции setup порт D, отвечающий за режим работы выводов 0 ... 8 на плате Arduino, настроен как выход. Так же, состояние выводов 0 ... 8 платы Arduino переведено в LOW (низкий уровень).

В функции loop(), в той же программе, функция digitalWrite() записывает в порт с номером i значение константы HIGH (равно 1). Функция delay() приостанавливает выполнение программы на 500 мс, что даёт нам время заметить изменения в свечении светодиодов на схеме рис. 1.

char i = 0;

void setup() {
  pinMode(9,INPUT);
  pinMode(10,INPUT);
  DDRD = 0b11111111;
  PORTD = 0b00000000;
}

void loop() {
  digitalWrite(i%8, HIGH);
  delay(100);
  digitalWrite(i%8, LOW);
  i = i + 1;
}

Лист. 2. Программа с переменной типа char и с операцией сложения и взятия остатка от деления на 8.

unsigned char i = 0;

void setup() {
  pinMode(9,INPUT);
  pinMode(10,INPUT);
  DDRD = 0b11111111;
  PORTD = 0b00000000;
}

void loop() {
  digitalWrite(i%8, HIGH);
  delay(100);
  digitalWrite(i%8, LOW);
  i = i + 1;
}

Лист. 3. Программа с переменной типа unsigned char и с операцией сложения  и взятия остатка от деления на 8.

unsigned char i = 0;

void setup() {
  pinMode(9,INPUT);
  pinMode(10,INPUT);
  DDRD = 0b11111111;
  PORTD = 0b00000000;
}

void loop() {
  digitalWrite(i%7, HIGH);
  delay(100);
  digitalWrite(i%7, LOW);
  i = i + 1;
}

Лист. 4. Программа с переменной типа unsigned char и с операцией сложения  и взятия остатка от деления на 7.

unsigned char i = 0;

void setup() {
  pinMode(9,INPUT);
  pinMode(10,INPUT);
  DDRD = 0b11111111;
  PORTD = 0b00000000;
}

void loop() {
  digitalWrite(i, HIGH);
  delay(100);
  digitalWrite(i, LOW);
  i = i + 1;
  i = i % 8;
}

Лист. 5.  Программа с переменной типа unsigned char и с операцией сложения и взятия остатка от деления на 8.

unsigned char i = 8;

void setup() {
  pinMode(9,INPUT);
  pinMode(10,INPUT);
  DDRD = 0b11111111;
  PORTD = 0b00000000;
}

void loop() {
  digitalWrite(i, HIGH);
  delay(100);
  digitalWrite(i, LOW);
  i = i - 1;
  i = i % 8;
}

Лист. 6. Программа с переменной типа unsigned char и с операцией вычитания и взятия остатка от деления на 8.

byte i = 1;

void setup() {
  pinMode(9,INPUT);
  pinMode(10,INPUT);
  DDRD = 0b11111111;
  PORTD = 0b00000000;
}

void loop() {
  PORTD = i;
  delay(100);
  digitalWrite(i, LOW);
  i = i * 2;
}

Лист. 7. Программа с переменной типа unsigned char и с операцией умножения.

byte i = 1;
byte j = 0;

void setup() {
  pinMode(9,INPUT);
  pinMode(10,INPUT);
  DDRD = 0b11111111;
  PORTD = 0b00000000;
}

void loop() {
  PORTD = i;
  delay(100);
  digitalWrite(i, LOW);
  j += 1;
  j %= 8;
  i = (i+j/7) * 2;
}

Лист. 8. Программа "бегущий огонь" с переменной типа unsigned char и с операцией умножения, деления нацело и взятия остатка от деления.

 

byte n = 0;
byte m = 7;
byte i = 0;
byte j = 7;

void setup() {
  pinMode(9, INPUT);
  pinMode(10, INPUT);
  DDRD = 0b11111111;
  PORTD = 0b00000000;
}

void loop() {
  byte pin = m * (i / 8) + n * (j / 8);
  digitalWrite(pin, HIGH);
  delay(100);
  digitalWrite(pin, LOW);
  n++;
  m--;
  i++;
  j++;
  n %= 8;
  m %= 8;
  i %= 16;
  j %= 16;
}

Лист. 9. Бегущий огонь "вперёд-назад".