Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
Шаг 5. Переходим непосредственно к разработке устройств и программ 321 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 unsigned char flz; unsigned int butr[bsize]; «pragma warn- eeprom unsigned char klen, eeprom unsigned int bufe[bsizej; «pragma warn+ // Флаг задержки // Буфер в ОЗУ для хранения кода // Ячейка для хранения длины кода // Буфер в EEPROM для хранения кода // Прерывание по переполнению Таймера 1 interrupt [TIM1_0VF] void timer1_ovf_isr(void) { flz=1; // Прерывание по совпадению в канале А Таймера 1 interrupt [TIM1_C0MPA] void timer1_compa_isr(void) { flz=1, } // Функция опроса клавиатуры и антидребезга unsigned int incod (void) unsigned int cod0=0; // unsigned int cod1; // unsigned char k; // Создаем локальные переменные Вспомогательная переменная Еще одна вспомогательная переменная Параметр цикла антидребезга k<kandr, k++) // Цикл антидребезга cod 1 =PINB&0x7 , cod1=(cod1«8)+(PIND&0x7F); if (cod0 ’ =cod1) * k=0, cod0=cod1; // Формируем первый байт кода // Формируем полный код состояния клавиатуры // Сравниваем с первоначальным кодом // Если не равны, сбрасываем счетчик И Новое значение первоначального кода } } return cod1; // Процедура формирования задержки void wait (unsigned char kodz) { if (kodz==1) TIMSK=0x40, else TIMSK=0x80; TCNT1=0, flz=0; #asm("sei"); if (kodz 1 =2) while(flz==0); // Выбор маски прерываний по таймеру И Обнуление таймера // Сброс флага задержки // Разрешаем прерывания Ц Цикл задержки // Основная функция void main(void) unsigned char и; unsigned char i ; unsigned int codS; // Указатель массива // Вспомогательный указатель // Старый код P0RTB=0xE7, DDRB=0x18, P0RTD=0x7F; DDRD=0x00; I / Порт В // Порт D TCCR1A=0x00, TCCR1B=0x03; TCNT1=0; 0CR1A=kzad, // Таймер/Счетчик 1 // Обнуление счетного регистра // Инициализация регистра совпадения ACSR=0x80, // Аналоговый компаратор while (1) ml: while (incod() != klfree), while (incod() == klfree), n=0; m2: «asmrcli"); wait(1); codS=incod(); buf r[n++]=codS; if (n>=bsize) goto m4; wait(2); m3 1 if (incod() != codS) goto m2, if (flz==0) goto m3; // Ожидание отпускания кнопок // Ожидание нажатия кнопок // Запрещаем прерывания // Задержка 1-го типа // Ввод кода и запись, как старого // Запись очередного кода в буфер // Проверка конца буфера // Задержка 2-го типа // Проверка, не изменилось ли состояние // Проверка флага окончания задержки
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==