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

📄 m8m01.lst

📁 AVR MEGA8双机串行口通讯程序,单工485方式,用于单片机组网,有PROTEUS仿真电路,可以立刻验证
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    001A E5CF      LDI	R28,0x5F
    001B E0D4      LDI	R29,4
    001C BFCD      OUT	0x3D,R28
    001D BFDE      OUT	0x3E,R29
    001E 51C0      SUBI	R28,0x10
    001F 40D0      SBCI	R29,0
    0020 EA0A      LDI	R16,0xAA
    0021 8308      STD	Y+0,R16
    0022 2400      CLR	R0
    0023 E6EE      LDI	R30,0x6E
    0024 E0F0      LDI	R31,0
    0025 E010      LDI	R17,0
    0026 3AED      CPI	R30,0xAD
    0027 07F1      CPC	R31,R17
    0028 F011      BEQ	0x002B
    0029 9201      ST	R0,Z+
    002A CFFB      RJMP	0x0026
    002B 8300      STD	Z+0,R16
    002C E2E6      LDI	R30,0x26
    002D E0F0      LDI	R31,0
    002E E6A0      LDI	R26,0x60
    002F E0B0      LDI	R27,0
    0030 E010      LDI	R17,0
    0031 33E4      CPI	R30,0x34
    0032 07F1      CPC	R31,R17
    0033 F021      BEQ	0x0038
    0034 95C8      LPM
    0035 9631      ADIW	R30,1
    0036 920D      ST	R0,X+
    0037 CFF9      RJMP	0x0031
    0038 D11A      RCALL	_main
_exit:
    0039 CFFF      RJMP	_exit
