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 |
ПРИЛОЖЕНИЕБ