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

📄 8880.lst

📁 使用8880实现DTMF通信及拨号的程序.
💻 LST
📖 第 1 页 / 共 5 页
字号:
     2A1 C00B      RJMP	0x02AD
(0115) 	   else
(0116) 	   	  serial_send(InnerCmd[i].help);
     2A2 E006      LDI	R16,6
     2A3 2F14      MOV	R17,R20
     2A4 0201      MULS	R16,R17
     2A5 01F0      MOVW	R30,R0
     2A6 E682      LDI	R24,0x62
     2A7 E090      LDI	R25,0
     2A8 0FE8      ADD	R30,R24
     2A9 1FF9      ADC	R31,R25
     2AA 8100      LDD	R16,Z+0
     2AB 8111      LDD	R17,Z+1
     2AC D3A8      RCALL	_serial_send
(0117) 	}
(0118) 	return 0;
     2AD 2700      CLR	R16
     2AE 2711      CLR	R17
     2AF C4DF      RJMP	pop_xgsetF00C
_ParseArgs:
  i                    --> R10
  state                --> R22
  c                    --> R20
  argv                 --> Y,+8
  argc                 --> R12
  cmdline              --> R10
     2B0 D4F3      RCALL	push_xgsetF03C
     2B1 0169      MOVW	R12,R18
     2B2 0158      MOVW	R10,R16