FILE: E:\m8com\M8MP01.c
(0001) //////////主机
(0002) 
(0003) #include <iom8v.h>
(0004) #include <macros.h>
(0005) //ISARM pro
(0006) #define OUTLED1OFF PORTB|=0x01       //for 
(0007) #define OUTLED1ON PORTB&=~0x01
(0008) #define OUTLED2OFF PORTB|=0x02       //For 
(0009) #define OUTLED2ON PORTB&=~0x02
(0010) #define OUTLED2Pulse PORTB^=0x02
(0011) 
(0012) #define OUTLED3OFF PORTB|=0x04      //For 
(0013) #define OUTLED3ON PORTB&=~0x04
(0014) #define OUTLED3Pulse PORTB^=0x04
(0015) #define OUTLED4OFF PORTB|=0x08      //For 
(0016) #define OUTLED4ON PORTB&=~0x08
(0017) #define OUTLED4Pulse PORTB^=0x08
(0018) 
(0019) #define OUTDEON PORTD|=0x10
(0020) #define OUTDEOFF PORTD&=~0x10
(0021) 
(0022) #define KB0 (PINC&0x01)
(0023) #define KB1 (PINC&0x02)
(0024) 
(0025) 
(0026) ///UART///
(0027) #define TXENABLE UCSRB&=~(1<<RXEN);UCSRB|=(1<<TXEN); 
(0028) #define RXENABLE UCSRB&=~(1<<TXEN);UCSRB|=(1<<RXEN); 
(0029) #define TXADDRESS UCSRB|=1;TXADFG=0;
(0030) #define TXDATA UCSRB&=~1;TXADFG=1;
(0031) //
(0032) #define TRFG0 0xFE
(0033) #define TRFG1 0xFD
(0034) #define TRFG2 0xF1
(0035) #define TRFG3 0xF0
(0036) //最大子板数
(0037) #define SlaveBMAX 15
(0038) //////////////////////////////
(0039) unsigned char TXADFG=0;
(0040) 
(0041) unsigned char SlaveEN[17];
(0042) unsigned char SlaveCR=0;  //子板编号计数器,当作物理地址
(0043) unsigned char TXINTMAX=1;//下行发送中断次数控制值
(0044) //unsigned char TXINTCR=0;//下行发送中断次数计数器
(0045) unsigned char TXINTFG=0;//下行发送中断次数完成标志
(0046) unsigned char RXINTMAX=16;//下行发送中断次数控制值
(0047) unsigned char RXINTCR=0;//下行发送中断次数计数器
(0048) unsigned char RXINTFG=0;//下行发送中断次数完成标志
(0049) 
(0050) unsigned char TXBUF[16]; //发送缓冲区
(0051) unsigned char RXBUF[30];  //接收缓冲区
(0052) unsigned char TXbufP=0;  //发送缓冲区下标
(0053) unsigned char RXbufP=0;  //接收缓冲区下标
(0054) unsigned char RXbufPmax=11;//接收数据实际长度
(0055) 
(0056) unsigned char RXERROR=0;
(0057) /////Soft Timer
(0058) unsigned char WaitCR0=0;
(0059) unsigned char WaitCR1=0;
(0060) 
(0061) void SoftTimer(void)
(0062)   {
(0063)     WaitCR0++;
_SoftTimer:
    003A 9180006B  LDS	R24,0x6B
    003C 5F8F      SUBI	R24,0xFF
    003D 9380006B  STS	0x6B,R24
(0064) 	if(WaitCR0>254)
    003F EF8E      LDI	R24,0xFE
    0040 9020006B  LDS	R2,0x6B
    0042 1582      CP	R24,R2
    0043 F440      BCC	0x004C
(0065) 	 {
(0066) 	  WaitCR0=0;
    0044 2422      CLR	R2
    0045 9220006B  STS	0x6B,R2
(0067) 	  WaitCR1++;
    0047 9180006C  LDS	R24,0x6C
    0049 5F8F      SUBI	R24,0xFF
    004A 9380006C  STS	0x6C,R24
(0068) 	 }//if(WaitCR0>0)
    004C 9508      RET
(0069)   }
(0070) void SoftTimerStart(void)
(0071)   {
(0072)    WaitCR0=0;
_SoftTimerStart:
    004D 2422      CLR	R2
    004E 9220006B  STS	0x6B,R2
(0073)    WaitCR1=0;
    0050 9220006C  STS	0x6C,R2
    0052 9508      RET
(0074)   }
(0075)   
(0076) void watchdog_init(void)
(0077)      {
(0078) 	   WDR();
_watchdog_init:
    0053 95A8      WDR
(0079) 	   WDTCR=0x0F ;
    0054 E08F      LDI	R24,0xF
    0055 BD81      OUT	0x21,R24
    0056 9508      RET
(0080) 	 }
(0081) 	 
(0082) void Delay_1ms(void)
(0083) 	{
(0084) 	unsigned int i;
(0085) 
(0086) 	for (i = 1; i<1140; i++)
_Delay_1ms:
  i                    --> R16
    0057 E001      LDI	R16,1
    0058 E010      LDI	R17,0
    0059 C002      RJMP	0x005C
    005A 5F0F      SUBI	R16,0xFF
    005B 4F1F      SBCI	R17,0xFF
    005C 3704      CPI	R16,0x74
    005D E0E4      LDI	R30,4
    005E 071E      CPC	R17,R30
    005F F3D0      BCS	0x005A
    0060 9508      RET
_delayXms:
  i                    --> R20
  n                    --> R22
    0061 D19C      RCALL	push_gset2
    0062 01B8      MOVW	R22,R16
(0087) 		
(0088) 			;
(0089) 	}
(0090) 
(0091) void delayXms(unsigned int n)
(0092)      {
(0093) 	   unsigned int i=0;
    0063 2744      CLR	R20
    0064 2755      CLR	R21
    0065 C003      RJMP	0x0069
(0094) 	   while(i<n)
(0095) 	     {
(0096) 		  Delay_1ms();
    0066 DFF0      RCALL	_Delay_1ms
(0097) 		  i++;
    0067 5F4F      SUBI	R20,0xFF
    0068 4F5F      SBCI	R21,0xFF
    0069 1746      CP	R20,R22
    006A 0757      CPC	R21,R23
    006B F3D0      BCS	0x0066
    006C D178      RCALL	pop_gset2
    006D 9508      RET
(0098) 		 }
(0099) 	 }
(0100) 	 
(0101) 	 
(0102) void port_init(void)
(0103)      {
(0104) 	 
(0105) 					 
(0106) 	  PORTB=0xFF;    //PB set to 1
_port_init:
    006E EF8F      LDI	R24,0xFF
    006F BB88      OUT	0x18,R24
(0107) 	  DDRB=0xFF;     
    0070 BB87      OUT	0x17,R24
(0108) 					 
(0109) 	  PORTC=0xFF;    //PC set to 1
    0071 BB85      OUT	0x15,R24
(0110) 	  DDRC=0x00;     //
    0072 2422      CLR	R2
    0073 BA24      OUT	0x14,R2
(0111) 	      
(0112) 	  PORTD=0xFF;    //PD set to 1
    0074 BB82      OUT	0x12,R24
(0113) 	  DDRD=0x12;     //PD0:RXD PD1:TXD PD2:DI0 PD3:DI1
    0075 E182      LDI	R24,0x12
    0076 BB81      OUT	0x11,R24
(0114) 	                 //PD4:DI2  PD5:DI3 
(0115) 	  //OUTDEON;
(0116) 	  
(0117) 	SFIOR&=~(1<<PUD);  //OPEN UP LINK
    0077 B780      IN	R24,0x30
    0078 7F8B      ANDI	R24,0xFB
    0079 BF80      OUT	0x30,R24
(0118) 	//MCUCR|=(1<<ISC11); //Down edge int1
(0119) 	//GICR=(1<<INT1); //enable INT1
(0120) 	  
(0121) 	  delayXms(10); //delay 1s
    007A E00A      LDI	R16,0xA
    007B E010      LDI	R17,0
    007C DFE4      RCALL	_delayXms
    007D 9508      RET
(0122) 	 }
(0123) //////////////////////////UART INIT
(0124) void uart_init(void) 
(0125)    {
(0126)     
(0127)     OUTDEOFF;
_uart_init:
    007E 9894      CBI	0x12,4
(0128)     UCSRB=0x00;
    007F 2422      CLR	R2
    0080 B82A      OUT	0x0A,R2
(0129) 	//UBRRL=0x25;  //19.2kbps
(0130) 	UBRRL=0x1;  //38.4kbps
    0081 E081      LDI	R24,1
    0082 B989      OUT	0x09,R24
(0131) 	//TX EN ,9Bit ,Adress init
(0132) 	UCSRB=((1<<RXCIE)|(1<<TXCIE)|(1<<TXEN)|(1<<UCSZ2)|(1<<TXB8));
    0083 EC8D      LDI	R24,0xCD
    0084 B98A      OUT	0x0A,R24
    0085 9508      RET
(0133) 	//UCSRB=((1<<TXCIE)|(1<<TXCIE)|(1<<TXEN)|(1<<TXB8));
(0134)    }//void uart_init(void) 
(0135) 
(0136) ///////////////Timer init	 
(0137) void timer_init(void)
(0138)      {
(0139) 	  ;
_timer_init:
    0086 9508      RET
(0140) 	 }	 	 
(0141) 	
(0142) 
(0143) #pragma interrupt_handler timer1_ovf_isr:9
(0144) void timer1_ovf_isr(void)
(0145) {	
(0146) 	 ;  
_timer1_ovf_isr:
    0087 9518      RETI
_uart1_tx_isr:
    0088 922A      ST	R2,-Y
    0089 938A      ST	R24,-Y
    008A 939A      ST	R25,-Y
    008B 93EA      ST	R30,-Y
    008C 93FA      ST	R31,-Y
    008D B62F      IN	R2,0x3F
    008E 922A      ST	R2,-Y
(0147) 	 
(0148) }//void timer1_ovf_isr(void)
(0149) 
(0150) //TR to SLAVE
(0151) #pragma interrupt_handler uart1_tx_isr:14
(0152) void uart1_tx_isr(void)
(0153)  {
(0154)     
(0155) 	TXbufP++;
    008F 91800067  LDS	R24,0x67
    0091 5F8F      SUBI	R24,0xFF
    0092 93800067  STS	0x67,R24
(0156) 	if(TXbufP<14)
    0094 308E      CPI	R24,0xE
    0095 F4A0      BCC	0x00AA
(0157) 	  {
(0158)        
(0159) 	   if(TXbufP==2 )
    0096 3082      CPI	R24,2
    0097 F441      BNE	0x00A0
(0160) 	     {
(0161) 	     OUTLED3Pulse;	    
    0098 E084      LDI	R24,4
    0099 B228      IN	R2,0x18
    009A 2628      EOR	R2,R24
    009B BA28      OUT	0x18,R2
(0162) 		 TXDATA;	 
    009C 9850      CBI	0x0A,0
    009D E081      LDI	R24,1
    009E 93800060  STS	0x60,R24
(0163) 		
(0164) 	     }//if(TXbufP>1)
(0165) 		UDR=TXBUF[TXbufP]; 
    00A0 E88C      LDI	R24,0x8C
    00A1 E090      LDI	R25,0
    00A2 91E00067  LDS	R30,0x67
    00A4 27FF      CLR	R31
    00A5 0FE8      ADD	R30,R24
    00A6 1FF9      ADC	R31,R25
    00A7 8020      LDD	R2,Z+0
    00A8 B82C      OUT	0x0C,R2
(0166) 	  }
    00A9 C004      RJMP	0x00AE
(0167) 	else
(0168) 	    {
(0169) 		 OUTDEOFF;
    00AA 9894      CBI	0x12,4
(0170) 		 OUTLED1ON;
    00AB 98C0      CBI	0x18,0
(0171) 		 RXENABLE
    00AC 9853      CBI	0x0A,3
    00AD 9A54      SBI	0x0A,4
(0172) 		}//else
    00AE 9029      LD	R2,Y+
    00AF BE2F      OUT	0x3F,R2
    00B0 91F9      LD	R31,Y+
    00B1 91E9      LD	R30,Y+
    00B2 9199      LD	R25,Y+
    00B3 9189      LD	R24,Y+
    00B4 9029      LD	R2,Y+
    00B5 9518      RETI
_uart1_rx_isr:
  TmpD                 --> R16
    00B6 922A      ST	R2,-Y
    00B7 923A      ST	R3,-Y
    00B8 930A      ST	R16,-Y
    00B9 938A      ST	R24,-Y
    00BA 939A      ST	R25,-Y
    00BB 93EA      ST	R30,-Y
    00BC 93FA      ST	R31,-Y
    00BD B62F      IN	R2,0x3F
    00BE 922A      ST	R2,-Y
(0173) 	
(0174) 	
(0175)  }//void uart1_tx_isr(void)
(0176) 
(0177) #pragma interrupt_handler uart1_rx_isr:12
(0178) void uart1_rx_isr(void)
(0179)  {	
(0180)     unsigned char TmpD=0;
    00BF 2700      CLR	R16
(0181) 	TmpD=UDR;
    00C0 B10C      IN	R16,0x0C
(0182)     if(RXbufP<RXINTMAX)
    00C1 90200064  LDS	R2,0x64
    00C3 90300068  LDS	R3,0x68
    00C5 1432      CP	R3,R2
    00C6 F420      BCC	0x00CB
(0183) 	  {
(0184) 	   RXbufP++;
    00C7 2D83      MOV	R24,R3
    00C8 5F8F      SUBI	R24,0xFF
    00C9 93800068  STS	0x68,R24
(0185) 	  }		
(0186) 	RXBUF[RXbufP]=UDR;
    00CB E68E      LDI	R24,0x6E
    00CC E090      LDI	R25,0
    00CD 91E00068  LDS	R30,0x68
    00CF 27FF      CLR	R31
    00D0 0FE8      ADD	R30,R24
    00D1 1FF9      ADC	R31,R25
    00D2 B02C      IN	R2,0x0C
    00D3 8220      STD	Z+0,R2
(0187) 	OUTLED2Pulse;
    00D4 E082      LDI	R24,2
    00D5 B228      IN	R2,0x18

⌨️ 快捷键说明

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