Массивы в программировании микроконтроллеров AVR

Значение массивов в современном мире программирования трудно переоценить – они применяются везде, где требуется обрабатывать какие-нибудь объемы данных.

Что такое массив

В данной статье мы рассмотрим основы использования массивов в языке С для микроконтроллеров AVR и рассмотрим их практическое применение в программе для изменения цифр на семисегментном индикаторе.

Что такое массивы

Массив – это набор элементов, расположенных в единой последовательности и имеющих один общий тип данных.

Массивы в языке С объявляются следующим образом. Вначале необходимо указать тип данных, потом имя массива (произвольное, латинскими буквами), а затем квадратные скобки, в которых указывается число элементов массива. Например:

int ab [5];

В этом примере int указывает на тип данных массива, в данном случае целочисленный. Допустимо использование любых типов, которые поддерживает язык С: char, double, long и т.д.

ab – имя массива, может быть практически любым, но не может начинаться с черточки, тире, содержать некоторые знаки и т.д. – справедливы правила для имен переменных в С.

[ ] – квадратные скобки, как раз и являются тем элементом, которые определяют массив в языке программирования С.

Число в квадратных скобках [5] обозначает количество элементов массива.

Если необходимо элементы массива определить сразу при его объявлении, то это можно сделать следующим образом:

int ab [5] = {7, 12, 17, 22, 3};

Нумерация элементов массива в языке С всегда начинается с нуля!!! Не путать, к примеру, с языком Pascal, в котором элементы массива можно нумеровать начиная с любого числа, но чаще всего в Pascal’е их нумеруют начиная с 1.

То есть в представленном примере с массивом ab его элементы будут иметь следующие номера:

ab [0] – «7»;
ab [1] – «12»;
ab [2] – «17»;
ab [3] – «22»;
ab [4] – «3»;

Элементы массива в языке С для микроконтроллеров AVR могут содержать не только десятичные числа, но и двоичные и шестнадцатеричные.

Пример использования массивов в программе для семисегментного индикатора

Определим массив с двоичными числами, которые будут соответствовать цифрам семисегментного индикатора с общим катодом.

int go [10] = {
0b00111111, //0
0b00000110, //1
0b01011011, //2
0b01001111, //3
0b01100110, //4
0b01101101, //5
0b01111101, //6
0b00000111, //7
0b01111111, //8
0b01101111 //9
};

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

int go2 [10] = {0х3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f};

Если мы будем использовать семисегментный индикатор с общим анодом, то тогда в представленных массивах двоичные числа нужно инвертировать — вместо нулей записать единицы, а вместо единиц нули.

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

Оператор for

Оператор for в языке программирования С состоит из трех частей, которые разделяет точка с запятой. В первой части задается начальное значение переменной цикла — эта операция выполняется всего один раз.

Во второй части записывается условие остановки цикла — его проверка осуществляется каждый раз когда заканчивается тело цикла и производится возврат к его началу.

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

Теперь с использованием данного цикла мы можем визуально значительно упростить нашу программу и сделать ее более гибкой. Также дополним программу обратным отсчетом цифр. Ее алгоритм работы будет следующим: с задержкой в 1 секунду (1000 мс) выполняется увеличение значение числа на 1, а при достижении «9» начинается обратный отсчет до 0. Текст этой программы представлен на следующем рисунке: 

10 ответов к “Массивы в программировании микроконтроллеров AVR”

А есть ли разница между массивом и если я просто создам переменные int go1 ,int go2 и т.д.. Для микроконтроллера на уровне исполнения программы или использования памяти . В чём смысл , не могу «догнать» , в этих массивах ?

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

Спасибо . Я примерно так и предполагал что это для пользователя сделано . Т.е есть смысл если их десяток или больше , а если их 3,4,5 то и простые переменные сойдут).

Хорошо, успехов вам в дальнейшем освоении мастерства программирования

Добрый день! а как в массив записывать данные?
Напимер есть переменная d, и она прходит итерацию.
и каждая итерация должна записаться в массив adc_mas [10] = {}
как в него накопить 10 значений ??

Добрый вечер. Просто присваиваете adc_mas [d] = value, где value — значение, которое хотите записать в элемент массива с индексом d

Подскажите, еще будут выходить какие то обучающие статьи по AVR? Или дальше нужно смотреть статьи с готовыми устройствами и использовать информацию оттуда?

Да я просто не знаю уже какие еще обучающие статьи по AVR добавить на сайт. Вроде бы уже все на сайте есть. Смотрите статьи с готовыми устройствами, многие из них на нашем сайте достаточно подробно объяснены и по ним много чему можно научиться. Там есть и про использование АЦП и ШИМ в микроконтроллерах AVR, и подключение к ним различных датчиков и устройств. Посмотрите карту статей по AVR на нашем сайте, я думаю вы найдете там много интересных для себя статей

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *