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

📄 atmege16.lst

📁 本代码是AVR单片机的完整IIC通信程序
💻 LST
字号:
__text_start:
__start:
    002A E5CF      LDI	R28,0x5F
    002B E0D4      LDI	R29,4
    002C BFCD      OUT	0x3D,R28
    002D BFDE      OUT	0x3E,R29
    002E 51C0      SUBI	R28,0x10
    002F 40D0      SBCI	R29,0
    0030 EA0A      LDI	R16,0xAA
    0031 8308      STD	Y+0,R16
    0032 2400      CLR	R0
    0033 E6E0      LDI	R30,0x60
    0034 E0F0      LDI	R31,0
    0035 E010      LDI	R17,0
    0036 3FE8      CPI	R30,0xF8
    0037 07F1      CPC	R31,R17
    0038 F011      BEQ	0x003B
    0039 9201      ST	R0,Z+
    003A CFFB      RJMP	0x0036
    003B 8300      STD	Z+0,R16
    003C E5E4      LDI	R30,0x54
    003D E0F0      LDI	R31,0
    003E E6A0      LDI	R26,0x60
    003F E0B0      LDI	R27,0
    0040 E010      LDI	R17,0
    0041 35E4      CPI	R30,0x54
    0042 07F1      CPC	R31,R17
    0043 F021      BEQ	0x0048
    0044 95C8      LPM
    0045 9631      ADIW	R30,1
    0046 920D      ST	R0,X+
    0047 CFF9      RJMP	0x0041
    0048 940E014D  CALL	_main
_exit:
    004A CFFF      RJMP	_exit
_Delay:
  i                    --> R20
  uidata               --> R22
  time                 --> R16
    004B 940E016D  CALL	push_gset2
