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

📄 change.lss

📁 基于AVR单片机的程近期电话交换机源程序,可实现一拖四(一外线,四内线).
💻 LSS
📖 第 1 页 / 共 4 页
字号:
 464:	80 91 68 00 	lds	r24, 0x0068
 468:	81 30       	cpi	r24, 0x01	; 1
 46a:	39 f4       	brne	.+14     	; 0x47a <__stack+0x1b>
    {
	 if((ringtime%15)==0)
 46c:	80 91 60 00 	lds	r24, 0x0060
 470:	90 91 61 00 	lds	r25, 0x0061
 474:	6f e0       	ldi	r22, 0x0F	; 15
 476:	70 e0       	ldi	r23, 0x00	; 0
 478:	0a c0       	rjmp	.+20     	; 0x48e <__stack+0x2f>
	     L1_i;
    }  
 else if(L_flash==2)	//LED flash slow
 47a:	80 91 68 00 	lds	r24, 0x0068
 47e:	82 30       	cpi	r24, 0x02	; 2
 480:	69 f4       	brne	.+26     	; 0x49c <__stack+0x3d>
     {
	  if((ringtime%50)==0)
 482:	80 91 60 00 	lds	r24, 0x0060
 486:	90 91 61 00 	lds	r25, 0x0061
 48a:	62 e3       	ldi	r22, 0x32	; 50
 48c:	70 e0       	ldi	r23, 0x00	; 0
 48e:	bf d1       	rcall	.+894    	; 0x80e <__udivmodhi4>
 490:	89 2b       	or	r24, r25
 492:	21 f4       	brne	.+8      	; 0x49c <__stack+0x3d>
	     L1_i;
 494:	88 b3       	in	r24, 0x18	; 24
 496:	90 e4       	ldi	r25, 0x40	; 64
 498:	89 27       	eor	r24, r25
 49a:	88 bb       	out	0x18, r24	; 24
	 }
 if(lms)
 49c:	80 91 69 00 	lds	r24, 0x0069
 4a0:	88 23       	and	r24, r24
 4a2:	51 f0       	breq	.+20     	; 0x4b8 <__stack+0x59>
   {
    lms--;
 4a4:	80 91 69 00 	lds	r24, 0x0069
 4a8:	81 50       	subi	r24, 0x01	; 1
 4aa:	80 93 69 00 	sts	0x0069, r24
	if(lms==0)
 4ae:	80 91 69 00 	lds	r24, 0x0069
 4b2:	88 23       	and	r24, r24
 4b4:	09 f4       	brne	.+2      	; 0x4b8 <__stack+0x59>
	   L1_c;		//time up turn off led
 4b6:	c6 98       	cbi	0x18, 6	; 24
 4b8:	bf 91       	pop	r27
 4ba:	af 91       	pop	r26
 4bc:	9f 91       	pop	r25
 4be:	8f 91       	pop	r24
 4c0:	7f 91       	pop	r23
 4c2:	6f 91       	pop	r22
 4c4:	5f 91       	pop	r21
 4c6:	2f 91       	pop	r18
 4c8:	0f 90       	pop	r0
 4ca:	0f be       	out	0x3f, r0	; 63
 4cc:	0f 90       	pop	r0
 4ce:	1f 90       	pop	r1
 4d0:	18 95       	reti

000004d2 <__vector_1>:
   }
} 

SIGNAL(SIG_INTERRUPT0)		//外线振铃
{
 4d2:	1f 92       	push	r1
 4d4:	0f 92       	push	r0
 4d6:	0f b6       	in	r0, 0x3f	; 63
 4d8:	0f 92       	push	r0
 4da:	11 24       	eor	r1, r1
 4dc:	8f 93       	push	r24
 4de:	9f 93       	push	r25
 if(ringcou<10)
 4e0:	80 91 67 00 	lds	r24, 0x0067
 4e4:	8a 30       	cpi	r24, 0x0A	; 10
 4e6:	28 f4       	brcc	.+10     	; 0x4f2 <__vector_1+0x20>
     ringcou++;
 4e8:	80 91 67 00 	lds	r24, 0x0067
 4ec:	8f 5f       	subi	r24, 0xFF	; 255
 4ee:	80 93 67 00 	sts	0x0067, r24
	 
 ringcoutime=500;			//设定为5S
 4f2:	84 ef       	ldi	r24, 0xF4	; 244
 4f4:	91 e0       	ldi	r25, 0x01	; 1
 4f6:	90 93 66 00 	sts	0x0066, r25
 4fa:	80 93 65 00 	sts	0x0065, r24
 4fe:	9f 91       	pop	r25
 500:	8f 91       	pop	r24
 502:	0f 90       	pop	r0
 504:	0f be       	out	0x3f, r0	; 63
 506:	0f 90       	pop	r0
 508:	1f 90       	pop	r1
 50a:	18 95       	reti

0000050c <__vector_2>:
}


SIGNAL(SIG_INTERRUPT1)		//DTMF decode sussess cause this interrup
{
 50c:	1f 92       	push	r1
 50e:	0f 92       	push	r0
 510:	0f b6       	in	r0, 0x3f	; 63
 512:	0f 92       	push	r0
 514:	11 24       	eor	r1, r1
 516:	8f 93       	push	r24
 518:	9f 93       	push	r25
 51a:	af 93       	push	r26
 51c:	bf 93       	push	r27
 51e:	ef 93       	push	r30
 520:	ff 93       	push	r31
  uchar i;
  lms=12;			//turn on led for 120mS
 522:	8c e0       	ldi	r24, 0x0C	; 12
 524:	80 93 69 00 	sts	0x0069, r24
  L1_s;
 528:	c6 9a       	sbi	0x18, 6	; 24
  for(i=9;i;i--)		//保存最近十次解码结果
 52a:	99 e0       	ldi	r25, 0x09	; 9
 52c:	a3 e7       	ldi	r26, 0x73	; 115
 52e:	b0 e0       	ldi	r27, 0x00	; 0
    {
	 decode[i]=decode[i-1];
 530:	fd 01       	movw	r30, r26
 532:	31 97       	sbiw	r30, 0x01	; 1
 534:	80 81       	ld	r24, Z
 536:	8c 93       	st	X, r24
 538:	91 50       	subi	r25, 0x01	; 1
 53a:	df 01       	movw	r26, r30
 53c:	c9 f7       	brne	.-14     	; 0x530 <__vector_2+0x24>
	}
  decode[0]=PIND>>4;	//读解码结果
 53e:	80 b3       	in	r24, 0x10	; 16
 540:	82 95       	swap	r24
 542:	8f 70       	andi	r24, 0x0F	; 15
 544:	80 93 6a 00 	sts	0x006A, r24
 548:	ff 91       	pop	r31
 54a:	ef 91       	pop	r30
 54c:	bf 91       	pop	r27
 54e:	af 91       	pop	r26
 550:	9f 91       	pop	r25
 552:	8f 91       	pop	r24
 554:	0f 90       	pop	r0
 556:	0f be       	out	0x3f, r0	; 63
 558:	0f 90       	pop	r0
 55a:	1f 90       	pop	r1
 55c:	18 95       	reti

0000055e <clr_decode>:
  
}	

void clr_decode(void)	//解码数组全部填0
{
 55e:	ea e6       	ldi	r30, 0x6A	; 106
 560:	f0 e0       	ldi	r31, 0x00	; 0
 562:	89 e0       	ldi	r24, 0x09	; 9
 uchar i;
 for(i=0;i<10;i++)
   decode[i]=0;
 564:	11 92       	st	Z+, r1
 566:	81 50       	subi	r24, 0x01	; 1
 568:	87 ff       	sbrs	r24, 7
 56a:	fc cf       	rjmp	.-8      	; 0x564 <clr_decode+0x6>
 56c:	08 95       	ret

0000056e <test_hu>:
}

