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

📄 8880.lst

📁 使用8880实现DTMF通信及拨号的程序.
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
     16B E5CF      LDI	R28,0x5F
     16C E0D4      LDI	R29,4
     16D BFCD      OUT	0x3D,R28
     16E BFDE      OUT	0x3E,R29
     16F 5CC8      SUBI	R28,0xC8
     170 40D0      SBCI	R29,0
     171 EA0A      LDI	R16,0xAA
     172 8308      STD	Y+0,R16
     173 2400      CLR	R0
     174 E0E2      LDI	R30,2
     175 E0F2      LDI	R31,2
     176 E012      LDI	R17,2
     177 3EE3      CPI	R30,0xE3
     178 07F1      CPC	R31,R17
     179 F011      BEQ	0x017C
     17A 9201      ST	R0,Z+
     17B CFFB      RJMP	0x0177
     17C 8300      STD	Z+0,R16
     17D E3E3      LDI	R30,0x33
     17E E0F1      LDI	R31,1
     17F E6A0      LDI	R26,0x60
     180 E0B0      LDI	R27,0
     181 E012      LDI	R17,2
     182 E000      LDI	R16,0
     183 BF0B      OUT	0x3B,R16
     184 3DE5      CPI	R30,0xD5
     185 07F1      CPC	R31,R17
     186 F021      BEQ	0x018B
     187 95C8      LPM
     188 9631      ADIW	R30,1
     189 920D      ST	R0,X+
     18A CFF9      RJMP	0x0184
     18B D1F2      RCALL	_main
_exit:
     18C CFFF      RJMP	_exit
_read:
  x                    --> R10
  buf                  --> Y,+0
  argv                 --> R22
  argc                 --> R20
     18D D5FA      RCALL	push_xgsetF00C
     18E 01B9      MOVW	R22,R18
     18F 2F40      MOV	R20,R16
     190 97EF      SBIW	R28,0x3F
     191 97A5      SBIW	R28,0x25
FILE: E:\Shuaihu\AVR\8880\shell.c
(0001) #include "serial.h"
(0002) #include "string.h"
(0003) #include "8880.h"
(0004) #include <iom8v.h>
(0005) #include "main.h"
(0006) #include "shell.h"
(0007) typedef int (*cmdproc)(char argc,char *argv[]);
(0008) typedef struct tagCMDSTRUCT{
(0009) 	   char *cmd;
(0010) 	   char *help;
(0011) 	   cmdproc proc;
(0012) }CMD_STRUCT,*PCMD_STRUCT;
(0013) signed char GetCmdMatch(char * cmd);
(0014) CMD_STRUCT InnerCmd[]={
(0015) 		   {"help","Desplay this information.\n",help},
(0016) 		   {"call","call a telphon number,uses:call 110\n",call},
(0017) 		   {"cancel","cancel a call process.\n", cancel},
(0018) 		   {"echo","enable or disenable echo.\n",echo},
(0019) 		   {"read","read a number from remote.\n",read},
(0020) 		   {"autoanswer","auto answer the remote call.\n",autoanswer}, 
(0021) 		   {0,0}
(0022) };
(0023) int read(char argc,char*argv[])
(0024) {
(0025)  	char buf[100];
(0026) 	int x=atoi(argv[1]);
     192 01FB      MOVW	R30,R22
     193 8102      LDD	R16,Z+2
     194 8113      LDD	R17,Z+3
     195 D63D      RCALL	_atoi
     196 0158      MOVW	R10,R16
(0027) 	if ((argc<2)||(!sysoption.calling)) {
     197 3042      CPI	R20,2
     198 F020      BCS	0x019D
     199 9020 0203 LDS	R2,sysoption+1
     19B 2022      TST	R2
     19C F441      BNE	0x01A5
(0028) 	   serial_send(c_error);
     19D 9100 0190 LDS	R16,c_error
     19F 9110 0191 LDS	R17,c_error+1
     1A1 D4B3      RCALL	_serial_send
(0029) 	   return 0;
     1A2 2700      CLR	R16
     1A3 2711      CLR	R17
     1A4 C005      RJMP	0x01AA
(0030) 	}
(0031)  	M8880_Recv(buf,x);
     1A5 2D2A      MOV	R18,R10
     1A6 018E      MOVW	R16,R28
     1A7 D36A      RCALL	_M8880_Recv
(0032) 	serial_send(buf);
     1A8 018E      MOVW	R16,R28
     1A9 D4AB      RCALL	_serial_send
     1AA 96EF      ADIW	R28,0x3F
     1AB 96A5      ADIW	R28,0x25
     1AC C5E2      RJMP	pop_xgsetF00C
_autoanswer:
  argv                 --> R20
  argc                 --> R22
     1AD D5D0      RCALL	push_xgsetF000
     1AE 01A9      MOVW	R20,R18
     1AF 2F60      MOV	R22,R16
(0033) }
(0034) int autoanswer(char argc,char*argv[])
(0035) {
(0036)  	if (argc<2){
     1B0 3062      CPI	R22,2
     1B1 F440      BCC	0x01BA
(0037) 	   serial_send(c_error);
     1B2 9100 0190 LDS	R16,c_error
     1B4 9110 0191 LDS	R17,c_error+1
     1B6 D49E      RCALL	_serial_send
(0038) 	   return 0;
     1B7 2700      CLR	R16
     1B8 2711      CLR	R17
     1B9 C017      RJMP	0x01D1
(0039) 	}
(0040) 	if (strcmp(argv[1],"on")==0)
     1BA EB24      LDI	R18,0xB4
     1BB E030      LDI	R19,0
     1BC 01FA      MOVW	R30,R20
     1BD 8102      LDD	R16,Z+2
     1BE 8113      LDD	R17,Z+3
     1BF D57D      RCALL	_strcmp
     1C0 3000      CPI	R16,0
     1C1 0701      CPC	R16,R17
     1C2 F421      BNE	0x01C7
(0041) 	   sysoption.autoanswer=-1;
     1C3 EF8F      LDI	R24,0xFF
     1C4 9380 0206 STS	0x0206,R24
     1C6 C003      RJMP	0x01CA
(0042) 	else
(0043) 	   sysoption.autoanswer=0;
     1C7 2422      CLR	R2
     1C8 9220 0206 STS	0x0206,R2
(0044) 	serial_send(c_ok); 
     1CA 9100 018E LDS	R16,c_ok
     1CC 9110 018F LDS	R17,c_ok+1
     1CE D486      RCALL	_serial_send
(0045) 	return 0;
     1CF 2700      CLR	R16
     1D0 2711      CLR	R17
     1D1 C5B1      RJMP	pop_xgsetF000
_echo:
  argv                 --> R20
  argc                 --> R22
     1D2 D5AB      RCALL	push_xgsetF000
     1D3 01A9      MOVW	R20,R18
     1D4 2F60      MOV	R22,R16
(0046) }
(0047) int echo(char argc,char*argv[])
(0048) {
(0049)  	if (argc<2){
     1D5 3062      CPI	R22,2
     1D6 F440      BCC	0x01DF
(0050) 	   serial_send(c_error);
     1D7 9100 0190 LDS	R16,c_error
     1D9 9110 0191 LDS	R17,c_error+1
     1DB D479      RCALL	_serial_send
(0051) 	   return 0;
     1DC 2700      CLR	R16
     1DD 2711      CLR	R17
     1DE C017      RJMP	0x01F6
(0052) 	}
(0053) 	if (strcmp(argv[1],"on")==0)
     1DF EB24      LDI	R18,0xB4
     1E0 E030      LDI	R19,0
     1E1 01FA      MOVW	R30,R20
     1E2 8102      LDD	R16,Z+2
     1E3 8113      LDD	R17,Z+3
     1E4 D558      RCALL	_strcmp
     1E5 3000      CPI	R16,0
     1E6 0701      CPC	R16,R17
     1E7 F421      BNE	0x01EC
(0054) 	   sysoption.echo=-1;
     1E8 EF8F      LDI	R24,0xFF
     1E9 9380 0202 STS	sysoption,R24
     1EB C003      RJMP	0x01EF
(0055) 	else
(0056) 	   sysoption.echo=0;
     1EC 2422      CLR	R2
     1ED 9220 0202 STS	sysoption,R2
(0057) 	serial_send(c_ok);
     1EF 9100 018E LDS	R16,c_ok
     1F1 9110 018F LDS	R17,c_ok+1
     1F3 D461      RCALL	_serial_send
(0058) 	return 0;
     1F4 2700      CLR	R16
     1F5 2711      CLR	R17
     1F6 C58C      RJMP	pop_xgsetF000
_call:
  i                    --> R22
  c                    --> R22
  argv                 --> R20
  argc                 --> R22
     1F7 D586      RCALL	push_xgsetF000
     1F8 01A9      MOVW	R20,R18
     1F9 2F60      MOV	R22,R16
(0059) }
(0060) int call(char argc,char*argv[])
(0061) {
(0062)  	char i;
(0063) 	char *c;
(0064) 	if (sysoption.calling){
     1FA 9020 0203 LDS	R2,sysoption+1
     1FC 2022      TST	R2
     1FD F041      BEQ	0x0206
(0065) 	   serial_send(c_busying);
     1FE 9100 0192 LDS	R16,c_busying
     200 9110 0193 LDS	R17,c_busying+1
     202 D452      RCALL	_serial_send
(0066) 	   return 0;
     203 2700      CLR	R16
     204 2711      CLR	R17
     205 C041      RJMP	0x0247
(0067) 	};
(0068) 	if (argc<2){
     206 3062      CPI	R22,2
     207 F440      BCC	0x0210
(0069) 	   serial_send(c_error);
     208 9100 0190 LDS	R16,c_error
     20A 9110 0191 LDS	R17,c_error+1
     20C D448      RCALL	_serial_send
(0070) 	   return 0;
     20D 2700      CLR	R16
     20E 2711      CLR	R17
     20F C037      RJMP	0x0247
(0071) 	}
(0072) 	c=argv[1];
     210 01FA      MOVW	R30,R20
     211 8162      LDD	R22,Z+2
     212 8173      LDD	R23,Z+3
     213 C013      RJMP	0x0227
(0073) 	while(*c){
(0074) 		if ((*c<'0')||(*c>'9')) {
     214 01FB      MOVW	R30,R22
     215 8020      LDD	R2,Z+0
     216 2433      CLR	R3
     217 2D82      MOV	R24,R2
     218 3380      CPI	R24,0x30
     219 F018      BCS	0x021D
     21A E389      LDI	R24,0x39
     21B 1582      CP	R24,R2
     21C F440      BCC	0x0225
(0075) 		   serial_send(c_error);
     21D 9100 0190 LDS	R16,c_error
     21F 9110 0191 LDS	R17,c_error+1
     221 D433      RCALL	_serial_send
(0076) 		   return 0;
     222 2700      CLR	R16
     223 2711      CLR	R17
     224 C022      RJMP	0x0247
(0077) 		}
(0078) 		c++;
     225 5F6F      SUBI	R22,0xFF
     226 4F7F      SBCI	R23,0xFF
     227 01FB      MOVW	R30,R22
     228 8020      LDD	R2,Z+0
     229 2022      TST	R2
     22A F749      BNE	0x0214
(0079) 	}
(0080)  	M8880_Handup;
     22B 9AAD      SBI	0x15,5
(0081) 	for (i=0;i<10;i++)
     22C 2766      CLR	R22
     22D C004      RJMP	0x0232
(0082) 	delay(0xffff);
     22E EF0F      LDI	R16,0xFF
     22F EF1F      LDI	R17,0xFF
     230 D12E      RCALL	_delay
     231 9563      INC	R22
     232 306A      CPI	R22,0xA
     233 F3D0      BCS	0x022E
(0083)  	M8880_CPDial(argv[1]); 
     234 01FA      MOVW	R30,R20
     235 8102      LDD	R16,Z+2
     236 8113      LDD	R17,Z+3
     237 D315      RCALL	_M8880_CPDial
(0084) 	sysoption.calling=1;
     238 E081      LDI	R24,1
     239 9380 0203 STS	sysoption+1,R24
(0085) 	sysoption.timer=0;
     23B 2422      CLR	R2
     23C 9220 0205 STS	sysoption+3,R2
(0086) 	TCCR1B=0x05;
     23E E085      LDI	R24,5
     23F BD8E      OUT	0x2E,R24
(0087) 	serial_send(calling);
     240 9100 0194 LDS	R16,calling
     242 9110 0195 LDS	R17,calling+1
     244 D410      RCALL	_serial_send
(0088) 	return 0;
     245 2700      CLR	R16
     246 2711      CLR	R17
     247 C53B      RJMP	pop_xgsetF000
_cancel:
  i                    --> R20
  argv                 --> Y,+3
  argc                 --> Y,+1
     248 D516      RCALL	push_arg4
     249 934A      ST	R20,-Y
(0089) }
(0090) int cancel(char argc,char*argv[])
(0091) {
(0092)  	char i;
(0093)  	M8880_Handdown;
     24A 98AD      CBI	0x15,5
(0094) 	for (i=0;i<10;i++) delay(0xffff);
     24B 2744      CLR	R20
     24C C004      RJMP	0x0251
     24D EF0F      LDI	R16,0xFF
     24E EF1F      LDI	R17,0xFF
     24F D10F      RCALL	_delay
     250 9543      INC	R20
     251 304A      CPI	R20,0xA
     252 F3D0      BCS	0x024D
(0095) 	sysoption.calling=0;
     253 2422      CLR	R2
     254 9220 0203 STS	sysoption+1,R2
(0096)  	MCUCR&=~0xc;
     256 B785      IN	R24,0x35
     257 7F83      ANDI	R24,0xF3
     258 BF85      OUT	0x35,R24
(0097) 	MCUCR|=0x8;
     259 B785      IN	R24,0x35
     25A 6088      ORI	R24,0x8
     25B BF85      OUT	0x35,R24
(0098) 	serial_send(c_ok);
     25C 9100 018E LDS	R16,c_ok
     25E 9110 018F LDS	R17,c_ok+1
     260 D3F4      RCALL	_serial_send
(0099)  	return 0;
     261 2700      CLR	R16
     262 2711      CLR	R17
     263 9149      LD	R20,Y+
     264 9624      ADIW	R28,4
     265 9508      RET
_help:
  i                    --> R20
  argv                 --> R22
  argc                 --> R10
     266 D521      RCALL	push_xgsetF00C
     267 01B9      MOVW	R22,R18
     268 2EA0      MOV	R10,R16
(0100) }
(0101) int help(char argc,char* argv[])
(0102) {
(0103)  	signed char i=0;
     269 2744      CLR	R20
(0104) 	if (argc==1){
     26A 2D8A      MOV	R24,R10
     26B 3081      CPI	R24,1
     26C F551      BNE	0x0297
     26D C01A      RJMP	0x0288
(0105) 	   while(InnerCmd[i].cmd){
(0106) 		serial_send(InnerCmd[i].cmd);
     26E E006      LDI	R16,6
     26F 2F14      MOV	R17,R20
     270 0201      MULS	R16,R17
     271 01F0      MOVW	R30,R0
     272 E680      LDI	R24,0x60
     273 E090      LDI	R25,0
     274 0FE8      ADD	R30,R24
     275 1FF9      ADC	R31,R25
     276 8100      LDD	R16,Z+0
     277 8111      LDD	R17,Z+1
     278 D3DC      RCALL	_serial_send
(0107) 		serial_send(":\t");
     279 EB01      LDI	R16,0xB1
     27A E010      LDI	R17,0
     27B D3D9      RCALL	_serial_send
(0108) 		serial_send(InnerCmd[i].help);
     27C E006      LDI	R16,6
     27D 2F14      MOV	R17,R20
     27E 0201      MULS	R16,R17
     27F 01F0      MOVW	R30,R0
     280 E682      LDI	R24,0x62
     281 E090      LDI	R25,0
     282 0FE8      ADD	R30,R24
     283 1FF9      ADC	R31,R25
     284 8100      LDD	R16,Z+0
     285 8111      LDD	R17,Z+1
     286 D3CE      RCALL	_serial_send
(0109) 		i++;
     287 9543      INC	R20
     288 E006      LDI	R16,6
     289 2F14      MOV	R17,R20
     28A 0201      MULS	R16,R17
     28B 01F0      MOVW	R30,R0
     28C E680      LDI	R24,0x60
     28D E090      LDI	R25,0
     28E 0FE8      ADD	R30,R24
     28F 1FF9      ADC	R31,R25
     290 8020      LDD	R2,Z+0
     291 8031      LDD	R3,Z+1
     292 2022      TST	R2
     293 F6D1      BNE	0x026E
     294 2033      TST	R3
     295 F6C1      BNE	0x026E
(0110) 	   }
(0111) 	}else{
     296 C016      RJMP	0x02AD
(0112) 	   i=GetCmdMatch(argv[1]);
     297 01FB      MOVW	R30,R22
     298 8102      LDD	R16,Z+2
     299 8113      LDD	R17,Z+3
     29A D056      RCALL	_GetCmdMatch
     29B 2F40      MOV	R20,R16
(0113) 	   if (i<0)
     29C 3000      CPI	R16,0
     29D F424      BGE	0x02A2
(0114) 	   	  serial_send("Haven't this command.\n");
     29E E90A      LDI	R16,0x9A
     29F E010      LDI	R17,0
     2A0 D3B4      RCALL	_serial_send

⌨️ 快捷键说明

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