FILE: D:\avr_prm\ATmege16\ma16.c
(0001) //ICC-AVR application builder : 2006-10-21 上午 03:16:49
(0002) // Target : M16
(0003) // Crystal: 12.000Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) 
(0008) #define TRUE 1
(0009) #define FALSE 0
(0010) //#define baud  0x4d
(0011) //#define fosc 12000000
(0012) //#define baud 9600
(0013) #define Uchar unsigned char
(0014) struct data                     //位定义 
(0015) { 
(0016)     unsigned bit0:1; 
(0017)     unsigned bit1:1; 
(0018)     unsigned bit2:1; 
(0019)     unsigned bit3:1; 
(0020)     unsigned bit4:1; 
(0021)     unsigned bit5:1; 
(0022)     unsigned bit6:1; 
(0023)     unsigned bit7:1; 
(0024) }bit_flag; 
(0025) #define send_busy_flag bit_flag.bit0
(0026) #define GPS_validframe_flag bit_flag.bit1
(0027) #define receive_data_flag bit_flag.bit2
(0028) #define GPS_datalen 70 ///70 个有效数据
(0029) 
(0030) Uchar GPS_status_frame;
(0031) Uchar GPS_receive_buffer[72];
(0032) Uchar GPS_send_buffer[72];
(0033) Uchar GPS_data_conut;
(0034) Uchar GPS_data_start;
(0035) Uchar GPS_data_end;
(0036) 
(0037) Uchar *com_send_ptr;
(0038) Uchar com_datasen_len;
(0039) 
(0040) void Delay(Uchar time)
(0041) {
(0042) 	int i,uidata=10000;
    004D E160      LDI	R22,0x10
    004E E277      LDI	R23,0x27
(0043) for(i=0;i<time;i++)
    004F 2744      CLR	R20
    0050 2755      CLR	R21
    0051 C009      RJMP	0x005B
(0044) while(--uidata)
(0045) {
(0046)   asm("nop");
    0052 0000      NOP
    0053 01CB      MOVW	R24,R22
    0054 9701      SBIW	R24,1
    0055 01BC      MOVW	R22,R24
    0056 3060      CPI	R22,0
    0057 0767      CPC	R22,R23
    0058 F7C9      BNE	0x0052
    0059 5F4F      SUBI	R20,0xFF
    005A 4F5F      SBCI	R21,0xFF
    005B 2E20      MOV	R2,R16
    005C 2433      CLR	R3
    005D 1542      CP	R20,R2
    005E 0553      CPC	R21,R3
    005F F39C      BLT	0x0053
(0047) }
(0048)  asm("nop");
    0060 0000      NOP
(0049)  asm("nop");
    0061 0000      NOP
(0050)  asm("nop");
    0062 0000      NOP
    0063 940E0164  CALL	pop_gset2
    0065 9508      RET
(0051) }
(0052) 
(0053) void port_init(void)
(0054) {
(0055)  DDRA  = 0xFF; // Set to ouput
_port_init:
    0066 EF8F      LDI	R24,0xFF
    0067 BB8A      OUT	0x1A,R24
(0056)  PORTA = 0x00;
    0068 2422      CLR	R2
    0069 BA2B      OUT	0x1B,R2
(0057)  DDRB  = 0xFF; // Set to ouput
    006A BB87      OUT	0x17,R24
(0058)  PORTB = 0x00; // Startup pattern
    006B BA28      OUT	0x18,R2
(0059)  PORTC = 0x00; //m103 output only
    006C BA25      OUT	0x15,R2
(0060)  DDRC  = 0x00;
    006D BA24      OUT	0x14,R2
(0061)  PORTD = 0x00;
    006E BA22      OUT	0x12,R2
(0062)  DDRD = 0x80;
    006F E880      LDI	R24,0x80
    0070 BB81      OUT	0x11,R24
    0071 9508      RET
(0063) }
(0064) void uart0_init(void)
(0065) {
(0066) UCSRA=0x00;
_uart0_init:
    0072 2422      CLR	R2
    0073 B82B      OUT	0x0B,R2
(0067) //UCSRB=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
(0068) UCSRB=0xd8;
    0074 ED88      LDI	R24,0xD8
    0075 B98A      OUT	0x0A,R24
(0069) UBRRH=0x00;
    0076 BC20      OUT	0x20,R2
(0070) UBRRL=0x33;
    0077 E383      LDI	R24,0x33
    0078 B989      OUT	0x09,R24
(0071) //UCSRC| = BIT(URSEL);
(0072) UCSRC=BIT(URSEL)|0x06;
    0079 E886      LDI	R24,0x86
    007A BD80      OUT	0x20,R24
    007B 9508      RET
_uart0_rx_isr:
    007C 922A      ST	R2,-Y
    007D 938A      ST	R24,-Y
    007E 939A      ST	R25,-Y
    007F 93EA      ST	R30,-Y
    0080 93FA      ST	R31,-Y
    0081 B62F      IN	R2,0x3F
    0082 922A      ST	R2,-Y
(0073) }
(0074) #pragma interrupt_handler uart0_rx_isr:12
(0075) #pragma interrupt_handler uart0_tx_isr:14
(0076) void uart0_rx_isr(void)
(0077) {
(0078)  	UCSRA|=(1<<RXC);//清接收中断标志
    0083 9A5F      SBI	0x0B,7
(0079) 	if(GPS_validframe_flag)
    0084 918000F7  LDS	R24,bit_flag
    0086 9586      LSR	R24
    0087 7081      ANDI	R24,1
    0088 F009      BEQ	0x008A
(0080) 		{return;}
    0089 C04F      RJMP	0x00D9
(0081) 	if(GPS_status_frame==0x00)//////////////接收数据起始字符68H
    008A 902000F6  LDS	R2,GPS_status_frame
    008C 2022      TST	R2
    008D F491      BNE	0x00A0
(0082) 		{
(0083) 		GPS_data_start=UDR;
    008E B02C      IN	R2,0x0C
    008F 92200064  STS	GPS_data_start,R2
(0084) 		if(GPS_data_start!=0x24)
    0091 2D82      MOV	R24,R2
    0092 3284      CPI	R24,0x24
    0093 F021      BEQ	0x0098
(0085) 			{
(0086) 			GPS_status_frame=0x00;
    0094 2422      CLR	R2
    0095 922000F6  STS	GPS_status_frame,R2
(0087) 			}
    0097 C041      RJMP	0x00D9
(0088) 		else
(0089) 			{
(0090) 			GPS_status_frame=0x01;
    0098 E081      LDI	R24,1
    0099 938000F6  STS	GPS_status_frame,R24
(0091) 			GPS_receive_buffer[0]=GPS_data_start;
    009B 90200064  LDS	R2,GPS_data_start
    009D 922000AE  STS	GPS_receive_buffer,R2
(0092) 			}
(0093) 		}
    009F C039      RJMP	0x00D9
(0094) 	else if(GPS_status_frame==0x01)//////////开始接收数据
    00A0 918000F6  LDS	R24,GPS_status_frame
    00A2 3081      CPI	R24,1
    00A3 F4A1      BNE	0x00B8
(0095) 		{
(0096) 		GPS_receive_buffer[GPS_data_conut]=UDR;
    00A4 EA8E      LDI	R24,0xAE
    00A5 E090      LDI	R25,0
    00A6 91E00065  LDS	R30,GPS_data_conut
    00A8 27FF      CLR	R31
    00A9 0FE8      ADD	R30,R24
    00AA 1FF9      ADC	R31,R25
    00AB B02C      IN	R2,0x0C
    00AC 8220      STD	Z+0,R2
(0097) 		GPS_data_conut++;
    00AD 91800065  LDS	R24,GPS_data_conut
    00AF 5F8F      SUBI	R24,0xFF
    00B0 93800065  STS	GPS_data_conut,R24
(0098) 		if(GPS_data_conut==GPS_datalen+1)
    00B2 3487      CPI	R24,0x47
    00B3 F529      BNE	0x00D9
(0099) 			{
(0100) 			GPS_status_frame=0x02;
    00B4 E082      LDI	R24,2
    00B5 938000F6  STS	GPS_status_frame,R24
(0101) 			}
(0102) 		}
    00B7 C021      RJMP	0x00D9
(0103) 	else if(GPS_status_frame==0x02)
    00B8 918000F6  LDS	R24,GPS_status_frame
    00BA 3082      CPI	R24,2
    00BB F4E9      BNE	0x00D9
(0104) 		{
(0105) 		GPS_data_end=UDR;
    00BC B02C      IN	R2,0x0C
    00BD 92200063  STS	GPS_data_end,R2
(0106) 		if(GPS_data_end!=0x0a)
    00BF 2D82      MOV	R24,R2
    00C0 308A      CPI	R24,0xA
    00C1 F031      BEQ	0x00C8
(0107) 			{
(0108) 			GPS_validframe_flag=FALSE;
    00C2 918000F7  LDS	R24,bit_flag
    00C4 7F8D      ANDI	R24,0xFD
    00C5 938000F7  STS	bit_flag,R24
(0109) 			}
    00C7 C009      RJMP	0x00D1
(0110) 		else
(0111) 			{
(0112) 			GPS_receive_buffer[71]=GPS_data_end;
    00C8 90200063  LDS	R2,GPS_data_end
    00CA 922000F5  STS	0xF5,R2
(0113) 			GPS_validframe_flag=TRUE;
    00CC 918000F7  LDS	R24,bit_flag
    00CE 6082      ORI	R24,2
    00CF 938000F7  STS	bit_flag,R24
(0114) 			}
(0115) 		GPS_status_frame=0x00;
    00D1 2422      CLR	R2
    00D2 922000F6  STS	GPS_status_frame,R2
(0116) 		receive_data_flag=TRUE;
    00D4 918000F7  LDS	R24,bit_flag
    00D6 6084      ORI	R24,4
    00D7 938000F7  STS	bit_flag,R24
(0117) 		}
    00D9 9029      LD	R2,Y+
    00DA BE2F      OUT	0x3F,R2
    00DB 91F9      LD	R31,Y+
    00DC 91E9      LD	R30,Y+
    00DD 9199      LD	R25,Y+
    00DE 9189      LD	R24,Y+
    00DF 9029      LD	R2,Y+
    00E0 9518      RETI
_uart0_tx_isr:
    00E1 922A      ST	R2,-Y
    00E2 923A      ST	R3,-Y
    00E3 938A      ST	R24,-Y
    00E4 939A      ST	R25,-Y
    00E5 93EA      ST	R30,-Y
    00E6 93FA      ST	R31,-Y
    00E7 B62F      IN	R2,0x3F
    00E8 922A      ST	R2,-Y
(0118) }
(0119) void uart0_tx_isr(void) 
(0120)     { 
(0121)        UCSRA|=(1<<TXC);//清发送中断标志 
    00E9 9A5E      SBI	0x0B,6
(0122)        if(com_datasen_len>0)/////////////数据缓冲区数据没有发送完毕
    00EA 2422      CLR	R2
    00EB 90300060  LDS	R3,com_datasen_len
    00ED 1423      CP	R2,R3
    00EE F488      BCC	0x0100
(0123) 		{
(0124) 		UDR=*com_send_ptr;
    00EF 91E00061  LDS	R30,com_send_ptr
    00F1 91F00062  LDS	R31,com_send_ptr+1
    00F3 8020      LDD	R2,Z+0
    00F4 B82C      OUT	0x0C,R2
(0125) 		com_send_ptr++;
    00F5 01CF      MOVW	R24,R30
    00F6 9601      ADIW	R24,1
    00F7 93900062  STS	com_send_ptr+1,R25
    00F9 93800061  STS	com_send_ptr,R24
(0126) 		com_datasen_len--;
    00FB 2D83      MOV	R24,R3
    00FC 5081      SUBI	R24,1
    00FD 93800060  STS	com_datasen_len,R24
(0127) 		}
    00FF C005      RJMP	0x0105
(0128) 	else
(0129) 		{
(0130) 		send_busy_flag=FALSE;
    0100 918000F7  LDS	R24,bit_flag
    0102 7F8E      ANDI	R24,0xFE
    0103 938000F7  STS	bit_flag,R24
(0131) 		}
    0105 9029      LD	R2,Y+
    0106 BE2F      OUT	0x3F,R2
    0107 91F9      LD	R31,Y+
    0108 91E9      LD	R30,Y+
    0109 9199      LD	R25,Y+
    010A 9189      LD	R24,Y+
    010B 9039      LD	R3,Y+
    010C 9029      LD	R2,Y+
    010D 9518      RETI
(0132)    }
(0133) void init_devices(void)
(0134) {
(0135)  CLI(); //disable all interrupts
_init_devices:
    010E 94F8      BCLR	7
(0136)  port_init();
    010F DF56      RCALL	_port_init
(0137)  uart0_init();
    0110 DF61      RCALL	_uart0_init
(0138)  OSCCAL=0xb9;
    0111 EB89      LDI	R24,0xB9
    0112 BF81      OUT	0x31,R24
(0139) send_busy_flag=FALSE;
    0113 918000F7  LDS	R24,bit_flag
    0115 7F8E      ANDI	R24,0xFE
    0116 938000F7  STS	bit_flag,R24
(0140)  MCUCR = 0x00;
    0118 2422      CLR	R2
    0119 BE25      OUT	0x35,R2
(0141)  GICR  = 0x00;
    011A BE2B      OUT	0x3B,R2
(0142)  TIMSK = 0x00; //timer interrupt sources
    011B BE29      OUT	0x39,R2
(0143)  SEI(); //re-enable interrupts
    011C 9478      BSET	7
    011D 9508      RET
(0144)  //all peripherals are now initialized
(0145) }
(0146) void system_init()
(0147) {
(0148)  GPS_data_conut=1;
_system_init:
    011E E081      LDI	R24,1
    011F 93800065  STS	GPS_data_conut,R24
(0149) GPS_status_frame=0x00;
    0121 2422      CLR	R2
    0122 922000F6  STS	GPS_status_frame,R2
(0150) GPS_validframe_flag=FALSE;
    0124 918000F7  LDS	R24,bit_flag
    0126 7F8D      ANDI	R24,0xFD
    0127 938000F7  STS	bit_flag,R24
(0151) receive_data_flag=FALSE;
    0129 7F8B      ANDI	R24,0xFB
    012A 938000F7  STS	bit_flag,R24
    012C 9508      RET
(0152) }
(0153) void send_com_data()
(0154) {
(0155) 	if(!send_busy_flag)
_send_com_data:
    012D 918000F7  LDS	R24,bit_flag
    012F 7081      ANDI	R24,1
    0130 F4D9      BNE	0x014C
(0156)     		{
(0157)     		com_datasen_len=72;
    0131 E488      LDI	R24,0x48
    0132 93800060  STS	com_datasen_len,R24
(0158) 		com_datasen_len--;
    0134 5081      SUBI	R24,1
    0135 93800060  STS	com_datasen_len,R24
(0159) 		com_send_ptr=GPS_receive_buffer;
    0137 EA8E      LDI	R24,0xAE
    0138 E090      LDI	R25,0
    0139 93900062  STS	com_send_ptr+1,R25
    013B 93800061  STS	com_send_ptr,R24
(0160) 		send_busy_flag=TRUE;
    013D 918000F7  LDS	R24,bit_flag
    013F 6081      ORI	R24,1
    0140 938000F7  STS	bit_flag,R24
(0161) 	 	UDR=*com_send_ptr++;
    0142 91E00061  LDS	R30,com_send_ptr
    0144 91F00062  LDS	R31,com_send_ptr+1
    0146 9021      LD	R2,Z+
    0147 93F00062  STS	com_send_ptr+1,R31
    0149 93E00061  STS	com_send_ptr,R30
    014B B82C      OUT	0x0C,R2
(0162)     		}
    014C 9508      RET
(0163) }
(0164) void main(void)
(0165) {
(0166)   Uchar i;
(0167)   init_devices();
_main:
  i                    --> Y+1
    014D DFC0      RCALL	_init_devices
(0168)   system_init();
    014E DFCF      RCALL	_system_init
    014F C012      RJMP	0x0162
(0169)   while(1)
(0170)   {
(0171) 	if(receive_data_flag)
    0150 918000F7  LDS	R24,bit_flag
    0152 9586      LSR	R24
    0153 9586      LSR	R24
    0154 7081      ANDI	R24,1
    0155 F061      BEQ	0x0162
(0172) 		{
(0173) 		send_com_data();
    0156 DFD6      RCALL	_send_com_data
(0174) 		receive_data_flag=FALSE;
    0157 918000F7  LDS	R24,bit_flag
    0159 7F8B      ANDI	R24,0xFB
    015A 938000F7  STS	bit_flag,R24
(0175) 		GPS_validframe_flag=FALSE;
    015C 7F8D      ANDI	R24,0xFD
    015D 938000F7  STS	bit_flag,R24
(0176) 		GPS_data_conut=1;
FILE: <library>
    015F E081      LDI	R24,1
    0160 93800065  STS	GPS_data_conut,R24
    0162 CFED      RJMP	0x0150
    0163 9508      RET
pop_gset2:
    0164 E0E2      LDI	R30,2
    0165 940C0173  JMP	pop
push_gset5:
    0167 92FA      ST	R15,-Y
    0168 92EA      ST	R14,-Y
push_gset4:
    0169 92DA      ST	R13,-Y
    016A 92CA      ST	R12,-Y
push_gset3:
    016B 92BA      ST	R11,-Y
    016C 92AA      ST	R10,-Y
push_gset2:
    016D 937A      ST	R23,-Y
    016E 936A      ST	R22,-Y
push_gset1:
    016F 935A      ST	R21,-Y
    0170 934A      ST	R20,-Y
    0171 9508      RET
pop_gset1:
    0172 E0E1      LDI	R30,1
pop:
    0173 9149      LD	R20,Y+
    0174 9159      LD	R21,Y+
    0175 FDE0      SBRC	R30,0
    0176 9508      RET
    0177 9169      LD	R22,Y+
    0178 9179      LD	R23,Y+
    0179 FDE1      SBRC	R30,1
    017A 9508      RET
    017B 90A9      LD	R10,Y+
    017C 90B9      LD	R11,Y+
    017D FDE2      SBRC	R30,2
    017E 9508      RET
    017F 90C9      LD	R12,Y+
    0180 90D9      LD	R13,Y+
    0181 FDE3      SBRC	R30,3
    0182 9508      RET
    0183 90E9      LD	R14,Y+
    0184 90F9      LD	R15,Y+
    0185 9508      RET

⌨️ 快捷键说明

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