Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
Шаг 5. Переходим непосредственно к разработке устройств и программ 345 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 flash unsigned char mel3[ ] = {132,141,141,139,141,137,132,132,132,141,141,142,255}; flash unsigned char mel4[] = {107,107,141,139,144,143,128,107,107,141,139,146,255}; flash unsigned char mel5[] = {99,175,109,107,106,102,99,144,111,175,96,99,107, 255}; flash unsigned char mel6[] = {105,109,112,149,116,64,80,148,114,64,78,146,112,255}; flash unsigned char mel7[] = {107,104,141,139,102,105,104,102,164,128,104,107,255}; // Таблица начал всех мелодий flash unsigned char *tabm[] = {mel1, mel2, mel3, mel4, mel5, mel6, mel7}; // Прерывание по переполнению Таймера 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, for (k=0; k<kandr; k++) { cod1=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! =2) while(flz==0); } // Музыкальная программа void muz (void) { unsigned char fnota; unsigned char dnota; flash unsigned char *nota; TCCR1A=0x00, // Воспроизведение мелодии m3: nota = tabm[melod]; m4- if (PINB. 6» =0) goto m2; if (*nota==0xFF) goto m3; fnota = (*nota)&0x1F; dnota = ((*nota)»5)&0x07, // Создаем локальные переменные // Цикл антидребезга // Формируем первый байт кода // Формируем полный код состояния клавиатуры // Сравниваем с первоначальным кодом // Если не равны, сбрасываем счетчик // Новое значение первоначального кода // Выбор маски прерываний по таймеру // Обнуление таймера // Сброс флага задержки // Разрешаем прерывания // Цикл задержки И Код тона ноты // Код длительности ноты Ц Ссылка на текущую ноту Ц Выключение звука // Устанавливаем указатель на первую ноту // Если кнопка звонка не нажата, закончить // Проверка на конец мелодии // Определяем код тона // Определяем код длительности
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==