//检测哪个分机拿起了听筒, 但不检测num 号机, 
uchar test_hu(uchar num)  //若num为0则检查所有分机, 无返回0, 有返回分机号1-4
{
 uchar i;
 for(i=0;i<4;i++)	//检测有没有分机拿起
 56e:	40 e0       	ldi	r20, 0x00	; 0
 570:	68 2f       	mov	r22, r24
 572:	77 27       	eor	r23, r23
 574:	e8 e7       	ldi	r30, 0x78	; 120
 576:	f0 e0       	ldi	r31, 0x00	; 0
 578:	20 e0       	ldi	r18, 0x00	; 0
 57a:	30 e0       	ldi	r19, 0x00	; 0
  {
    if(hu[i]&&((i+1)!=num))
 57c:	80 81       	ld	r24, Z
 57e:	88 23       	and	r24, r24
 580:	49 f0       	breq	.+18     	; 0x594 <test_hu+0x26>
 582:	c9 01       	movw	r24, r18
 584:	01 96       	adiw	r24, 0x01	; 1
 586:	86 17       	cp	r24, r22
 588:	97 07       	cpc	r25, r23
 58a:	21 f0       	breq	.+8      	; 0x594 <test_hu+0x26>
     {
	   return(i+1);
 58c:	4f 5f       	subi	r20, 0xFF	; 255
 58e:	84 2f       	mov	r24, r20
 590:	99 27       	eor	r25, r25
 592:	08 95       	ret
 594:	4f 5f       	subi	r20, 0xFF	; 255
 596:	2f 5f       	subi	r18, 0xFF	; 255
 598:	3f 4f       	sbci	r19, 0xFF	; 255
 59a:	31 96       	adiw	r30, 0x01	; 1
 59c:	44 30       	cpi	r20, 0x04	; 4
 59e:	70 f3       	brcs	.-36     	; 0x57c <test_hu+0xe>
     }			  
  }
 return 0;		//返回分机号
 5a0:	80 e0       	ldi	r24, 0x00	; 0
 5a2:	90 e0       	ldi	r25, 0x00	; 0
}
 5a4:	08 95       	ret

000005a6 <lock>:

void lock(uchar num)	//封锁除num外的分机, 分机号为0则不取消封锁
{
 if(num==0)		//取消封锁
 5a6:	88 23       	and	r24, r24
 5a8:	29 f4       	brne	.+10     	; 0x5b4 <lock+0xe>
    {
     PH1_s;
 5aa:	ad 9a       	sbi	0x15, 5	; 21
	 PH2_s;
 5ac:	c5 9a       	sbi	0x18, 5	; 24
	 PH3_s;
 5ae:	c3 9a       	sbi	0x18, 3	; 24
	 PH4_s;
 5b0:	c1 9a       	sbi	0x18, 1	; 24
 5b2:	08 95       	ret
	}
 else if(num==1)	//封锁2,3,4
 5b4:	81 30       	cpi	r24, 0x01	; 1
 5b6:	11 f4       	brne	.+4      	; 0x5bc <lock+0x16>
   {
    PH2_c;
 5b8:	c5 98       	cbi	0x18, 5	; 24
 5ba:	03 c0       	rjmp	.+6      	; 0x5c2 <lock+0x1c>
	PH3_c;
	PH4_c;
   }
 else if(num==2)	//封锁1,3,4
 5bc:	82 30       	cpi	r24, 0x02	; 2
 5be:	21 f4       	brne	.+8      	; 0x5c8 <lock+0x22>
   {
    PH1_c;
 5c0:	ad 98       	cbi	0x15, 5	; 21
	PH3_c;
 5c2:	c3 98       	cbi	0x18, 3	; 24
	PH4_c;
 5c4:	c1 98       	cbi	0x18, 1	; 24
 5c6:	08 95       	ret
   }
 else if(num==3)	//封锁1,2,4
 5c8:	83 30       	cpi	r24, 0x03	; 3
 5ca:	19 f4       	brne	.+6      	; 0x5d2 <lock+0x2c>
   {
    PH1_c;
 5cc:	ad 98       	cbi	0x15, 5	; 21
	PH2_c;
 5ce:	c5 98       	cbi	0x18, 5	; 24
 5d0:	f9 cf       	rjmp	.-14     	; 0x5c4 <lock+0x1e>
	PH4_c;
   } 
 else if(num==4)	//封锁1,2,3
 5d2:	84 30       	cpi	r24, 0x04	; 4
 5d4:	19 f4       	brne	.+6      	; 0x5dc <lock+0x36>
   {
    PH1_c;
 5d6:	ad 98       	cbi	0x15, 5	; 21
	PH2_c;
 5d8:	c5 98       	cbi	0x18, 5	; 24
	PH3_c;
 5da:	c3 98       	cbi	0x18, 3	; 24
 5dc:	08 95       	ret

000005de <main>:
   }
}

int main(void)
{
 5de:	cf e5       	ldi	r28, 0x5F	; 95
 5e0:	d4 e0       	ldi	r29, 0x04	; 4
 5e2:	de bf       	out	0x3e, r29	; 62
 5e4:	cd bf       	out	0x3d, r28	; 61
 uchar i;
 uchar num=0;		//num # 分机拿起
 uchar num1=0;
 uchar calln=0;		//被叫机号
 
 s_ini();
 5e6:	47 dd       	rcall	.-1394   	; 0x76 <s_ini>
 
 for(;;)
   {
    num=test_hu(0);	//检查哪个分机拿起
 5e8:	80 e0       	ldi	r24, 0x00	; 0
 5ea:	c1 df       	rcall	.-126    	; 0x56e <test_hu>
 5ec:	08 2f       	mov	r16, r24
	
	if(num)		//有分机拿起
 5ee:	88 23       	and	r24, r24
 5f0:	09 f4       	brne	.+2      	; 0x5f4 <main+0x16>
 5f2:	97 c0       	rjmp	.+302    	; 0x722 <main+0x144>
	    {
		  L_flash=3;
 5f4:	83 e0       	ldi	r24, 0x03	; 3
 5f6:	80 93 68 00 	sts	0x0068, r24
		  L2_s;
 5fa:	c7 9a       	sbi	0x18, 7	; 24
	      lock(num);		//封锁除num外的分机
 5fc:	80 2f       	mov	r24, r16
 5fe:	d3 df       	rcall	.-90     	; 0x5a6 <lock>
		 // UDR=num;
	
		  while(num==test_hu(0))		//直到放下听筒
 600:	85 c0       	rjmp	.+266    	; 0x70c <main+0x12e>
		    {
			 if((decode[1]==8)&&(decode[0]>0&&decode[0]<5
 602:	80 91 6b 00 	lds	r24, 0x006B
 606:	88 30       	cpi	r24, 0x08	; 8
 608:	d9 f5       	brne	.+118    	; 0x680 <main+0xa2>
 60a:	80 91 6a 00 	lds	r24, 0x006A
 60e:	88 23       	and	r24, r24
 610:	b9 f1       	breq	.+110    	; 0x680 <main+0xa2>
 612:	80 91 6a 00 	lds	r24, 0x006A
 616:	85 30       	cpi	r24, 0x05	; 5
 618:	98 f5       	brcc	.+102    	; 0x680 <main+0xa2>
 61a:	80 91 6a 00 	lds	r24, 0x006A
 61e:	80 17       	cp	r24, r16
 620:	79 f1       	breq	.+94     	; 0x680 <main+0xa2>
			                   &&decode[0]!=num))	//拨号条件, 不能打自己
			     {
				  calln=decode[0];		//保存被叫机号
 622:	10 91 6a 00 	lds	r17, 0x006A
				  *(ringflag+(calln-1))=1;			//响铃
 626:	c1 2f       	mov	r28, r17
 628:	dd 27       	eor	r29, r29
 62a:	fe 01       	movw	r30, r28
 62c:	ed 58       	subi	r30, 0x8D	; 141
 62e:	ff 4f       	sbci	r31, 0xFF	; 255
 630:	81 e0       	ldi	r24, 0x01	; 1
 632:	80 83       	st	Z, r24
				  L_flash=1;				//LED闪烁
 634:	80 93 68 00 	sts	0x0068, r24

⌨️ 快捷键说明

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