Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств

322 Микроконтроллеры AVR от азов программирования... 59 ш4: if (PINB.7==1) goto comp; // Проверка переключателя режимов // -------------------- . ------------------------------------ Запись кода в EEPROM 60 klen=n; // Запись длины кода 61 for (1=0, 1<п; 1++) bufe[i]=bufr[i]; // Запись всех байтов кода 62 goto zamok; // К процедуре открывания замка // --------------------------------------------------------- Проверка кода 63 comp' if (klen 1 =и) goto ml; // Проверка длины кода 64 for (1=0; i<ii, i++) if (bufe[i] ’ =bufr[i] ) goto ml ; // Проверка кода // --------------------------------------------------------- Открывание замка 65 zamok: PORTB. 4=1; // Открываем замок 66 wait(3); // Задержка 3-го типа 67 PORTB. 4=0; // Закрываем замок Кардинальным отличием программы на языке СИ является тот факт, что все шестнадцатиразрядные значения, используемые в программе, теперь не нужно разбивать на отдельные байты. Для хранения каждой такой величины программа использует либо переменную, либо кон ­ станту соответствующего типа. Например, для хранения разных вариантов кода состояния клавиа ­ туры в программе используется несколько переменных: ♦ codO — строка 17; ♦ codl — строка 18; ♦ cods — строка 37. И все они имеют тип unsigned char. При этом сам этот код пред ­ ставляет собой шестнадцатиразрядное двоичное число, старшие восемь разрядов соответствуют содержимому порта РВ, а младшие восемь раз ­ рядов — содержимому порта PD (на все это наложена маска). Начинается наша программа, как и все предыдущие, с присоединения библиотечного файла (строка 1). Далее идет блок описания констант (строки 2 — 5). Первая константа имеет имя kl f гее и значение 0х77Е Это значение представляет собой код состояния клавиатуры при отпущен ­ ных кнопках. Константа используется в операциях сравнения. Следующие три константы: kzad (код задержки), kandr (константа антидребезга) и bsize (размер буфера для кодовой комбинации) по сво ­ ему назначению аналогичны соответствующим константам в программе на Ассемблере. У них даже значения одинаковы. Отличие только в значе ­ нии константы bsize. В нашем случае она равна не 60, а 30. Почему буфер стал вдвое короче? Дело в том, что на Ассемблере буфер представлял собой набор ячеек памяти размером в один байт каждая. Любое новое значение записывалось в буфер в виде двух отдельных бай ­ тов. В программе на СИ в качестве буфера будет использоваться массив, состоящий из шестнадцатиразрядных элементов. Каждое значение в такой буфер заносится как один отдельный элемент.

RkJQdWJsaXNoZXIy MTExODQxMg==