⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dtmf2.lst

📁 使用2X16的液晶(国内型号叫1602B)。可以将234个来电存在EEPROM中
💻 LST
📖 第 1 页 / 共 4 页
字号:
   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 + -