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

📄 8880.lst

📁 使用8880实现DTMF通信及拨号的程序.
💻 LST
📖 第 1 页 / 共 5 页
字号:
     393 B382      IN	R24,0x12
     394 748F      ANDI	R24,0x4F
     395 BB82      OUT	0x12,R24
(0021) 	 M8880_DataPort|=(c&0xf);		   					//Write Data
     396 2F80      MOV	R24,R16
     397 708F      ANDI	R24,0xF
     398 B225      IN	R2,0x15
     399 2A28      OR	R2,R24
     39A BA25      OUT	0x15,R2
(0022) 	 M8880_CtrlPort&=~M8880_CLK;			   			//CLR CLK
     39B 9896      CBI	0x12,6
(0023) 	 NOP();												//wait a few time
     39C 0000      NOP
(0024) 	 NOP();
     39D 0000      NOP
(0025) 	 M8880_CtrlPort|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS;  //set CS RW CLK RS 
     39E B382      IN	R24,0x12
     39F 6F80      ORI	R24,0xF0
     3A0 BB82      OUT	0x12,R24
     3A1 9508      RET
(0026) }
(0027) char M8880_ReadChar()
(0028) {
(0029)  	 char c;
(0030) 	 M8880_DataDDR&=0xf0;								//set direction to input
_M8880_ReadChar:
  c                    --> R16
     3A2 B384      IN	R24,0x14
     3A3 7F80      ANDI	R24,0xF0
     3A4 BB84      OUT	0x14,R24
(0031) 	 M8880_CtrlPort&=~(M8880_CS|M8880_RS);				//CLR CS RS hold RW CLK
     3A5 B382      IN	R24,0x12
     3A6 758F      ANDI	R24,0x5F
     3A7 BB82      OUT	0x12,R24
(0032) 	 M8880_CtrlPort&=~M8880_CLK;						//CLR CLK
     3A8 9896      CBI	0x12,6
(0033) 	 NOP();												//waite a few time
     3A9 0000      NOP
(0034) 	 NOP();
     3AA 0000      NOP
(0035) 	 c=M8880_DataPIN&0xf;								//ReadData
     3AB B303      IN	R16,0x13
     3AC 700F      ANDI	R16,0xF
(0036) 	 M8880_CtrlPort|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS;  //set CS RW CLK RS
     3AD B382      IN	R24,0x12
     3AE 6F80      ORI	R24,0xF0
     3AF BB82      OUT	0x12,R24
(0037) 	 M8880_DataDDR|=0X0F;								//restore direction
     3B0 B384      IN	R24,0x14
     3B1 608F      ORI	R24,0xF
     3B2 BB84      OUT	0x14,R24
(0038) 	 return c;
     3B3 9508      RET
(0039) }
(0040) void M8880_WriteCtrl(char c,char flag)
(0041) {
(0042)  	 M8880_DataPort&=0xf0; 		 						//clear low 4bit
_M8880_WriteCtrl:
  flag                 --> R18
  c                    --> R16
     3B4 B385      IN	R24,0x15
     3B5 7F80      ANDI	R24,0xF0
     3B6 BB85      OUT	0x15,R24
(0043)  	 M8880_CtrlPort&=~(M8880_CS|M8880_RW);  			//CLR CS  RW  HOLD RS CLK
     3B7 B382      IN	R24,0x12
     3B8 7C8F      ANDI	R24,0xCF
     3B9 BB82      OUT	0x12,R24
(0044) 	 if (flag)											//if we need to write CRB
     3BA 2322      TST	R18
     3BB F039      BEQ	0x03C3
(0045) 	 	 M8880_DataPort|=((c&0xf)|M8880_BIT3);		   	//so we need to set bit3
     3BC 2F80      MOV	R24,R16
     3BD 708F      ANDI	R24,0xF
     3BE 6088      ORI	R24,0x8
     3BF B225      IN	R2,0x15
     3C0 2A28      OR	R2,R24
     3C1 BA25      OUT	0x15,R2
     3C2 C005      RJMP	0x03C8
(0046) 	 else												//else
(0047) 	 	 M8880_DataPort|=(c&(0xf&(~M8880_BIT3)));		//we need to clear bit3
     3C3 2F80      MOV	R24,R16
     3C4 7087      ANDI	R24,7
     3C5 B225      IN	R2,0x15
     3C6 2A28      OR	R2,R24
     3C7 BA25      OUT	0x15,R2
(0048) 	 M8880_CtrlPort&=~M8880_CLK;			   			//CLR CLK
     3C8 9896      CBI	0x12,6
(0049) 	 NOP();												//wait a few time
     3C9 0000      NOP
(0050) 	 NOP();
     3CA 0000      NOP
(0051) 	 M8880_CtrlPort|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS;		//set CS RW CLK RS
     3CB B382      IN	R24,0x12
     3CC 6F80      ORI	R24,0xF0
     3CD BB82      OUT	0x12,R24
(0052) 	 if (flag){ 										//if we need to write CRB ...
     3CE 2322      TST	R18
     3CF F091      BEQ	0x03E2
(0053) 	 	M8880_DataPort&=0xf0;
     3D0 B385      IN	R24,0x15
     3D1 7F80      ANDI	R24,0xF0
     3D2 BB85      OUT	0x15,R24
(0054) 	 	M8880_CtrlPort&=~(M8880_CS|M8880_RW);
     3D3 B382      IN	R24,0x12
     3D4 7C8F      ANDI	R24,0xCF
     3D5 BB82      OUT	0x12,R24
(0055) 	 	M8880_DataPort|=(c>>4);
     3D6 2F80      MOV	R24,R16
     3D7 9582      SWAP	R24
     3D8 708F      ANDI	R24,0xF
     3D9 B225      IN	R2,0x15
     3DA 2A28      OR	R2,R24
     3DB BA25      OUT	0x15,R2
(0056) 	 	M8880_CtrlPort&=~M8880_CLK;
     3DC 9896      CBI	0x12,6
(0057) 	 	NOP();
     3DD 0000      NOP
(0058) 	 	NOP();
     3DE 0000      NOP
(0059) 	 	M8880_CtrlPort|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS;  //set CS RW CLK
     3DF B382      IN	R24,0x12
     3E0 6F80      ORI	R24,0xF0
     3E1 BB82      OUT	0x12,R24
(0060) 	 }
     3E2 9508      RET
(0061) }
(0062) char M8880_ReadState(void)
(0063) {
(0064)   	 char c;
(0065) 	 M8880_DataDDR&=0xf0;
_M8880_ReadState:
  c                    --> R16
     3E3 B384      IN	R24,0x14
     3E4 7F80      ANDI	R24,0xF0
     3E5 BB84      OUT	0x14,R24
(0066) 	 M8880_CtrlPort&=~(M8880_CS);
     3E6 9895      CBI	0x12,5
(0067) 	 M8880_CtrlPort&=~M8880_CLK;
     3E7 9896      CBI	0x12,6
(0068) 	 NOP();
     3E8 0000      NOP
(0069) 	 NOP();
     3E9 0000      NOP
(0070) 	 c=M8880_DataPIN&0xf;
     3EA B303      IN	R16,0x13
     3EB 700F      ANDI	R16,0xF
(0071) 	 M8880_CtrlPort|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS;  //set CS RW CLK
     3EC B382      IN	R24,0x12
     3ED 6F80      ORI	R24,0xF0
     3EE BB82      OUT	0x12,R24
(0072) 	 M8880_DataDDR|=0X0F;
     3EF B384      IN	R24,0x14
     3F0 608F      ORI	R24,0xF
     3F1 BB84      OUT	0x14,R24
(0073) 	 return c;	 
     3F2 9508      RET
(0074) }
(0075) void M8880_Init(void)
(0076) {
(0077) 	 M8880_State.SendCount=0;
_M8880_Init:
     3F3 2422      CLR	R2
     3F4 9220 0207 STS	M8880_State,R2
(0078) 	 M8880_State.CurSend=sendbuf;
     3F6 E484      LDI	R24,0x44
     3F7 E092      LDI	R25,2
     3F8 9390 0209 STS	M8880_State+2,R25
     3FA 9380 0208 STS	M8880_State+1,R24
(0079) 	 M8880_State.Sending=0;
     3FC 9220 0211 STS	0x0211,R2
(0080) 	 M8880_State.RecvIntCount=0;
     3FE 9220 020A STS	M8880_State+3,R2
(0081) 	 M8880_State.RecvStartPtr=recvbuf;
     400 E182      LDI	R24,0x12
     401 E092      LDI	R25,2
     402 9390 020C STS	0x020C,R25
     404 9380 020B STS	0x020B,R24
(0082) 	 M8880_State.RecvEndPtr=recvbuf;
     406 9390 020E STS	0x020E,R25
     408 9380 020D STS	0x020D,R24
(0083) 	 M8880_State.CurRecv=recvbuf;
     40A 9390 0210 STS	0x0210,R25
     40C 9380 020F STS	0x020F,R24
(0084)  	 M8880_DataDDR|=0xf;
     40E B384      IN	R24,0x14
     40F 608F      ORI	R24,0xF
     410 BB84      OUT	0x14,R24
(0085) 	 M8880_DataPort&=~0xf;
     411 B385      IN	R24,0x15
     412 7F80      ANDI	R24,0xF0
     413 BB85      OUT	0x15,R24
(0086) 	 M8880_CtrlPort|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS;
     414 B382      IN	R24,0x12
     415 6F80      ORI	R24,0xF0
     416 BB82      OUT	0x12,R24
(0087) 	 M8880_CtrlDDR|=M8880_CS|M8880_RW|M8880_CLK|M8880_RS;
     417 B381      IN	R24,0x11
     418 6F80      ORI	R24,0xF0
     419 BB81      OUT	0x11,R24
(0088) 	 M8880_ReadState();
     41A DFC8      RCALL	_M8880_ReadState
(0089) 	 M8880_WriteCtrl(0x00,0);
     41B 2722      CLR	R18
     41C 2700      CLR	R16
     41D DF96      RCALL	_M8880_WriteCtrl
(0090) 	 M8880_WriteCtrl(0x00,0);
     41E 2722      CLR	R18
     41F 2700      CLR	R16
     420 DF93      RCALL	_M8880_WriteCtrl
(0091) 	 M8880_WriteCtrl((M8880_BIT0|M8880_BIT2),-1);
     421 EF2F      LDI	R18,0xFF
     422 E005      LDI	R16,5
     423 DF90      RCALL	_M8880_WriteCtrl
(0092) 	 M8880_ReadState();
     424 DFBE      RCALL	_M8880_ReadState
(0093) #if M8880_INT==1
(0094) 	 PORTD|=0x8;
(0095) 	 DDRD&=~0x8;
(0096) 	 MCUCR&=~((1<<ISC11)|(1<<ISC10));
(0097) 	 MCUCR|=(1<<ISC11);
(0098) 	 GICR|=(1<<INT1);
(0099) 	 GIFR|=(1<<INT1);
(0100) #else
(0101) 	 PORTD|=0x4;
     425 9A92      SBI	0x12,2
(0102) 	 DDRD&=~0x4;
     426 988A      CBI	0x11,2
(0103) 	 MCUCR&=~((1<<ISC01)|(1<<ISC00));
     427 B785      IN	R24,0x35
     428 7F8C      ANDI	R24,0xFC
     429 BF85      OUT	0x35,R24
(0104) 	 MCUCR|=(1<<ISC01);
     42A B785      IN	R24,0x35
     42B 6082      ORI	R24,2
     42C BF85      OUT	0x35,R24
(0105) 	 GICR|=(1<<INT0);
     42D B78B      IN	R24,0x3B
     42E 6480      ORI	R24,0x40
     42F BF8B      OUT	0x3B,R24
(0106) 	 GIFR|=(1<<INT0);
     430 B78A      IN	R24,0x3A
     431 6480      ORI	R24,0x40
     432 BF8A      OUT	0x3A,R24
     433 9508      RET
_int0_isr:
  c                    --> R10
     434 920A      ST	R0,-Y
     435 921A      ST	R1,-Y
     436 922A      ST	R2,-Y
     437 923A      ST	R3,-Y
     438 924A      ST	R4,-Y
     439 925A      ST	R5,-Y
     43A 926A      ST	R6,-Y
     43B 927A      ST	R7,-Y
     43C 928A      ST	R8,-Y
     43D 929A      ST	R9,-Y
     43E 930A      ST	R16,-Y
     43F 931A      ST	R17,-Y
     440 932A      ST	R18,-Y
     441 933A      ST	R19,-Y
     442 938A      ST	R24,-Y
     443 939A      ST	R25,-Y
     444 93AA      ST	R26,-Y
     445 93BA      ST	R27,-Y
     446 93EA      ST	R30,-Y
     447 93FA      ST	R31,-Y
     448 B60F      IN	R0,0x3F
     449 920A      ST	R0,-Y
     44A 92AA      ST	R10,-Y
(0107) #endif 
(0108) }
(0109) char *dec="01234567890*#abcd";
(0110) #pragma interrupt_handler int0_isr:iv_INT0
(0111) void int0_isr(void)
(0112) {
(0113)   char c;
(0114)   c=M8880_ReadState();
     44B DF97      RCALL	_M8880_ReadState
     44C 2EA0      MOV	R10,R16
(0115)   if (c&M8880_BIT1){
     44D FF01      SBRS	R16,1
     44E C020      RJMP	0x046F
(0116)    	 M8880_State.SendCount--;
     44F 9180 0207 LDS	R24,M8880_State
     451 5081      SUBI	R24,1
     452 9380 0207 STS	M8880_State,R24
(0117)      if (M8880_State.SendCount>0){
     454 E080      LDI	R24,0
     455 9020 0207 LDS	R2,M8880_State
     457 1582      CP	R24,R2
     458 F468      BCC	0x0466
(0118) 		 M8880_State.CurSend++;
     459 9180 0208 LDS	R24,M8880_State+1
     45B 9190 0209 LDS	R25,M8880_State+2
     45D 9601      ADIW	R24,1
     45E 9390 0209 STS	M8880_State+2,R25
     460 9380 0208 STS	M8880_State+1,R24
(0119) 	 	 M8880_WriteChar(*M8880_State.CurSend);
     462 01FC      MOVW	R30,R24
     463 8100      LDD	R16,Z+0
     464 DF2B      RCALL	_M8880_WriteChar
(0120) 	 }else{
     465 C009      RJMP	0x046F
(0121) 	 	M8880_State.CurSend=sendbuf;
     466 E484      LDI	R24,0x44
     467 E092      LDI	R25,2
     468 9390 0209 STS	M8880_State+2,R25
     46A 9380 0208 STS	M8880_State+1,R24
(0122) 		M8880_State.Sending=0;
     46C 2422      CLR	R2
     46D 9220 0211 STS	0x0211,R2
(0123) 	 }
(0124)   }
(0125)   if ((c&M8880_BIT2)&&((c&M8880_BIT3)==0)){
     46F FEA2      SBRS	R10,2
     470 C035      RJMP	0x04A6
     471 FCA3      SBRC	R10,3
     472 C033      RJMP	0x04A6
(0126)   	 if (M8880_State.RecvIntCount>0){
     473 E080      LDI	R24,0
     474 9020 020A LDS	R2,M8880_State+3
     476 1582      CP	R24,R2
     477 F570      BCC	0x04A6
(0127) 	 	 M8880_State.RecvIntCount--;
     478 2D82      MOV	R24,R2
     479 5081      SUBI	R24,1
     47A 9380 020A STS	M8880_State+3,R24
(0128) 	   	 *M8880_State.CurRecv++=dec[M8880_ReadChar()];
     47C DF25      RCALL	_M8880_ReadChar
     47D 9020 0198 LDS	R2,dec
     47F 9030 0199 LDS	R3,dec+1
     481 2FE0      MOV	R30,R16
     482 27FF      CLR	R31
     483 0DE2      ADD	R30,R2
     484 1DF3      ADC	R31,R3
     485 8020      LDD	R2,Z+0
     486 91E0 020F LDS	R30,0x020F
     488 91F0 0210 LDS	R31,0x0210
     48A 9221      ST	R2,Z+
     48B 93F0 0210 STS	0x0210,R31
     48D 93E0 020F STS	0x020F,R30
(0129) 		 if (M8880_State.CurRecv==recvbuf+M8880_RECV_BUFSIZE)
     48F E484      LDI	R24,0x44
     490 E092      LDI	R25,2
     491 17E8      CP	R30,R24
     492 07F9      CPC	R31,R25
     493 F431      BNE	0x049A
(0130) 		 	M8880_State.CurRecv=recvbuf;
     494 E182      LDI	R24,0x12
     495 E092      LDI	R25,2
     496 9390 0210 STS	0x0210,R25
     498 9380 020F STS	0x020F,R24
(0131) 		 if (M8880_State.RecvIntCount==0)
     49A 9020 020A LDS	R2,M8880_State+3
     49C 2022      TST	R2
     49D F441      BNE	0x04A6
(0132) 		    M8880_State.RecvEndPtr=M8880_State.CurRecv;
     49E 9020 020F LDS	R2,0x020F
     4A0 9030 0210 LDS	R3,0x0210
     4A2 9230 020E STS	0x020E,R3
     4A4 9220 020D STS	0x020D,R2
(0133) 	 }
(0134)   }
     4A6 90A9      LD	R10,Y+
     4A7 9009      LD	R0,Y+
     4A8 BE0F      OUT	0x3F,R0
     4A9 91F9      LD	R31,Y+
     4AA 91E9      LD	R30,Y+
     4AB 91B9      LD	R27,Y+
     4AC 91A9      LD	R26,Y+
     4AD 9199      LD	R25,Y+
     4AE 9189      LD	R24,Y+
     4AF 9139      LD	R19,Y+
     4B0 9129      LD	R18,Y+
     4B1 9119      LD	R17,Y+
     4B2 9109      LD	R16,Y+
     4B3 9099      LD	R9,Y+
     4B4 9089      LD	R8,Y+
     4B5 9079      LD	R7,Y+
     4B6 9069      LD	R6,Y+
     4B7 9059      LD	R5,Y+
     4B8 9049      LD	R4,Y+
     4B9 9039      LD	R3,Y+
     4BA 9029      LD	R2,Y+
     4BB 9019      LD	R1,Y+
     4BC 9009      LD	R0,Y+
     4BD 9518      RETI
_M8880_Send:
  c                    --> R20
  count                --> R10
  x                    --> R12
     4BE D2D7      RCALL	push_xgset303C
     4BF 2EA2      MOV	R10,R18
     4C0 0168      MOVW	R12,R16
(0135) }
(0136) void M8880_Send(char *x,char count)
(0137) {
(0138)  	char *c;
(0139) 	if (count==0) return;
     4C1 20AA      TST	R10
     4C2 F409      BNE	0x04C4
     4C3 C01C      RJMP	0x04E0
(0140) 	while(M8880_State.Sending);
     4C4 9020 0211 LDS	R2,0x0211
     4C6 2022      TST	R2
     4C7 F7E1      BNE	0x04C4
(0141) 	M8880_State.SendCount=count;
     4C8 92A0 0207 STS	M8880_State,R10
(0142) 	M8880_State.Sending=-1;
     4CA EF8F      LDI	R24,0xFF
     4CB 9380 0211 STS	0x0211,R24
(0143) 	c=sendbuf;
     4CD E444      LDI	R20,0x44
     4CE E052      LDI	R21,2
(0144)  	for (;count>0;count--){
     4CF C007      RJMP	0x04D7
(0145) 		*c++=*x++;
     4D0 01F6      MOVW	R30,R12
     4D1 01DA      MOVW	R26,R20
     4D2 9001      LD	R0,Z+
     4D3 016F      MOVW	R12,R30
     4D4 920D      ST	R0,X+
     4D5 01AD      MOVW	R20,R26

⌨️ 快捷键说明

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