Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
340 Микроконтроллеры AVR от азов программирования... Определение номера текущей мелодии 190 Ids count,melod ; Читаем код текущей мелодии 191 inc count ; Увеличение номера мелодии на 1 192 cpi count, 8 ; Проверка на последнюю мелодию 193 brne km2 ; Если не последняя, переход 194 clr count Обнуление счетчика 195 km2 : sts melod,count ; Помещаем номер в ячейку памяти ; -------- -------------------- Выбор мелодии 196 km3. mov YL, count ; Вычисляем адрес, где 197 ldi ZL, low(tabm*2) ; хранится начало мелодии 198 ldi ZH, high(tabm*2) 199 rcall addw ; К подпрограмме 16-разрядного сложения 200 1pm XL, Z+ ; Извлекаем адреса из таблицы 201 1pm XH, Z , и помещаем в X --------------------------------------------------- Воспроизведение мелодии 202 203 km4. mov mov ZH, XH ZL, XL , Записываем в Z начало мелодии 204 km5: in temp, PINB ; Читаем содержимое порт В 205 sbrc temp, 6 ; Проверяем нажата ли еще кнопка звонка 206 rjmp km6 ; Если равно (кнопки отпущены) в начало 207 1pm temp, Z ; Извлекаем код ноты 208 cpi temp, OxFF ; Проверяем, не конец ли мелодии 209 breq m4 ; Если конец, начинаем мелодию сначала 210 andi temp, 0x1F , Выделяем код тона из кода ноты 211 mov fnota, temp ; Записываем в регистр кода тона 212 1pm temp, Z+ ; Еще раз берем код ноты 213 rol temp , Производим четырехкратный сдвиг кода ноты 214 rol temp 215 rol temp 216 rol temp 217 andi temp, 0x07 ; Выделяем код длительности 218 mov dnota, temp , Помещаем ее в регистр длительности 219 rcall nota ; К подпрограмме воспроизведения ноты 220 rjmp km5 ; В начало цикла (следующая нота) 221 km6. ldi temp, 0x00 ; Выключаем звук 222 out TCCR1A, temp 223 rjmp main ; Переходим к началу Вспомогательные подпрограммы ----------------------------------------- Подпрограмма 16-ти разрядного сложения 224 addw: push YH 225 lsl YL Умножение первого слагаемого на 2 226 ldi YH, 0 ; Второй байт первого слагаемого = 0 227 add ZL, YL Складываем два слагаемых 228 adc ZH, YH 229 pop YH 230 ret -- Подпрограмма исполнения одной ноты 231 nota: push ZH 232 push ZL 233 push YL 234 push temp 235 cpi fnota, 0x00 , Проверка, не пауза ли
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==