(0119) }
(0120) void ParseArgs(char *cmdline,signed char *argc,char** argv)
(0121) {
(0122) #define STATE_WHITESPACE	0
(0123) #define STATE_WORD			1
(0124) 
(0125) 	char *c;
(0126) 	char state = STATE_WHITESPACE;
     2B3 2766      CLR	R22
(0127) 	char i;
(0128) 
(0129) 	*argc = 0;
     2B4 2422      CLR	R2
     2B5 01F6      MOVW	R30,R12
     2B6 8220      STD	Z+0,R2
(0130) 
(0131) 	if(strlen(cmdline) == 0)
     2B7 0185      MOVW	R16,R10
     2B8 D49A      RCALL	_strlen
     2B9 3000      CPI	R16,0
     2BA 0701      CPC	R16,R17
     2BB F409      BNE	0x02BD
(0132) 		return;
     2BC C033      RJMP	0x02F0
(0133) 
(0134) 	/* convert all tabs into single spaces */
(0135) 	c = cmdline;
     2BD 01A5      MOVW	R20,R10
     2BE C008      RJMP	0x02C7
(0136) 	while(*c != '\0')
(0137) 	{
(0138) 		if(*c == '\t')
     2BF 01FA      MOVW	R30,R20
     2C0 8180      LDD	R24,Z+0
     2C1 3089      CPI	R24,0x9
     2C2 F411      BNE	0x02C5
(0139) 			*c = ' ';
     2C3 E280      LDI	R24,0x20
     2C4 8380      STD	Z+0,R24
(0140) 		c++;
     2C5 5F4F      SUBI	R20,0xFF
     2C6 4F5F      SBCI	R21,0xFF
     2C7 01FA      MOVW	R30,R20
     2C8 8020      LDD	R2,Z+0
     2C9 2022      TST	R2
     2CA F7A1      BNE	0x02BF
(0141) 	}
(0142) 	
(0143) 	c = cmdline;
     2CB 01A5      MOVW	R20,R10
(0144) 	i = 0;
     2CC 24AA      CLR	R10
     2CD C01C      RJMP	0x02EA
(0145) 
(0146) 	/* now find all words on the command line */
(0147) 	while(*c != '\0')
(0148) 	{
(0149) 		if(state == STATE_WHITESPACE)
     2CE 2366      TST	R22
     2CF F489      BNE	0x02E1
(0150) 		{
(0151) 			if(*c != ' ')
     2D0 01FA      MOVW	R30,R20
     2D1 8180      LDD	R24,Z+0
     2D2 3280      CPI	R24,0x20
     2D3 F0A1      BEQ	0x02E8
(0152) 			{
(0153) 				argv[i] = c;		//将argv[i]指向c
     2D4 2DEA      MOV	R30,R10
     2D5 27FF      CLR	R31
     2D6 0FEE      LSL	R30
     2D7 1FFF      ROL	R31
     2D8 8408      LDD	R0,Y+8
     2D9 8419      LDD	R1,Y+9
     2DA 0DE0      ADD	R30,R0
     2DB 1DF1      ADC	R31,R1
     2DC 8351      STD	Z+1,R21
     2DD 8340      STD	Z+0,R20
(0154) 				i++;
     2DE 94A3      INC	R10
(0155) 				state = STATE_WORD;
     2DF E061      LDI	R22,1
(0156) 			}
(0157) 		}
     2E0 C007      RJMP	0x02E8
(0158) 		else
(0159) 		{ /* state == STATE_WORD */
(0160) 			if(*c == ' ')
     2E1 01FA      MOVW	R30,R20
     2E2 8180      LDD	R24,Z+0
     2E3 3280      CPI	R24,0x20
     2E4 F419      BNE	0x02E8
(0161) 			{
(0162) 				*c = '\0';
     2E5 2422      CLR	R2
     2E6 8220      STD	Z+0,R2
(0163) 				state = STATE_WHITESPACE;
     2E7 2766      CLR	R22
(0164) 			}
(0165) 		}
(0166) 		c++;
     2E8 5F4F      SUBI	R20,0xFF
     2E9 4F5F      SBCI	R21,0xFF
     2EA 01FA      MOVW	R30,R20
     2EB 8020      LDD	R2,Z+0
     2EC 2022      TST	R2
     2ED F701      BNE	0x02CE
(0167) 	}
(0168) 	
(0169) 	*argc = i;
     2EE 01F6      MOVW	R30,R12
     2EF 82A0      STD	Z+0,R10
     2F0 C4BC      RJMP	pop_xgsetF03C
_GetCmdMatch:
  i                    --> R10
  cmd                  --> R12
     2F1 D47D      RCALL	push_xgset003C
     2F2 0168      MOVW	R12,R16
(0170) #undef STATE_WHITESPACE
(0171) #undef STATE_WORD
(0172) }
(0173) signed char GetCmdMatch(char * cmd)
(0174) {
(0175)  	char i=0;
     2F3 24AA      CLR	R10
     2F4 C011      RJMP	0x0306
(0176)  	while(InnerCmd[i].cmd){
(0177) 		if (strcmp(InnerCmd[i].cmd,cmd)==0) return i;
     2F5 0196      MOVW	R18,R12
     2F6 E086      LDI	R24,6
     2F7 9D8A      MUL	R24,R10
     2F8 01F0      MOVW	R30,R0
     2F9 E680      LDI	R24,0x60
     2FA E090      LDI	R25,0
     2FB 0FE8      ADD	R30,R24
     2FC 1FF9      ADC	R31,R25
     2FD 8100      LDD	R16,Z+0
     2FE 8111      LDD	R17,Z+1
     2FF D43D      RCALL	_strcmp
     300 3000      CPI	R16,0
     301 0701      CPC	R16,R17
     302 F411      BNE	0x0305
     303 2D0A      MOV	R16,R10
     304 C00F      RJMP	0x0314
(0178) 		i++;
     305 94A3      INC	R10
     306 E086      LDI	R24,6
     307 9D8A      MUL	R24,R10
     308 01F0      MOVW	R30,R0
     309 E680      LDI	R24,0x60
     30A E090      LDI	R25,0
     30B 0FE8      ADD	R30,R24
     30C 1FF9      ADC	R31,R25
     30D 8020      LDD	R2,Z+0
     30E 8031      LDD	R3,Z+1
     30F 2022      TST	R2
     310 F721      BNE	0x02F5
     311 2033      TST	R3
     312 F711      BNE	0x02F5
(0179) 	}
(0180)  	 return -1;
     313 EF0F      LDI	R16,0xFF
     314 C44F      RJMP	pop_xgset003C
_ParseCmd:
  argv                 --> Y,+3
  argc                 --> Y,+2
  Cmd_Index            --> R20
  cmdline              --> R10
     315 D45E      RCALL	push_xgset300C
     316 0158      MOVW	R10,R16
     317 972D      SBIW	R28,0xD
(0181) }
(0182) void ParseCmd(char *cmdline)
(0183) {
(0184)   signed char argc,Cmd_Index;
(0185)   char *argv[5];
(0186)   ParseArgs(cmdline,&argc,argv);
     318 01CE      MOVW	R24,R28
     319 9603      ADIW	R24,3
     31A 8399      STD	Y+1,R25
     31B 8388      STD	Y+0,R24
     31C 019E      MOVW	R18,R28
     31D 5F2E      SUBI	R18,0xFE
     31E 4F3F      SBCI	R19,0xFF
     31F 0185      MOVW	R16,R10
     320 DF8F      RCALL	_ParseArgs
(0187)   if (argc==0) return;
     321 802A      LDD	R2,Y+2
     322 2022      TST	R2
     323 F409      BNE	0x0325
     324 C02C      RJMP	0x0351
(0188)   Cmd_Index=GetCmdMatch(argv[0]);
     325 810B      LDD	R16,Y+3
     326 811C      LDD	R17,Y+4
     327 DFC9      RCALL	_GetCmdMatch
     328 2F40      MOV	R20,R16
(0189)   if (Cmd_Index<0){
     329 3000      CPI	R16,0
     32A F424      BGE	0x032F
(0190)   	 serial_send("unknow command\n");
     32B E80A      LDI	R16,0x8A
     32C E010      LDI	R17,0
     32D D327      RCALL	_serial_send
(0191) 	 return;
     32E C022      RJMP	0x0351
(0192)   }
(0193)   if (InnerCmd[Cmd_Index].proc)
     32F E006      LDI	R16,6
     330 2F14      MOV	R17,R20
     331 0201      MULS	R16,R17
     332 01F0      MOVW	R30,R0
     333 E684      LDI	R24,0x64
     334 E090      LDI	R25,0
     335 0FE8      ADD	R30,R24
     336 1FF9      ADC	R31,R25
     337 8020      LDD	R2,Z+0
     338 8031      LDD	R3,Z+1
     339 2022      TST	R2
     33A F411      BNE	0x033D
     33B 2033      TST	R3
     33C F0A1      BEQ	0x0351
(0194)   	 InnerCmd[Cmd_Index].proc(argc,argv);
     33D 019E      MOVW	R18,R28
     33E 5F2D      SUBI	R18,0xFD
     33F 4F3F      SBCI	R19,0xFF
     340 810A      LDD	R16,Y+2
     341 E086      LDI	R24,6
     342 930F      PUSH	R16
     343 931F      PUSH	R17
     344 2F08      MOV	R16,R24
     345 0201      MULS	R16,R17
     346 01F0      MOVW	R30,R0
     347 911F      POP	R17
     348 910F      POP	R16
     349 E684      LDI	R24,0x64
     34A E090      LDI	R25,0
     34B 0FE8      ADD	R30,R24
     34C 1FF9      ADC	R31,R25
     34D 81A0      LDD	R26,Z+0
     34E 81B1      LDD	R27,Z+1
     34F 01FD      MOVW	R30,R26
     350 D465      RCALL	xicall
     351 962D      ADIW	R28,0xD
     352 C426      RJMP	pop_xgset300C
_shellin:
  buf                  --> Y,+0
     353 97E3      SBIW	R28,0x33
(0195) } 
(0196) void shellin(void)
(0197) {	 
(0198) 	 char buf[51];
(0199)  	 if (serial_recv(buf,50)>0){
     354 E322      LDI	R18,0x32
     355 E030      LDI	R19,0
     356 018E      MOVW	R16,R28
     357 D31A      RCALL	_serial_recv
     358 3000      CPI	R16,0
     359 0701      CPC	R16,R17
     35A F011      BEQ	0x035D
(0200) 	 	ParseCmd(buf);
     35B 018E      MOVW	R16,R28
     35C DFB8      RCALL	_ParseCmd
(0201) 	 };
     35D 96E3      ADIW	R28,0x33
     35E 9508      RET
FILE: E:\Shuaihu\AVR\8880\main.c
(0001) //ICC-AVR application builder : 2007-10-27 10:16:42
(0002) // Target : M8
(0003) // Crystal: 7.3728Mhz
(0004) 
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) #include "8880.h"
(0008) #include "serial.h"
(0009) #include "main.h"
(0010) #include "shell.h"
(0011) #include "timer.h"
(0012) SysOption sysoption;
(0013) void delay(unsigned int x)
(0014) {
(0015)  for (;x>0;x--);
_delay:
  x                    --> R16
     35F C002      RJMP	0x0362
     360 5001      SUBI	R16,1
     361 4010      SBCI	R17,0
     362 3000      CPI	R16,0
     363 0701      CPC	R16,R17
     364 F7D9      BNE	0x0360
     365 9508      RET
(0016) 
(0017) }
(0018) void port_init(void)
(0019) {
(0020)  PORTB = 0x20;  //00010000
_port_init:
     366 E280      LDI	R24,0x20
     367 BB88      OUT	0x18,R24
(0021)  DDRB  = 0x0F;  //00001111
     368 E08F      LDI	R24,0xF
     369 BB87      OUT	0x17,R24
(0022)  PORTC = 0x0F;  //00001111
     36A BB85      OUT	0x15,R24
(0023)  DDRC  = 0x2F;  //00100000
     36B E28F      LDI	R24,0x2F
     36C BB84      OUT	0x14,R24
(0024)  PORTD = 0x0e;  //00000100
     36D E08E      LDI	R24,0xE
     36E BB82      OUT	0x12,R24
(0025)  DDRD  = 0x02;  //00000010
     36F E082      LDI	R24,2
     370 BB81      OUT	0x11,R24
     371 9508      RET
(0026) }
(0027) 
(0028) //call this routine to initialize all peripherals
(0029) void init_devices(void)
(0030) {
(0031)  //stop errant interrupts until set up
(0032)  CLI(); //disable all interrupts
_init_devices:
     372 94F8      BCLR	7
(0033)  port_init();
     373 DFF2      RCALL	_port_init
(0034)  uart0_init();
     374 D25B      RCALL	_uart0_init
(0035)  MCUCR = 0x08;
     375 E088      LDI	R24,0x8
     376 BF85      OUT	0x35,R24
(0036)  GICR  = 0x80;
     377 E880      LDI	R24,0x80
     378 BF8B      OUT	0x3B,R24
(0037)  TIMSK = 0x00; //timer interrupt sources
     379 2422      CLR	R2
     37A BE29      OUT	0x39,R2
(0038)  timer1_init();
     37B D341      RCALL	_timer1_init
(0039)  SEI(); //re-enable interrupts
     37C 9478      BSET	7
     37D 9508      RET
_main:
  buf                  --> Y,+0
     37E 9764      SBIW	R28,0x14
(0040)  //all peripherals are now initialized
(0041) }
(0042) void main(void)
(0043) {
(0044)  char buf[20];
(0045)   init_devices();
     37F DFF2      RCALL	_init_devices
(0046)  M8880_Init();
     380 D072      RCALL	_M8880_Init
(0047)  sysoption.echo=-1;
     381 EF8F      LDI	R24,0xFF
     382 9380 0202 STS	sysoption,R24
(0048)  sysoption.calling=0;
     384 2422      CLR	R2
     385 9220 0203 STS	sysoption+1,R2
(0049)  sysoption.timer=0;
     387 9220 0205 STS	sysoption+3,R2
(0050)  sysoption.autoanswer=0;
     389 9220 0206 STS	0x0206,R2
     38B C001      RJMP	0x038D
(0051)  while(1)shellin();
     38C DFC6      RCALL	_shellin
     38D CFFE      RJMP	0x038C
     38E 9664      ADIW	R28,0x14
     38F 9508      RET
FILE: E:\Shuaihu\AVR\8880\8880.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "8880.h"
(0004) #include "serial.h"
(0005) #include "main.h"
(0006) #include "timer.h"
(0007) char sendbuf[M8880_SEND_BUFSIZE];
(0008) char recvbuf[M8880_RECV_BUFSIZE];
(0009) M8880_STATE M8880_State;
(0010) char *noresponse="noresponse\n";
(0011) char *handdown="handdown\n";
(0012) char *c_ok="ok\n";
(0013) char *c_error="error\n";
(0014) char *c_busying="busying\n";
(0015) char *calling="calling\n";
(0016) char *answering="answering\n";
(0017) void M8880_WriteChar(char c)
(0018) {
(0019)  	 M8880_DataPort&=0xf0; 								//CLR low 4bit
_M8880_WriteChar:
  c                    --> R16
     390 B385      IN	R24,0x15
     391 7F80      ANDI	R24,0xF0
     392 BB85      OUT	0x15,R24
(0020)  	 M8880_CtrlPort&=~(M8880_CS|M8880_RW|M8880_RS); 	//CLR CS  RW  RS hold CLK

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -