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

📄 8880.lst

📁 使用8880实现DTMF通信及拨号的程序.
💻 LST
📖 第 1 页 / 共 5 页
字号:
     4D6 94AA      DEC	R10
     4D7 E080      LDI	R24,0
     4D8 158A      CP	R24,R10
     4D9 F3B0      BCS	0x04D0
(0146) 	}
(0147) 	M8880_WriteChar(*M8880_State.CurSend);
     4DA 91E0 0208 LDS	R30,M8880_State+1
     4DC 91F0 0209 LDS	R31,M8880_State+2
     4DE 8100      LDD	R16,Z+0
     4DF DEB0      RCALL	_M8880_WriteChar
     4E0 C2BC      RJMP	pop_xgset303C
_M8880_Dial:
  c                    --> R20
  x                    --> R10
     4E1 D292      RCALL	push_xgset300C
     4E2 0158      MOVW	R10,R16
(0148) }
(0149) char number[]={10,1,2,3,4,5,6,7,8,9};
(0150) void M8880_Dial(char *x)
(0151) {
(0152)  	char *c;
(0153) 	if (*x==0) return;
     4E3 01F5      MOVW	R30,R10
     4E4 8020      LDD	R2,Z+0
     4E5 2022      TST	R2
     4E6 F409      BNE	0x04E8
     4E7 C029      RJMP	0x0511
(0154) 	while(M8880_State.Sending);
     4E8 9020 0211 LDS	R2,0x0211
     4EA 2022      TST	R2
     4EB F7E1      BNE	0x04E8
(0155) 	M8880_State.SendCount=0;
     4EC 2422      CLR	R2
     4ED 9220 0207 STS	M8880_State,R2
(0156) 	M8880_State.Sending=-1;
     4EF EF8F      LDI	R24,0xFF
     4F0 9380 0211 STS	0x0211,R24
(0157) 	c=sendbuf;
     4F2 E444      LDI	R20,0x44
     4F3 E052      LDI	R21,2
     4F4 C012      RJMP	0x0507
(0158)  	while(*x){
(0159) 		*c++=number[(*x++)-'0'];
     4F5 E68A      LDI	R24,0x6A
     4F6 E091      LDI	R25,1
     4F7 01F5      MOVW	R30,R10
     4F8 9021      LD	R2,Z+
     4F9 015F      MOVW	R10,R30
     4FA 2DE2      MOV	R30,R2
     4FB 27FF      CLR	R31
     4FC 0FE8      ADD	R30,R24
     4FD 1FF9      ADC	R31,R25
     4FE 8020      LDD	R2,Z+0
     4FF 01FA      MOVW	R30,R20
     500 9221      ST	R2,Z+
     501 01AF      MOVW	R20,R30
(0160) 		M8880_State.SendCount++;
     502 9180 0207 LDS	R24,M8880_State
     504 5F8F      SUBI	R24,0xFF
     505 9380 0207 STS	M8880_State,R24
     507 01F5      MOVW	R30,R10
     508 8020      LDD	R2,Z+0
     509 2022      TST	R2
     50A F751      BNE	0x04F5
(0161) 	}
(0162) 	M8880_WriteChar(*M8880_State.CurSend);
     50B 91E0 0208 LDS	R30,M8880_State+1
     50D 91F0 0209 LDS	R31,M8880_State+2
     50F 8100      LDD	R16,Z+0
     510 DE7F      RCALL	_M8880_WriteChar
     511 C267      RJMP	pop_xgset300C
(0163) }
(0164) void M8880_Recv(char* buf,char count)
(0165) {
(0166)  	if (count==0) return;
_M8880_Recv:
  count                --> R18
  buf                  --> R16
     512 2322      TST	R18
     513 F409      BNE	0x0515
     514 C037      RJMP	0x054C
(0167) 	M8880_State.RecvIntCount=count;
     515 9320 020A STS	M8880_State+3,R18
(0168) 	while(M8880_State.RecvStartPtr==M8880_State.RecvEndPtr);
     517 9020 020D LDS	R2,0x020D
     519 9030 020E LDS	R3,0x020E
     51B 9040 020B LDS	R4,0x020B
     51D 9050 020C LDS	R5,0x020C
     51F 1442      CP	R4,R2
     520 0453      CPC	R5,R3
     521 F3A9      BEQ	0x0517
     522 C01B      RJMP	0x053E
(0169) 	while(M8880_State.RecvStartPtr!=M8880_State.RecvEndPtr){
(0170) 	 	*buf++=*M8880_State.RecvStartPtr++;
     523 91E0 020B LDS	R30,0x020B
     525 91F0 020C LDS	R31,0x020C
     527 01D8      MOVW	R26,R16
     528 9001      LD	R0,Z+
     529 93F0 020C STS	0x020C,R31
     52B 93E0 020B STS	0x020B,R30
     52D 920D      ST	R0,X+
     52E 018D      MOVW	R16,R26
(0171) 		if (M8880_State.RecvStartPtr==recvbuf+M8880_RECV_BUFSIZE)
     52F E484      LDI	R24,0x44
     530 E092      LDI	R25,2
     531 9020 020B LDS	R2,0x020B
     533 9030 020C LDS	R3,0x020C
     535 1628      CP	R2,R24
     536 0639      CPC	R3,R25
     537 F431      BNE	0x053E
(0172) 		   M8880_State.RecvStartPtr=recvbuf;
     538 E182      LDI	R24,0x12
     539 E092      LDI	R25,2
     53A 9390 020C STS	0x020C,R25
     53C 9380 020B STS	0x020B,R24
     53E 9020 020D LDS	R2,0x020D
     540 9030 020E LDS	R3,0x020E
     542 9040 020B LDS	R4,0x020B
     544 9050 020C LDS	R5,0x020C
     546 1442      CP	R4,R2
     547 0453      CPC	R5,R3
     548 F6D1      BNE	0x0523
(0173) 	}
(0174) 	 *buf=0;
     549 2422      CLR	R2
     54A 01F8      MOVW	R30,R16
     54B 8220      STD	Z+0,R2
     54C 9508      RET
_M8880_CPDial:
  c                    --> R20
  x                    --> R12
  buf                  --> R10
     54D D248      RCALL	push_xgset303C
     54E 0158      MOVW	R10,R16
(0175) }
(0176) void M8880_CPDial(char *buf)
(0177) {
(0178) 	 int x;
(0179) #if M8880_INT==1
(0180) 	 GICR&=~(1<<INT1);
(0181) #else
(0182) 	 GICR&=~(1<<INT0);
     54F B78B      IN	R24,0x3B
     550 7B8F      ANDI	R24,0xBF
     551 BF8B      OUT	0x3B,R24
(0183) #endif
(0184)  	 M8880_WriteCtrl(M8880_BIT0|M8880_BIT1|M8880_BIT2|M8880_BIT3,-1);
     552 EF2F      LDI	R18,0xFF
     553 E00F      LDI	R16,0xF
     554 DE5F      RCALL	_M8880_WriteCtrl
     555 C012      RJMP	0x0568
(0185) 	 while(*buf!=0){
(0186) 	  char c;
(0187) 	  c=*buf++;
     556 01F5      MOVW	R30,R10
     557 9141      LD	R20,Z+
     558 015F      MOVW	R10,R30
(0188) 	  c-=('0');
     559 5340      SUBI	R20,0x30
(0189) 	  M8880_WriteChar(number[c]);
     55A E98A      LDI	R24,0x9A
     55B E091      LDI	R25,1
     55C 2FE4      MOV	R30,R20
     55D 27FF      CLR	R31
     55E 0FE8      ADD	R30,R24
     55F 1FF9      ADC	R31,R25
     560 8100      LDD	R16,Z+0
     561 DE2E      RCALL	_M8880_WriteChar
(0190) 	  while(((x=M8880_ReadState())&M8880_BIT0)==0x0);
     562 DE80      RCALL	_M8880_ReadState
     563 2E20      MOV	R2,R16
     564 2433      CLR	R3
     565 0161      MOVW	R12,R2
     566 FF00      SBRS	R16,0
     567 CFFA      RJMP	0x0562
     568 01F5      MOVW	R30,R10
     569 8020      LDD	R2,Z+0
     56A 2022      TST	R2
     56B F751      BNE	0x0556
(0191) 	 };
(0192) 	 M8880_WriteCtrl(M8880_BIT0|M8880_BIT2,-1);
     56C EF2F      LDI	R18,0xFF
     56D E005      LDI	R16,5
     56E DE45      RCALL	_M8880_WriteCtrl
(0193) 	 M8880_ReadState();
     56F DE73      RCALL	_M8880_ReadState
(0194) #if M8880_INT==1
(0195) 	 GIFR|=(1<<INT1);
(0196) 	 GICR|=(1<<INT1);
(0197) #else
(0198) 	 GIFR|=(1<<INT0);
     570 B78A      IN	R24,0x3A
     571 6480      ORI	R24,0x40
     572 BF8A      OUT	0x3A,R24
(0199) 	 GICR|=(1<<INT0);
     573 B78B      IN	R24,0x3B
     574 6480      ORI	R24,0x40
     575 BF8B      OUT	0x3B,R24
     576 C226      RJMP	pop_xgset303C
_int1_isr:
     577 920A      ST	R0,-Y
     578 921A      ST	R1,-Y
     579 922A      ST	R2,-Y
     57A 923A      ST	R3,-Y
     57B 924A      ST	R4,-Y
     57C 925A      ST	R5,-Y
     57D 926A      ST	R6,-Y
     57E 927A      ST	R7,-Y
     57F 928A      ST	R8,-Y
     580 929A      ST	R9,-Y
     581 930A      ST	R16,-Y
     582 931A      ST	R17,-Y
     583 932A      ST	R18,-Y
     584 933A      ST	R19,-Y
     585 938A      ST	R24,-Y
     586 939A      ST	R25,-Y
     587 93AA      ST	R26,-Y
     588 93BA      ST	R27,-Y
     589 93EA      ST	R30,-Y
     58A 93FA      ST	R31,-Y
     58B B60F      IN	R0,0x3F
     58C 920A      ST	R0,-Y
(0200) #endif
(0201) }
(0202) #pragma interrupt_handler int1_isr:iv_INT1
(0203) void int1_isr(void)
(0204) {
(0205)  	 if ((sysoption.calling==0) && sysoption.autoanswer){
     58D 9020 0203 LDS	R2,sysoption+1
     58F 2022      TST	R2
     590 F491      BNE	0x05A3
     591 9020 0206 LDS	R2,0x0206
     593 2022      TST	R2
     594 F071      BEQ	0x05A3
(0206) 	 	M8880_Handup;
     595 9AAD      SBI	0x15,5
(0207) 		sysoption.calling=2;
     596 E082      LDI	R24,2
     597 9380 0203 STS	sysoption+1,R24
(0208) 		serial_send(answering);
     599 9100 0196 LDS	R16,answering
     59B 9110 0197 LDS	R17,answering+1
     59D D0B7      RCALL	_serial_send
(0209) 		MCUCR|=0xc;
     59E B785      IN	R24,0x35
     59F 608C      ORI	R24,0xC
     5A0 BF85      OUT	0x35,R24
(0210) 		TCCR1B=0x05;
     5A1 E085      LDI	R24,5
     5A2 BD8E      OUT	0x2E,R24
(0211) 	 }
(0212) 	 if (sysoption.calling==3){
     5A3 9180 0203 LDS	R24,sysoption+1
     5A5 3083      CPI	R24,3
     5A6 F491      BNE	0x05B9
(0213) 		M8880_Handdown;
     5A7 98AD      CBI	0x15,5
(0214) 	 	sysoption.calling=0;
     5A8 2422      CLR	R2
     5A9 9220 0203 STS	sysoption+1,R2
(0215) 	 	MCUCR&=~0xc;
     5AB B785      IN	R24,0x35
     5AC 7F83      ANDI	R24,0xF3
     5AD BF85      OUT	0x35,R24
(0216) 		MCUCR|=0x8;
     5AE B785      IN	R24,0x35
     5AF 6088      ORI	R24,0x8
     5B0 BF85      OUT	0x35,R24
(0217) 		serial_send("aa");
     5B1 EA04      LDI	R16,0xA4
     5B2 E011      LDI	R17,1
     5B3 D0A1      RCALL	_serial_send
(0218) 		serial_send(handdown);
     5B4 9100 018C LDS	R16,handdown
     5B6 9110 018D LDS	R17,handdown+1
     5B8 D09C      RCALL	_serial_send
(0219) 	 }
     5B9 9009      LD	R0,Y+
     5BA BE0F      OUT	0x3F,R0
     5BB 91F9      LD	R31,Y+
     5BC 91E9      LD	R30,Y+
     5BD 91B9      LD	R27,Y+
     5BE 91A9      LD	R26,Y+
     5BF 9199      LD	R25,Y+
     5C0 9189      LD	R24,Y+
     5C1 9139      LD	R19,Y+
     5C2 9129      LD	R18,Y+
     5C3 9119      LD	R17,Y+
     5C4 9109      LD	R16,Y+
     5C5 9099      LD	R9,Y+
     5C6 9089      LD	R8,Y+
     5C7 9079      LD	R7,Y+
     5C8 9069      LD	R6,Y+
     5C9 9059      LD	R5,Y+
     5CA 9049      LD	R4,Y+
     5CB 9039      LD	R3,Y+
     5CC 9029      LD	R2,Y+
     5CD 9019      LD	R1,Y+
     5CE 9009      LD	R0,Y+
     5CF 9518      RETI
FILE: E:\Shuaihu\AVR\8880\serial.c
(0001) //ICC-AVR application builder : 2007-10-18 21:13:05
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) #include <string.h>
(0008) #include "serial.h"
(0009) #include "main.h"
(0010) //UART0 initialize
(0011) // desired baud rate: 110
(0012) // actual: invalid baud rate
(0013) SERIAL_PORT_STATUS com_status;
(0014) char recv_buf[RECV_BUFLEN];
(0015) char send_buf[SEND_BUFLEN];
(0016) void uart0_init(void)
(0017) {
(0018)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
     5D0 2422      CLR	R2
     5D1 B82A      OUT	0x0A,R2
(0019)  UCSRA = 0x00;
     5D2 B82B      OUT	0x0B,R2
(0020)  UCSRC = BIT(URSEL) | 0x06;
     5D3 E886      LDI	R24,0x86
     5D4 BD80      OUT	0x20,R24
(0021)  UBRRL = 0x03; //set baud rate lo
     5D5 E083      LDI	R24,3
     5D6 B989      OUT	0x09,R24
(0022)  UBRRH = 0x00; //set baud rate hi
     5D7 BC20      OUT	0x20,R2
(0023)  UCSRB = 0x98;
     5D8 E988      LDI	R24,0x98
     5D9 B98A      OUT	0x0A,R24
(0024)  com_status.read_start_ptr=recv_buf;
     5DA EA88      LDI	R24,0xA8
     5DB E092      LDI	R25,2
     5DC 9390 02DB STS	com_status+1,R25
     5DE 9380 02DA STS	com_status,R24
(0025)  com_status.read_end_ptr=recv_buf;
     5E0 9390 02DD STS	com_status+3,R25
     5E2 9380 02DC STS	com_status+2,R24
(0026)  com_status.recv_cur_ptr=recv_buf;
     5E4 9390 02DF STS	0x02DF,R25
     5E6 9380 02DE STS	0x02DE,R24
(0027)  com_status.send_cur_ptr=send_buf;
     5E8 E786      LDI	R24,0x76
     5E9 E092      LDI	R25,2
     5EA 9390 02E1 STS	0x02E1,R25
     5EC 9380 02E0 STS	0x02E0,R24
(0028)  com_status.sending=0;
     5EE 9220 02E2 STS	0x02E2,R2
     5F0 9508      RET
_uart0_rx_isr:
  c                    --> R16
     5F1 922A      ST	R2,-Y
     5F2 923A      ST	R3,-Y
     5F3 930A      ST	R16,-Y
     5F4 938A      ST	R24,-Y
     5F5 939A      ST	R25,-Y
     5F6 93EA      ST	R30,-Y
     5F7 93FA      ST	R31,-Y
     5F8 B62F      IN	R2,0x3F
     5F9 922A      ST	R2,-Y
(0029) }
(0030) 
(0031) #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
(0032) void uart0_rx_isr(void)
(0033) {	 
(0034) 	 char c;
(0035) 	 c=UDR;
     5FA B10C      IN	R16,0x0C
(0036) 	 if (sysoption.echo){
     5FB 9020 0202 LDS	R2,sysoption
     5FD 2022      TST	R2
     5FE F031      BEQ	0x0605
(0037) 	 	if (c=='\r')
     5FF 300D      CPI	R16,0xD
     600 F419      BNE	0x0604
(0038) 		    UDR='\n'; 
     601 E08A      LDI	R24,0xA
     602 B98C      OUT	0x0C,R24
     603 C001      RJMP	0x0605
(0039) 	 	else
(0040) 			UDR=c;
     604 B90C      OUT	0x0C,R16
(0041) 	 }
(0042) 	 if (c==0) return;
     605 2300      TST	R16
     606 F409      BNE	0x0608
     607 C01E      RJMP	0x0626
(0043)  	 *com_status.recv_cur_ptr++=c;
     608 91E0 02DE LDS	R30,0x02DE
     60A 91F0 02DF LDS	R31,0x02DF
     60C 9301      ST	R16,Z+
     60D 93F0 02DF STS	0x02DF,R31
     60F 93E0 02DE STS	0x02DE,R30
(0044) 	 if (com_status.recv_cur_ptr==recv_buf+RECV_BUFLEN)
     611 ED8A      LDI	R24,0xDA
     612 E092      LDI	R25,2
     613 17E8      CP	R30,R24
     614 07F9      CPC	R31,R25
     615 F431      BNE	0x061C
(0045) 	 	com_status.recv_cur_ptr=recv_buf;
     616 EA88      LDI	R24,0xA8
     617 E092      LDI	R25,2
     618 9390 02DF STS	0x02DF,R25
     61A 9380 02DE STS	0x02DE,R24
(0046) 	 if (c==LINE_END_CHAR) {
     61C 300D      CPI	R16,0xD
     61D F441      BNE	0x0626
(0047) 	 	com_status.read_end_ptr=com_status.recv_cur_ptr;
     61E 9020 02DE LDS	R2,0x02DE
     620 9030 02DF LDS	R3,0x02DF
     622 9230 02DD STS	com_status+3,R3
     624 9220 02DC STS	com_status+2,R2
(0048) 	 }
     626 9029      LD	R2,Y+
     627 BE2F      OUT	0x3F,R2
     628 91F9      LD	R31,Y+
     629 91E9      LD	R30,Y+
     62A 9199      LD	R25,Y+

⌨️ 快捷键说明

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