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

278 Микроконтроллеры AVR от азов программирования... ldi temp, 0x09 out TCCR1B. temp ldi temp, 0x00 out TCCR1A, temp Включаем режим СТС Выключаем звук ;****************************************************** main: Начало основной программы ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ --------------------------------------- Вычисление номер а нажатой кнопки 45 С1 г count ; Обнуление счетчика опроса клавиш 46 1П temp, PIND ; Чтение порта D 47 m2: 1 st temp ; Сдвигаем входной байт 48 Ьгсс m3 ; Если текущий разряд был равен 0 49 1ПС count ; Увеличиваем показание счетчика 50 cpi count, 7 ; Сравнение (7 - конец сканирования) 51 brne m2 ; Если не конец, продолжить 52 rjmp ml ; Если не одна клавиша не нажата ; -------- --------- Выбор мелодии 53 m3: mov YL, count ; Вычисляем адрес, где 54 ldi ZL, low(tabm*2) ; хранится начало мелодии 55 ldi ZH, high(tabm*2) 56 rcall addw ; К подпрограмме 16-разрядного сложения 57 1pm XL, Z+ ; Извлекаем адреса из таблицы 58 1pm XH, Z ; и помещаем в X --------------------------------------------------- Воспроизведение мелодии 59 т4: mov ZH, XH ; Записываем в Z начало мелодии 60 mov ZL, XL 61 т5: in temp, PIND ; Читаем содержимое порт D 62 cpi temp, 0x7F ; Проверяем на равенство 7FH 63 breq ml , Если равно (кнопки отпущены) в начало 64 1pm temp, Z ; Извлекаем код ноты 65 cpi temp, OxFF ; Проверяем, не конец ли мелодии 66 breq m4 ; Если конец, начинаем мелодию сначала 67 andi temp, OxlF ; Выделяем код тона из кода ноты 68 mov fnota, temp ; Записываем в регистр кода тона 69 1pm temp, Z+ ; Еще раз берем код ноты 70 rol temp ; Производим четырехкратный сдвиг кода ноты 71 rol temp 72 rol temp 73 rol temp 74 andi temp, 0x07 ; Выделяем код длительности 75 mov dnota, temp ; Помещаем ее в регистр длительности 76 rcall nota ; К подпрограмме воспроизведения ноты 77 rjmp m5 ; В начало цикла (следующая нота) Вспомогательные подпрограммы ; ----------------------------------------- Подпрограмма 16-ти разрядного сложения 78 addw: push YH 79 1S1 YL 80 ldi YH, 0 81 add ZL, YL 82 adc ZH, YH 83 pop YH 84 ret Умножение первого слагаемого на 2 Второй байт первого слагаемого = 0 Складываем два слагаемых ------------------------------------------- Подпрограмма исполнения одной ноты 85 nota: push ZH 86 push ZL 87 push YL 88 push temp

RkJQdWJsaXNoZXIy MTExODQxMg==