📄 dtmf2.lst
字号:
1 .file "dtmf2.c"
2 .arch at90s2313
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
12 .text
13 .Ltext0:
74 .section .progmem.data,"a",@progbits
77 __c.0:
78 0000 4454 4D46 .string "DTMF Decoder by www.infidigm.net"
78 2044 6563
78 6F64 6572
78 2062 7920
78 7777 772E
79 .text
81 .global main
83 main:
1:dtmf2.c **** /** Version 2.00 - 76% program mem used **/
2:dtmf2.c ****
3:dtmf2.c **** #define sleep() __asm__ __volatile__ ("sleep")
4:dtmf2.c **** #define wdr() __asm__ __volatile__ ("wdr")
5:dtmf2.c **** #define sei() __asm__ __volatile__ ("sei" ::)
6:dtmf2.c **** #define cli() __asm__ __volatile__ ("cli" ::)
7:dtmf2.c **** #define nop() __asm__ __volatile__ ("nop" ::)
8:dtmf2.c **** #define UART_CPU 3579545 /* 3.579545Mhz */
9:dtmf2.c **** #define UART_BAUD_RATE 9600 /* baud rate*/
10:dtmf2.c **** #define UART_BAUD_SELECT (UART_CPU/(UART_BAUD_RATE*16l)-1)
11:dtmf2.c **** #define PRINT(string) (UART_PrintfProgStr(PSTR(string)))
12:dtmf2.c **** #define lcdata(data) lcdwrt(1, data)
13:dtmf2.c **** #define lcdcmd(cmd) lcdwrt(0, cmd)
14:dtmf2.c ****
15:dtmf2.c **** #include <avr/io.h>
16:dtmf2.c **** #include <avr/signal.h>
17:dtmf2.c **** #include <avr/pgmspace.h>
18:dtmf2.c ****
19:dtmf2.c **** extern void UART_PrintfProgStr (unsigned char* pBuf);
20:dtmf2.c **** void TXbyte( char data ); //Transmits 1 byte out the UART
21:dtmf2.c **** void ewrite (char address, char data); //Writes char to EEPROM address
22:dtmf2.c **** unsigned char eread (char address); //Reads char from EEPROM address
23:dtmf2.c **** void store(unsigned char edata); //Compresses and appends digit to the end of eeprom
24:dtmf2.c **** void trnsfr(char line, char eol); //Moves digits from eeprom to LCD line
25:dtmf2.c **** void updtlcd(unsigned char ldata); //Handles writing new dtmf digit to LCD
26:dtmf2.c **** void line19(void); //restores Ln 19 before the scroll
27:dtmf2.c **** unsigned char fltr(char fdata); //Filters digits for 10,#,* and 0x0F
28:dtmf2.c **** void lcdwrt(char dt, char data); //Writes Byte to LCD dt=0 Control dt=1 data
29:dtmf2.c ****
30:dtmf2.c **** unsigned char lcdtemp[13]; //holds bottom LCD line
31:dtmf2.c **** unsigned char eepos; //eeprom address of marker byte
32:dtmf2.c **** unsigned char lcdpos; //position of cursor on LCD
33:dtmf2.c **** unsigned char lcdln; //line number on LCD
34:dtmf2.c **** unsigned char eref; //eeprom address of last digit on Ln 18
35:dtmf2.c **** unsigned char esrl; //eeprom address of last digit on current lcd Ln
36:dtmf2.c **** unsigned char redraw; //flag to re-draw Ln 18,19 on incomming digit
37:dtmf2.c **** unsigned char a; //temporatry variable
38:dtmf2.c **** unsigned char uptimeH; //up botton release filter timer
39:dtmf2.c **** unsigned char uptimeL; //up botton pressed filter timer
40:dtmf2.c **** unsigned char dntimeH; //down botton release filter timer
41:dtmf2.c **** unsigned char dntimeL; //down botton pressed filter timer
42:dtmf2.c **** volatile unsigned char up; //up flag
43:dtmf2.c **** volatile unsigned char dn; //down flag
44:dtmf2.c ****
45:dtmf2.c **** int main (void)
46:dtmf2.c **** {
85 .LM1:
86 /* prologue: frame size=0 */
87 0000 C0E0 ldi r28,lo8(__stack - 0)
88 0002 D0E0 ldi r29,hi8(__stack - 0)
89 0004 DEBF out __SP_H__,r29
90 0006 CDBF out __SP_L__,r28
91 /* prologue end (size=4) */
47:dtmf2.c **** cli();
93 .LM2:
94 .LBB2:
95 /* #APP */
96 0008 F894 cli
48:dtmf2.c **** //Setup Ports
49:dtmf2.c **** DDRB = 0x00; //Set PORTB as input
98 .LM3:
99 /* #NOAPP */
100 000a 17BA out 55-0x20,__zero_reg__
50:dtmf2.c **** DDRD = 0x70; //Set PORTD output pins
102 .LM4:
103 000c 80E7 ldi r24,lo8(112)
104 000e 81BB out 49-0x20,r24
51:dtmf2.c **** cbi(PORTB,4); //HiZ - Disable decoder chip's output
106 .LM5:
107 0010 C498 cbi 56-0x20,4
52:dtmf2.c **** //Setup UATRT
53:dtmf2.c **** UBRR = (char)UART_BAUD_SELECT;
109 .LM6:
110 0012 86E1 ldi r24,lo8(22)
111 0014 89B9 out 41-0x20,r24
54:dtmf2.c **** UCR = 0x08; //enable Tx
113 .LM7:
114 0016 88E0 ldi r24,lo8(8)
115 0018 8AB9 out 42-0x20,r24
55:dtmf2.c **** //Setup TimerCounter0
56:dtmf2.c **** TCCR0 = 0x03; //Set TC0 to ck/64 4.5mS IRQs
117 .LM8:
118 001a 83E0 ldi r24,lo8(3)
119 001c 83BF out 83-0x20,r24
57:dtmf2.c **** TIMSK = 0x02; //Enable OV0 INT
121 .LM9:
122 001e 82E0 ldi r24,lo8(2)
123 0020 89BF out 89-0x20,r24
58:dtmf2.c **** //Setup MCU
59:dtmf2.c **** GIMSK = 0x80; //Enable INT1
125 .LM10:
126 0022 80E8 ldi r24,lo8(-128)
127 0024 8BBF out 91-0x20,r24
60:dtmf2.c **** MCUCR = 0x2C; //Setup Sleep mode & INT1 rising
129 .LM11:
130 0026 8CE2 ldi r24,lo8(44)
131 0028 85BF out 85-0x20,r24
61:dtmf2.c **** GIFR = 0xC0; //Clear INT1 Flag
133 .LM12:
134 002a 80EC ldi r24,lo8(-64)
135 002c 8ABF out 90-0x20,r24
62:dtmf2.c ****
63:dtmf2.c **** for(eepos=0;eepos<255;eepos++) { //scan eeprom for marker byte
137 .LM13:
138 002e 1092 0000 sts eepos,__zero_reg__
139 .L7:
64:dtmf2.c **** if(eread(eepos)==0x0F) break;
141 .LM14:
142 0032 8091 0000 lds r24,eepos
143 0036 70D1 rcall eread
144 0038 8F30 cpi r24,lo8(15)
145 003a 39F0 breq .L3
147 .LM15:
148 003c 8091 0000 lds r24,eepos
149 0040 8F5F subi r24,lo8(-(1))
150 0042 8093 0000 sts eepos,r24
151 0046 8F3F cpi r24,lo8(-1)
152 0048 A1F7 brne .L7
153 .L3:
65:dtmf2.c **** }
66:dtmf2.c ****
67:dtmf2.c **** eref = eepos; //set end of line 18 at end of eeprom
155 .LM16:
156 004a 8091 0000 lds r24,eepos
157 004e 8093 0000 sts eref,r24
68:dtmf2.c **** lcdln = 19;
159 .LM17:
160 0052 83E1 ldi r24,lo8(19)
161 0054 8093 0000 sts lcdln,r24
69:dtmf2.c **** redraw = 1; //Redraw incoming screen on first digit recieved
163 .LM18:
164 0058 81E0 ldi r24,lo8(1)
165 005a 8093 0000 sts redraw,r24
70:dtmf2.c ****
71:dtmf2.c **** lcdcmd (0x01); //Clear LCD, move home
167 .LM19:
168 005e 682F mov r22,r24
169 0060 80E0 ldi r24,lo8(0)
170 0062 55D2 rcall lcdwrt
72:dtmf2.c **** lcdcmd (0x02); //Home Cursor
172 .LM20:
173 0064 62E0 ldi r22,lo8(2)
174 0066 80E0 ldi r24,lo8(0)
175 0068 52D2 rcall lcdwrt
73:dtmf2.c **** lcdcmd (0x38); //Set 8-bit interface
177 .LM21:
178 006a 68E3 ldi r22,lo8(56)
179 006c 80E0 ldi r24,lo8(0)
180 006e 4FD2 rcall lcdwrt
74:dtmf2.c **** lcdcmd (0x0C); //No cursor, display visable
182 .LM22:
183 0070 6CE0 ldi r22,lo8(12)
184 0072 80E0 ldi r24,lo8(0)
185 0074 4CD2 rcall lcdwrt
75:dtmf2.c **** lcdcmd (0x06); //Incement display address
187 .LM23:
188 0076 66E0 ldi r22,lo8(6)
189 0078 80E0 ldi r24,lo8(0)
190 007a 49D2 rcall lcdwrt
76:dtmf2.c ****
77:dtmf2.c **** TXbyte ('\r');
192 .LM24:
193 007c 8DE0 ldi r24,lo8(13)
194 007e 3BD1 rcall TXbyte
78:dtmf2.c **** TXbyte ('\n');
196 .LM25:
197 0080 8AE0 ldi r24,lo8(10)
198 0082 39D1 rcall TXbyte
79:dtmf2.c **** PRINT ("DTMF Decoder by www.infidigm.net"); //build message on lcd and out uart
200 .LM26:
201 0084 80E0 ldi r24,lo8(__c.0)
202 0086 90E0 ldi r25,hi8(__c.0)
203 0088 0AD1 rcall UART_PrintfProgStr
80:dtmf2.c **** TXbyte ('\r');
205 .LM27:
206 008a 8DE0 ldi r24,lo8(13)
207 008c 34D1 rcall TXbyte
81:dtmf2.c **** TXbyte ('\n');
209 .LM28:
210 008e 8AE0 ldi r24,lo8(10)
211 0090 32D1 rcall TXbyte
82:dtmf2.c ****
83:dtmf2.c **** for (a=0;a<255;a++) {
213 .LM29:
214 0092 1092 0000 sts a,__zero_reg__
215 .L12:
84:dtmf2.c **** TXbyte(fltr(eread(a + eepos+1))); //Send entire eeprom out the UART
217 .LM30:
218 0096 8091 0000 lds r24,a
219 009a 9091 0000 lds r25,eepos
220 009e 890F add r24,r25
221 00a0 8F5F subi r24,lo8(-(1))
222 00a2 3AD1 rcall eread
223 00a4 1CD2 rcall fltr
224 00a6 27D1 rcall TXbyte
226 .LM31:
227 00a8 8091 0000 lds r24,a
228 00ac 8F5F subi r24,lo8(-(1))
229 00ae 8093 0000 sts a,r24
230 00b2 8F3F cpi r24,lo8(-1)
231 00b4 81F7 brne .L12
85:dtmf2.c **** }
86:dtmf2.c **** TXbyte ('\r');
233 .LM32:
234 00b6 8DE0 ldi r24,lo8(13)
235 00b8 1ED1 rcall TXbyte
87:dtmf2.c **** TXbyte ('\n');
237 .LM33:
238 00ba 8AE0 ldi r24,lo8(10)
239 00bc 1CD1 rcall TXbyte
88:dtmf2.c ****
89:dtmf2.c **** sei();
241 .LM34:
242 /* #APP */
243 00be 7894 sei
90:dtmf2.c **** for(;;) sleep(); //idle until Interrupt
245 .LM35:
246 /* #NOAPP */
247 .L13:
248 /* #APP */
249 00c0 8895 sleep
250 /* #NOAPP */
251 00c2 FECF rjmp .L13
91:dtmf2.c **** }
253 .LM36:
254 .LBE2:
255 /* epilogue: frame size=0 */
256 /* epilogue: noreturn */
257 /* epilogue end (size=0) */
258 /* function main size 101 (97) */
260 .Lscope0:
263 .global __vector_2
265 __vector_2:
92:dtmf2.c ****
93:dtmf2.c ****
94:dtmf2.c ****
95:dtmf2.c **** SIGNAL(SIG_INTERRUPT1) //Exturnal IRQ from DTMF decoder handler
96:dtmf2.c **** {
267 .LM37:
268 /* prologue: frame size=0 */
269 00c4 1F92 push __zero_reg__
270 00c6 0F92 push __tmp_reg__
271 00c8 0FB6 in __tmp_reg__,__SREG__
272 00ca 0F92 push __tmp_reg__
273 00cc 1124 clr __zero_reg__
274 00ce 1F93 push r17
275 00d0 2F93 push r18
276 00d2 3F93 push r19
277 00d4 4F93 push r20
278 00d6 5F93 push r21
279 00d8 6F93 push r22
280 00da 7F93 push r23
281 00dc 8F93 push r24
282 00de 9F93 push r25
283 00e0 AF93 push r26
284 00e2 BF93 push r27
285 00e4 EF93 push r30
286 00e6 FF93 push r31
287 /* prologue end (size=18) */
97:dtmf2.c **** unsigned char digit;
98:dtmf2.c **** cli();
289 .LM38:
290 .LBB3:
291 /* #APP */
292 00e8 F894 cli
99:dtmf2.c **** DDRB = 0x00; //Set PORTB = input
294 .LM39:
295 /* #NOAPP */
296 00ea 17BA out 55-0x20,__zero_reg__
100:dtmf2.c **** sbi(PORTD,4); //Enable decoder chip's output
298 .LM40:
299 00ec 949A sbi 50-0x20,4
101:dtmf2.c **** nop();
301 .LM41:
302 /* #APP */
303 00ee 0000 nop
102:dtmf2.c **** digit = PINB; //read dtmf digit
305 .LM42:
306 /* #NOAPP */
307 00f0 16B3 in r17,54-0x20
103:dtmf2.c **** cbi(PORTD,4); //HiZ - Disable decoder chip's output
309 .LM43:
310 00f2 9498 cbi 50-0x20,4
104:dtmf2.c **** digit=digit&0x0F; //Stip off top 4 bits
312 .LM44:
313 00f4 1F70 andi r17,lo8(15)
105:dtmf2.c **** updtlcd(fltr(digit)); //send digit to LCD
315 .LM45:
316 00f6 812F mov r24,r17
317 00f8 F2D1 rcall fltr
318 00fa 6DD1 rcall updtlcd
106:dtmf2.c **** store(digit); //write digit to eeprom
320 .LM46:
321 00fc 812F mov r24,r17
322 00fe 1DD1 rcall store
107:dtmf2.c **** TXbyte(fltr(digit)); //send digit out the UART
324 .LM47:
325 0100 812F mov r24,r17
326 0102 EDD1 rcall fltr
327 0104 F8D0 rcall TXbyte
108:dtmf2.c **** sei();
329 .LM48:
330 /* #APP */
331 0106 7894 sei
109:dtmf2.c **** }
333 .LM49:
334 /* #NOAPP */
335 .LBE3:
336 /* epilogue: frame size=0 */
337 0108 FF91 pop r31
338 010a EF91 pop r30
339 010c BF91 pop r27
340 010e AF91 pop r26
341 0110 9F91 pop r25
342 0112 8F91 pop r24
343 0114 7F91 pop r23
344 0116 6F91 pop r22
345 0118 5F91 pop r21
346 011a 4F91 pop r20
347 011c 3F91 pop r19
348 011e 2F91 pop r18
349 0120 1F91 pop r17
350 0122 0F90 pop __tmp_reg__
351 0124 0FBE out __SREG__,__tmp_reg__
352 0126 0F90 pop __tmp_reg__
353 0128 1F90 pop __zero_reg__
354 012a 1895 reti
355 /* epilogue end (size=18) */
356 /* function __vector_2 size 55 (19) */
361 .Lscope1:
364 .global __vector_6
366 __vector_6:
110:dtmf2.c ****
111:dtmf2.c **** SIGNAL(SIG_OVERFLOW0) //TC0 overflow IRQ handle - every 4.5mS
112:dtmf2.c **** {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -