24.Н. Заец. Электронные самоделки для быта, отдыха и здоровья.— М.: СОЛОН-Пресс, 2009, 423 с.
ПРИЛОЖЕНИЯ
ПРИЛОЖЕНИЕ А
Файл основной программы
| Псевдокоманды управления | |||||||||||
| 1 | include | Tn23l3def | inc. | :присоединение файла описание | |||||||
| 2 | . list | : Включение листинга | |||||||||
| 3 | .def | loop1= | RO | . Три ячейки для процедуры задержки | |||||||
| 4 | .def | loop2 = | R1 | ||||||||
| 5 | .def | loop З = | R21 | ||||||||
| 6 | .def | temp= | R16 | : Вспомогательный регистр | |||||||
| 7 | .def | temp1 = | R17 | : Второй вспомогательный регистр | |||||||
| 8 | .def | count = | R17 | :Определение регистра счетчика опросаклавиш | |||||||
| 9 | .def | fnota= | R19 | :Частота текущей ноты | |||||||
| 10 | .def | dnota | = R20 | :Длительность текущей ноты | |||||||
| -------- Начало программного кода | |||||||||||
| 11 | cseg | :Выбор сегмента программного кода | |||||||||
| 12 | org | 0 | : Установка текущего адреса на ноль | ||||||||
| 13 | start | rtmp | init: Переход на начало программы | ||||||||
| 14 | ret1 | : Внешнее прерывание 0 | |||||||||
| 15 | ret1 | : Внешнее прерывание 1 | |||||||||
| 16 | ret1 | : Таймер/счётчик1 захват | |||||||||
| 17 | ret1 | : Таймер/счетчик 1. совпадение канал А | |||||||||
| 18 | ret1 | : Таймер/счетчик 1, прерывание попереполнению | |||||||||
| 19 | ret l | : Таймер/счетчик 0, прерывание по переполнению | |||||||||
| 20 | ret1 | ; Прерывание UART прием завершен | |||||||||
| 21 | ret1 | ; Прерывание UART регистр данных пуст | |||||||||
| 22 | ret1 | . Прерывание UART передана завершена | |||||||||
| 25 | ret1 | ; Прерывание по компаратору | |||||||||
| 24 | ret1 | : Прерывание ло изменений на любом контакте | |||||||||
| 25 | ret1 | : Таимер/счетчик 1 Совпадение, канал В | |||||||||
| 26 | ret1 | : Таймер/счетчик 0 Совпадение, канал В | |||||||||
| 27 | ret1 | :Таймер/ счетчик 0 Совпадение, канал А | |||||||||
| 28 | ret1 | USI готовность кстарту | |||||||||
| 29 | ret1 | USI Переполнение | |||||||||
| 30 | ret1 | EEPR0M Готовность | |||||||||
| 31 | ret1 | Переполнение охранного таймера | |||||||||
| init | |||||
| Инициализация стека | |||||
| 32 | ld1 | temp RAMED | Инициализация стека | ||
| 33 | out | SPL temp | |||
| Инициализация портов B/B | |||||
| 34 | ld1 | temp 0x08 | Инициализация порта PB | ||
| 35 | out | temp 0x7F | Инициализацияпорта PD | ||
| 36 | out | PORT temp | |||
| 37 | ld1 | temp 0x00 | |||
| 38 | out | DDRD: temp | |||
| Инициализация (выключение) компаратора | |||||
| 39 | ld1 | temp 0x80 | |||
| 40 | out | ACSR. temp | |||
| Инициализациятаймера T1 | |||||
| 41 | ld1 | temp 0x09 | Включениережима CTC | ||
| 42 | out | TCCR1B temp | |||
| 43 | m1 | ld1 | temp 0x00 | Выключениезвука | |
| 44 | out | TCCR1A temp | |||
| Начало основной программы | |||||
| main: | |||||
| Вычисление номера нажатой кнопки | |||||
| 45 | clr | COUNT | Обнуление счетчика опроса клавиш | ||
| 46 | ln | temp. PIND | Чтение порта D | ||
| 47 | m2 | lsr | temp | Сдвигаем входной байт | |
| 48 | brcc | m3 | Если текущий разряд был равен 0 | ||
| 49 | lnc | count | Увеличиваем показание счетчика | ||
| 50 | cp1 | count 7 | Сравнение(7-конец сканирования) | ||
| 51 | brne | m2 | Если не конец продолжить | ||
| 52 | rlmp | m1 | Если не одна клавиша не нажата | ||
| Выбор мелодии | |||||
| 53 | m3 | mov | YL count | Вычисляем адрес где | |
| 54 | ld1 | ZL low(tamb*2) | Храниться начало мелодии | ||
| 55 | ld1 | ZH high(tamb*2) | |||
| 56 | lcall | addw | К программе 16-разрядного сложения | ||
| 57 | lpm | XL Z+ | Извлекаем адрес из таблицы | ||
| 58 | lpm | XH Z | И помещаем в x | ||
| Воспроизведение мелодии | |||||
| 59 | m4 | mov | ZH. XH | Записываем в Z начало мелодии | |
| 60 | mov | ZL.XL | |||
| 61 | m5 | ln | tempPINO | Читаем содержимое порта D | |
| 62 | cpl | temp 0x7F | Проверяем на равенство 7FH | ||
| 63 | dreg | m1 | Если равно(скобки опущены) в начало | ||
| 64 | lpm | temp Z | Извлекаем код ноты | ||
| 65 | cpl | temp 0xFF | Проверяем не конец ли мелодии | ||
| 66 | dreg | m4 | Если конец начинаем мелодию сначала | ||
| 67 | and1 | temp 0x1f | Выделяем код тона из кода ноты | ||
| 68 | mov | tnota temp | Записываем в регистр кода тона | ||
| 69 | lpm | temp Z+ | Еще раз берем код ноты | ||
| 70 | col | temp | Производим сдвиг кода ноты | ||
| 71 | col | temp | |||
| 72 | col | temp | |||
| 73 | col | temp | |||
| 74 | and1 | temp. 0х07 | выделяем код длительности | ||
| 75 | mov | dnota temp | помещаем ее в регистр длительности | ||
| 76 | rcall | nota | к подпрограмме воспроизведения ноты | ||
| 77 | rjmp | m S | В начало цикла (следующая нота) | ||
| Вспомогательные подпрограммы | |||||
| 78 | addw | duch | YH | подпрограмма 16 разрядного сложения | |
| 79 | lsl | YL | Умножение первого слагаемого на 2 | ||
| 80 | ld1 | YH.O | второй байт первого слагаемого | ||
| 81 | add | ZL. YL | Складывается два слагаемых | ||
| 82 | adc | ZH. YH | |||
| 83 | pop | YH | |||
| 84 | ret | ||||
| Подпрограмма исполнения одной ноты | |||||
| 85 | nota. | push | ZH | ||
| 86 | push | ZL | |||
| 87 | push | YL | |||
| 88 | push | temp | |||
| 89 | col | fnota. 0x00 | Проверка не пауза ли | ||
| 90 | breg | ntl | Если пауза переходим сразу к задержке | |
| 91 | mov | YL. fnota | Вычисляемадресгдехраниться | |
| 92 | idi | ZL low (tabkd*2) | коэффициентделениятекущейноты | |
| 93 | idi | ZH high (tabkd*2) | ||
| 94 | rcali | addw | К подпрограмме 16-разрядного сложения | |
| 95 | lpm | temp Z+ | Извлекаем ид. Разряд КД для текущей ноты | |
| 96 | lpm | templ Z | Извлекаем ст. разряд КД для текущей ноты | |
| 97 | out | OCRIAH temp | Записать в старш. Часть регистра совпадения | |
| 98 | out | OCRIAL temp | Записать в младш. Часть регистра совпадения | |
| 99 | idi | temp 0x40 | Включить звук | |
| 100 | out | TCCRIA temp | ||
| 101 | ntl: | rcall | wait | К программе задержки |
| 102 | idi | temp 0x00 | Выключить звук | |
| 103 | out | TCCRIA temp | ||
| 104 | idi | dnota 0 | Отбрасываем задержку для паузы между нотами | |
| 105 | rcall | wait | Пауза между нотами | |
| 106 | pop | temp | Завершение подпрограммы | |
| 107 | pop | YL | ||
| 108 | pop | ZL | ||
| 109 | pop | ZH | ||
| 110 | ret | |||
| Подпрограмма формирования задержки | ||||
| 111 | wait | push | ZH | |
| 112 | push | ZL | ||
| 113 | push | YH | ||
| 114 | push | YL | ||
| 115 | mov | YL dnota | Вычисляем адрес где храниться | |
| 116 | ld1 | ZL low(tabz*2) | нужный коэффициент задержки | |
| 117 | ld1 | ZH high(tabz*2) | ||
| 118 | rcall | addw | К программе 16-разрядного сложения | |
| 119 | lpm | YL Z+ | Читаем первый байт коэффициента задержки | |
| 120 | lpm | YH Z | Читаем второй байт коэффициента задержки | |
| 121 | ctr | ZL | обнуляем регистровую пару Z | |
| 122 | ctr | ZH | ||
| Цикл задержки | ||||
| 123 | w1 | ldl | loop 255 | Пустой внутренний цикл |
| 124 | w2 | dec | loop | |
| 125 | brne | w2 | ||
| 126 | adlw | R3O 1 | Увеличение регистровой пары Z на единицу | |
| 127 | co | YL ZL | Проверка младшего раздела | |
| 128 | brne | w1 | ||
| 129 | cp | YH ZH | Проверка старшего разряда | |
| 130 | brne | w1 | ||
| 131 | pop | YL | Завершение подпрограммы | |
| 132 | pop | YH | ||
| 133 | pop | ZL | ||
| 134 | pop | ZH | ||
| 135 | ret | |||
| Таблица длительности задержек | ||||
| 136 | tabz | dw | 128.256/512/1024.2048.4096.8192 | |
| Таблица коэффициента деления | ||||
| 137 | tabkd | dw | 0 | |
| 138 | dw | 4748.4480.4228.3992.3768.3556.3358.3168.2990.2822.2664.2514 | ||
| 139 | dw | 2374.2240.2114.1996.1884.1778.1678.1584.1495.1411.1332.1257 | ||
| 140 | dw | 1187.1120/1057.998.942.889.839.792 | ||
| Таблица начал всех мелодий | ||||
| 141 | tabа | dw | mei1*2, mei2*2, mei3*2, mei4*2, | |
| 142 | dw | mei5*2, mei6*2, mei7*2, | ||
| Таблица мелодий | ||||
| В траве сидел кузнечек | ||||
| 143 | mel1 | db | 109.104.109.104.109.108.108.96.108.104 | |
| 144 | db | 108.104.108.109.109.96.109.104.109.104 | ||
| 145 | db | 109.108.108.96.108.104. 109.104.109.104 | ||
| 146 | db | 112.112.112.111. 108.109.109.96.109.104 | ||
| 147 | db | 111.79.79.111.111.112.80.80.112.112.80 | ||
| 148 | db | 112.112.112.111. 108.109. 104.109.104 | ||
| 149 | db | 109.108.108.96.108.141.128.96.255 | ||
| Песенка крокодила Гены | ||||
| 150 | mel2 | db | 109.110.141.102.104.105.102.109.110.141 | |
| 151 | db | 111.79.79.111.111.112.80.80. 108.96.108 | ||
| 152 | db | 108.96.108.141.104.105.102.109.110.141 | ||
| 153 | db | 79.111.111.112.80. 96.108.104. 109 | ||
| 154 | db | 146.109.105.136.107.105.134.128.128.102 | ||
| 155 | db | 79.111.111.112.80. 96.110.176.112.108.109 | ||
| 156 | db | 109.105.136.107.105.134.105.142.146.144. | ||
| 157 | db | 105.136.107.105.134. 134.128.128.102.141 | ||
| 158 | db | 111.111.112.80. 96.110.176.136.107.105.134 | ||
| 159 | db | 105.134. 134.128.128.142.141.105.109.139 | ||
| 160 | db | 126.173.146.128.96.255 | ||
| В лесу родилась елочка | ||||
| 161 | mel3 | db | 132.141.141.139.141.137.132.132.132.141 | |
| 162 | db | 141.142.139.176.128.144.146.146.154.154 | ||
| 163 | db | 153.151.149.144.153.153.151.153.181.128 | ||
| 164 | db | 96.255 | ||
| Happy births to you | ||||
| 165 | mel4 | db | 107.107.141.139.144.143.128.107.107.141 | |
| 166 | db | 139.146.144.128.107.107.151.148.146.112 | ||
| 167 | db | 111.149.117.117.148.144.146.144.128.255 | ||
| С чего начинается родина | ||||
| 168 | mel5 | db | 99.175.109.107.106.102.99.144.111.175 | |
| 169 | db | 96.99.107.107.107.107.102.104.170.96 | ||
| 170 | db | 99.109.109.109.109.107.106.143.109.141 | ||
| 171 | db | 99.109.109.109.109.104.106.171.96.99 | ||
| 172 | db | 111.109.107.106.102.99.144.111.143.104 | ||
| 173 | db | 114.114.114.114.109.111.176.96.104.116 | ||
| 174 | db | 112.109.107.106.64.73.143.107.131.99 | ||
| 175 | db | 144.80.80.112.111.64.75.173.128.255 | ||
| Песня из кинофильма «Веселые ребята» | ||||
| 176 | mel6 | db | 105.109.112.149.116.64.80.148.114.64 | |
| 177 | db | 78.146.112.96.105.105.109.144.111.64 | ||
| 178 | db | 80.145.112.64.81.178.96.117.117.117 | ||
| 179 | db | 149.116.64.82.146.112.64.79.146.144 | ||
| 180 | db | 96.105.105.107.141.108.109.112.110.102 | ||
| 181 | db | 104.137.128.96.105.105.105.137.102.64 | ||
| 182 | db | 73.142.105.107.109.64.75.137.96.105 | ||
| 183 | db | 105.105.137.102.105.142.112.64.82.180 | ||
| 184 | db | 96.116.116.116.148.114.112.142.109.64 | ||
| 185 | db | 78.146.144.96.105.105.107.141.108.109 | ||
| 186 | db | 112.110.102.104.169.96.96.255 | ||
| Улыбка | ||||
| 187 | mel7 | db | 107.104.141.139.102.105.104.102.164.128 | |
| 188 | db | 104.107.109.109.109.111.114.112.111.109 | ||
| 189 | db | 144.139.128.109.111.144.96.111.109.104 | ||
| 190 | db | 107.105.173.128.111.109.112.107.111.109 | ||
| 191 | db | 109.107.102.104.134.132.128.100.103.107 | ||
| 192 | db | 107.107.107.139.112.100.103.102.102.102 | ||
| 193 | db | 134.102.103.107.105.107.108.108.108.108 | ||
| 194 | db | 107.105.107.108.144.142.128.112.107.110 | ||
| 195 | db | 140.112.105.108.107.107.107.105.140.139 | ||
| 196 | db | 139.112.103.102.103.105.108.107.105.103 | ||
| 197 | db | 128.112.107.110.108.108.108.108.140.112.105 | ||
| 198 | db | 108.107.107.107.139.112.103.102.103.105 | ||
| 199 | db | 108.107.105.103.105.1039.132.128.96.96 | ||
| 200 | db | 96.255 | ||
ПРИЛОЖЕНИЕБ