- •Обучение : Программирование на Си для pic
- •Как работает мк. Программа в мк. Области памяти в мк.
- •Байты и биты.
- •Переменные и константы.
- •Как и какие микроконтроллеры будем программировать?
- •Установка mplab 8.30 и интеграция picc Compiler 9.50.
- •Создание проекта с помощью волшебника (wizard)
- •Программа №1. «Рыба».
- •Как работают функции. Комментарии.
- •Физиололгия работы программы в мк.
- •Программа №2. «Продолжение рыбы». Именование портов и линий
- •Регистры портов. Определение направлений работы линий.
- •Ифы, форы, вайлы или основы интеллекта. Истина не ложь
- •For (в течение)
- •While (пока)
- •Switch-case-break (выбрать набор и выйти)
- •Return (возврат)
- •Избыточный займ и переполнение
- •Составление проекта из нескольких файлов исходников
- •На что обратить внимание в примерах?
- •Массивы.
- •Void perebor void{ // начало функции «перебор»
- •Динамическая индикация. Прерывания. Структуры
Void perebor void{ // начало функции «перебор»
unsigned char tmp; // некая локальная переменная tmp
unsigned int tmp2; // локальная переменная tmp2
for (tmp=0; tmp<9; tmp++) // цикл на основе tmp
// инкрементировать tmp пока tmp<9 и начать с нуля
{ // начало цикла, т.к. в теле цикла несколько строк
PORTB = arr_seg [tmp]; // прописать в порт число из массива по номеру tmp
tmp2 = 0xffff; // в tmp2 поместить некое максимальное число
while (tmp2-->0); /* выполнять декрементирование tmp2
до тех пор, т.е. ПОКА tmp больше нуля */
} // конец цикла, т.к. в теле цикла несколько строк
} // конец функции «перебор»
Как-то так. Почему сразу не написали так? Вам нужно набивать руку в комбинировании функций и одновременно видеть и сравнивать одни с другими решениями. Выходной код уменьшится, но это не должно быть определяющим фактором в написании. Для вас важна прозрачность. Возможно, расписанный вариант из трех функций в каком-то месте окажется более полезным. Ну, например, если вам нужно использовать функцию задержки другими функциями. Или, например, если вам нужно на индикатор вывести какой-то определенный символ в любом месте программы, например «пятёрку», для этого достаточно в коде написать ris_sim (5); что означает нарисовать символ 5. Необходимо понимать, что кроме символов цифр, мы можем в массив прописать и символы некоторых букв, например, A b C d E F УРА и даже пробел (увеличив размерность массива) J.
Не расслабляемся. Рассмотрим еще двухмерный массив.
unsigned int array [5][6]; |
массив array состоит из переменных типа unsigned int в котором 5 строк по 6 элементов. |
const unsigned char arr_all [2][3]={ {1,2,3}, {4,5,6} }; |
массив констант arr_all состоит из переменных типа unsigned char в котором 2 строки по 3 элемента в каждой строке. |
и другие варианты по аналогии с предыдущими.
Исключительно интересная вещь – двухмерный массив. Например, мы имеем графический индикатор 64*128 пикселей. Организуем соответствующий массив, в который можем поместить некий графический образ. Через простейшие циклы несложно организовать обмен с массивом (матрицей) вида array [Y][X] , где по YX будет число, определяющее включен или нет пиксель, а для цветных индикаторов возможен и цвет.
Приведем пример для начинающих. Представим что у нас два семисегментных индикатора. Представим, что у них разная распиновка. Усложним задачу – они разного типа (один с общим анодом, другой с общим катодом). Можно два массива – для одного и для другого индикатора. А можно сделать компактно и красиво, с помощью двухмерного массива. Array [Y][X] – по Y будем различать первый и второй индикатор, а по X выводимые символы. Нам нужно будет только один раз напрячь мозг, чтобы прописать соответствующие битовые последовательности каждого символа для каждого разряда.
Вы можете возразить, что в практике вы такого не допустите. Ой, не зарекайтесь. Вот один из моих примеров печатной платы.
Это двухразрядный индикатор. Каждая линия управления объединяет разноименные сегменты (ну может где-то и одноименные). Удобно? Несомненно, односторонняя печатная плата с толстыми дорожками это всегда удобно (хоть маркером рисуй). Такой тип разводки индикатора я называю «греческим» рисунком, когда разноименные сегменты разных разрядов соединяются на плате одной дорожкой без перемычек.
На что обратить внимание? Посмотрите как в двухмерном массиве перечисляются элементы и как расставлены фигурные скобки. Строго говоря, можно перечислить в одну строчку.
Необходимо отметить, что массивы позволяют эффективно организовывать хранение и доступ к элементам с минимальными затратами программного кода. Так или иначе, в практике может возникнуть ситуация, когда объем массива глобальных переменных может физически не уместиться в текущем банке памяти (в нулевом банке). Для этого следует использовать префикс указывающий другой банк.
unsigned char bank1 arr_begushaya_stroka[180];
На этом краткое введение в массивы закончим. Знание двух основных видов и практическое их использование значительно облегчат ваш кодинг.
