Арифметические операции - это набор из четырех основных математических операций, состоящий из сложения, вычитания, умножения и деления.
Все арифметические операторы существуют в 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. Бегущий огонь "вперёд-назад".