#include <16f84.h>
#use delay (clock=8000000) /* Сообщаем компилятору о тактовой частоте (8 МГц) */
#bit RA0 =5.0 /* 0-й бит порта А */
/* Объявляем функцию can_count(), которая не имеет параметров и не возвращает значения */
void can_count(void);
int EVENT, BATCH; /* Две глобальные переменные */
void main(void)
{
set_tris_a(0xFE); /* Конфигурируем RA0 как выход */
enable_interrupts(INT_EXT); /* Устанавливаем бит INTE регистра INTCON */
enable_interrupts(GLOBAL); /* Устанавливаем бит GIE регистра STATUS */
RA0 =0; /* Выставляем на RA0 НИЗКИЙ уровень */
while (1) /* Бесконечный цикл */
{
if (BATCH) /* Если переменная BATCH не равна нулю, */
{
BATCH =0; /* ТО обнуляем ее */
RA0 =1; /* и формируем на выводе RA0 */
delay_ms(1); /* импульс длительностью 1 мс */
RA0 = 0;
}
}
}
/ ******************************************
/* Процедура обработки прерывания */
#int_ext /* Обработчик внешнего прерывания */
void can_count(void)
{
if(++EVENT == 24) /* Инкрементируем счетчик, и ЕСЛИ он равен 24, */
{
EVENT=0; /* ТО обнуляем его */
ВАТСН++; /* и заносим в переменную BATCH ненулевое значение */
}
}
В теле бесконечного цикла непрерывно проверяется значение переменной BATCH. При ненулевом значении (ИСТИНА) переменная сбрасывается и на выводе RA0 формируется положительный импульс длительностью 1 мс. Использование встроенной функции компилятора delay_ms () является самым простым способом генерации точных задержек длительностью до 65 535 мс в этой реализации языка. Чтобы воспользоваться указанной возможностью, программист должен сообщить компилятору значение тактовой частоты микроконтроллера. Для формирования более коротких задержек можно использовать функции delay_us () и delay_cycles (). При работе с компиляторами, не имеющими подобных нестандартных функций, можно использовать собственные подпрограммы задержки, написанные на ассемблере.
Функция can_count () объявлена как
Поскольку функция can_count () является обработчиком прерывания, в нее нельзя обычным образом передать параметры, о чем сигнализирует ключевое слово void. Вместо этого все контролируемые и изменяемые переменные должны быть объявлены
В функции can_count ()
По сравнению с 40 командами программы, написанной на ассемблере, при использовании языка высокого уровня размер программы получается равным 94 командам. Однако в последнем случае поддержка прерываний была бы более гибкой при необходимости обработки запросов от нескольких источников прерываний, а функция задержки позволяла бы формировать более длинные интервалы, которые вполне могут возникнуть в реальной жизни.
Массив однотипных объектов определяется в Си с помощью конструкции fred[n], где fred — имя
unsigned int fred[16]
компилятор зарезервирует в памяти данных 16 регистров, расположенных подряд.
При объявлении массива можно задать для каждого элемента начальное значение. Например, запись