Значение массивов в современном мире программирования трудно переоценить – они применяются везде, где требуется обрабатывать какие-нибудь объемы данных.
В данной статье мы рассмотрим основы использования массивов в языке С для микроконтроллеров 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. Текст этой программы представлен на следующем рисунке:
А есть ли разница между массивом и если я просто создам переменные int go1 ,int go2 и т.д.. Для микроконтроллера на уровне исполнения программы или использования памяти . В чём смысл , не могу "догнать" , в этих массивах ?
Для микроконтроллера разницы нет, есть разница для вас в удобстве кода. Если у вас 100 переменных, к примеру, то вам нужно 100 строк кода написать чтобы сделать какие-нибудь операции с этими переменными, а при использовании массива вы можете сделать это с помощью одного цикла, обращаясь к элементам массива по индексу.
Спасибо . Я примерно так и предполагал что это для пользователя сделано . Т.е есть смысл если их десяток или больше , а если их 3,4,5 то и простые переменные сойдут).
Хорошо, успехов вам в дальнейшем освоении мастерства программирования
Добрый день! а как в массив записывать данные?
Напимер есть переменная d, и она прходит итерацию.
и каждая итерация должна записаться в массив adc_mas [10] = {}
как в него накопить 10 значений ??
Добрый вечер. Просто присваиваете adc_mas [d] = value, где value - значение, которое хотите записать в элемент массива с индексом d
Подскажите, еще будут выходить какие то обучающие статьи по AVR? Или дальше нужно смотреть статьи с готовыми устройствами и использовать информацию оттуда?
Да я просто не знаю уже какие еще обучающие статьи по AVR добавить на сайт. Вроде бы уже все на сайте есть. Смотрите статьи с готовыми устройствами, многие из них на нашем сайте достаточно подробно объяснены и по ним много чему можно научиться. Там есть и про использование АЦП и ШИМ в микроконтроллерах AVR, и подключение к ним различных датчиков и устройств. Посмотрите карту статей по AVR на нашем сайте, я думаю вы найдете там много интересных для себя статей
Здравствуйте.как это реализовать на attini13?
Добрый день. А в чем конкретно проблема?