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

📄 m8iap.lst

📁 AVR系列被广泛应用的单片机MEGA8开发(原理图)及例程
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0E43 E001      LDI	R16,1
    0E44 BF05      OUT	0x35,R16
    0E45 E002      LDI	R16,2
    0E46 BF05      OUT	0x35,R16
    0E47 E5CF      LDI	R28,0x5F
    0E48 E0D4      LDI	R29,4
    0E49 BFCD      OUT	0x3D,R28
    0E4A BFDE      OUT	0x3E,R29
    0E4B 52C0      SUBI	R28,0x20
    0E4C 40D0      SBCI	R29,0
    0E4D EA0A      LDI	R16,0xAA
    0E4E 8308      STD	Y+0,R16
    0E4F 2400      CLR	R0
    0E50 EBEF      LDI	R30,0xBF
    0E51 E0F0      LDI	R31,0
    0E52 E010      LDI	R17,0
    0E53 3BEF      CPI	R30,0xBF
    0E54 07F1      CPC	R31,R17
    0E55 F011      BEQ	0x0E58
    0E56 9201      ST	R0,Z+
    0E57 CFFB      RJMP	0x0E53
    0E58 8300      STD	Z+0,R16
    0E59 E2E6      LDI	R30,0x26
    0E5A E1FC      LDI	R31,0x1C
    0E5B E6A0      LDI	R26,0x60
    0E5C E0B0      LDI	R27,0
    0E5D E11C      LDI	R17,0x1C
    0E5E 38E5      CPI	R30,0x85
    0E5F 07F1      CPC	R31,R17
    0E60 F021      BEQ	0x0E65
    0E61 95C8      LPM
    0E62 9631      ADIW	R30,1
    0E63 920D      ST	R0,X+
    0E64 CFF9      RJMP	0x0E5E
    0E65 D022      RCALL	_main
_exit:
    0E66 CFFF      RJMP	_exit
FILE: D:\AVR_Demo\M8IAP\Source\main.c
(0001) /*****************************************************************************
(0002) *
(0003) * Copyright (C) 1996-1998 Atmel Corporation
(0004) *
(0005) * File          : main.c
(0006) * Compiler      : IAR 1.51B
(0007) * Output size   : 505 bytes (size optimized)
(0008) * Created       : 16-jun-99
(0009) * Modified      : 5-jan-2000
(0010) * Last modified : 16-may-2001 by jll
(0011) *
(0012) * Support mail  : avr@atmel.com
(0013) *
(0014) * Description   : This Program allows an AVR with bootloader capabilities to 
(0015) *                 Read/write its own Flash/EEprom. To enter Programming mode   
(0016) *                 PD2 is checked, it this pin is pulled low, programming mode  
(0017) *                 is entered. If not, normal execution is done from $0000 
(0018) *                 "reset" vector in Application area.
(0019) *                 The PD2 pin should be pulled HIGH by an external Pull-up 
(0020) *                 resistor.
(0021) *
(0022) * Other info    : Code must be modified to use this specific code with devices
(0023) *                 other than ATmega161. Following change should be made:
(0024) *                    -Specify device in define list (e.g. _ATMEGA163)
(0025) *                 
(0026) *                 When using this code with (future) parts other than ATmega32,
(0027) *                 ATmega161 and ATmega163, it will be necessary to change more 
(0028) *                 than the device name. The changes that should be made is:
(0029) *                    -Device name
(0030) *                    -Device signature and memory settings (defines.h)
(0031) *                    -Device code
(0032) *                    -Linker file
(0033) *
(0034) *                 In general the linker file should always be verifyed to match
(0035) *                 the used part's boot address and size. Note that memory size
(0036) *                 is specified in bytes in the linker file.
(0037) ****************************************************************************/
(0038) #include "defines.h"
(0039) #include "serial.h"
(0040) #include "assembly.h"
(0041) 
(0042) void Delay(unsigned int i)
(0043) {
(0044) while(i--) ;
_Delay:
  i                    --> R16
    0E67 0118      MOVW	R2,R16
    0E68 5001      SUBI	R16,1
    0E69 4010      SBCI	R17,0
    0E6A 2022      TST	R2
    0E6B F7D9      BNE	0x0E67
    0E6C 2033      TST	R3
    0E6D F7C9      BNE	0x0E67
(0045) }
    0E6E 9508      RET
(0046) 
(0047) void Display_IAP(void)
(0048) {
(0049)  PORTD = 0xEF;
_Display_IAP:
    0E6F EE8F      LDI	R24,0xEF
    0E70 BB82      OUT	0x12,R24
(0050)  PORTB = 0xF9;
    0E71 EF89      LDI	R24,0xF9
    0E72 BB88      OUT	0x18,R24
(0051)  Delay(6000);
    0E73 E700      LDI	R16,0x70
    0E74 E117      LDI	R17,0x17
    0E75 DFF1      RCALL	_Delay
(0052)   PORTD = 0xB7;
    0E76 EB87      LDI	R24,0xB7
    0E77 BB82      OUT	0x12,R24
(0053)  PORTB = 0x08;
    0E78 E088      LDI	R24,0x8
    0E79 BB88      OUT	0x18,R24
(0054)  Delay(6000);
    0E7A E700      LDI	R16,0x70
    0E7B E117      LDI	R17,0x17
    0E7C DFEA      RCALL	_Delay
(0055) PORTD = 0xBB;
    0E7D EB8B      LDI	R24,0xBB
    0E7E BB82      OUT	0x12,R24
(0056)  PORTB = 0xCC;
    0E7F EC8C      LDI	R24,0xCC
    0E80 BB88      OUT	0x18,R24
(0057) }
    0E81 9508      RET
_timer0_ovf_isr:
    0E82 D11B      RCALL	push_lset
(0058) 
(0059) #pragma interrupt_handler timer0_ovf_isr:10
(0060) void timer0_ovf_isr(void)
(0061) {
(0062)  TCNT0 = 0x8D; //reload counter value
    0E83 E88D      LDI	R24,0x8D
    0E84 BF82      OUT	0x32,R24
(0063)  Display_IAP();
    0E85 DFE9      RCALL	_Display_IAP
(0064) }
    0E86 D12E      RCALL	pop_lset
    0E87 9518      RETI
(0065) void main(void)
(0066) {
(0067) unsigned int intval,address,data,page_address;
(0068) unsigned char val, page_size;
(0069) Delay(10000);
_main:
  intval               --> Y+1
  val                  --> R20
  address              --> R22
  data                 --> R14
  page_size            --> R10
  page_address         --> R12
    0E88 E100      LDI	R16,0x10
    0E89 E217      LDI	R17,0x27
    0E8A DFDC      RCALL	_Delay
(0070) SerialInit();
    0E8B D097      RCALL	_SerialInit
(0071) Delay(50000);
    0E8C E500      LDI	R16,0x50
    0E8D EC13      LDI	R17,0xC3
    0E8E DFD8      RCALL	_Delay
(0072) sendstr("富友勤IAP V1.0 ");
    0E8F EA0F      LDI	R16,0xAF
    0E90 E010      LDI	R17,0
    0E91 D0A1      RCALL	_sendstr
(0073)  PORTB = 0xFF;
    0E92 EF8F      LDI	R24,0xFF
    0E93 BB88      OUT	0x18,R24
(0074)  DDRB  = 0xFF;
    0E94 BB87      OUT	0x17,R24
(0075)  PORTC = 0x7F; //m103 output only
    0E95 E78F      LDI	R24,0x7F
    0E96 BB85      OUT	0x15,R24
(0076)  DDRC  = 0x79;
    0E97 E789      LDI	R24,0x79
    0E98 BB84      OUT	0x14,R24
(0077)  PORTD = 0xFF;
    0E99 EF8F      LDI	R24,0xFF
    0E9A BB82      OUT	0x12,R24
(0078)  DDRD  = 0xFC;
    0E9B EF8C      LDI	R24,0xFC
    0E9C BB81      OUT	0x11,R24
(0079)  val=UDR;
    0E9D B14C      IN	R20,0x0C
(0080)  val=reccharcommand2();
    0E9E D0B8      RCALL	_reccharcommand2
    0E9F 2F40      MOV	R20,R16
(0081)  if(val=='I')                   //Chip erase 
    0EA0 3409      CPI	R16,0x49
    0EA1 F409      BNE	0x0EA3
(0082) goto Binger;
    0EA2 C003      RJMP	0x0EA6
(0083) 
(0084) //UCSRB = 0x00; //disable while setting baud rate
(0085) //UCSRA = 0x00;
(0086) 
(0087) PROGPORT |= PROGCTRL;               //enable pull-up on PROGCTRL line on PROGPORT
    0EA3 9A92      SBI	0x12,2
(0088)  if (PROGMODE)     
    0EA4 9982      SBIC	0x10,2
    0EA5 C078      RJMP	0x0F1E
(0089)     	{
(0090)  Binger:  
(0091) 
(0092) sendstr("富友勤 ATMEGA8 DEMO");
    0EA6 E90B      LDI	R16,0x9B
    0EA7 E010      LDI	R17,0
    0EA8 D08A      RCALL	_sendstr
(0093)  sendstr("Start IAP");
    0EA9 E901      LDI	R16,0x91
    0EAA E010      LDI	R17,0
    0EAB D087      RCALL	_sendstr
(0094)       for(;;)                           
(0095)       {
(0096)    Display_IAP();
    0EAC DFC2      RCALL	_Display_IAP
(0097)         val=reccharcommand();
    0EAD D099      RCALL	_reccharcommand
    0EAE 2F40      MOV	R20,R16
(0098)         if(val=='W')                   //Chip erase 
    0EAF 3507      CPI	R16,0x57
    0EB0 F009      BEQ	0x0EB2
    0EB1 C053      RJMP	0x0F05
(0099)         {
(0100)           sendstr("Start Write ");
    0EB2 E804      LDI	R16,0x84
    0EB3 E010      LDI	R17,0
    0EB4 D07E      RCALL	_sendstr
(0101)           page_address=recchar();
    0EB5 D08D      RCALL	_recchar
    0EB6 2EC0      MOV	R12,R16
    0EB7 24DD      CLR	R13
(0102)           page_address|=recchar()<<8;
    0EB8 D08A      RCALL	_recchar
    0EB9 2E20      MOV	R2,R16
    0EBA 2433      CLR	R3
    0EBB 2C32      MOV	R3,R2
    0EBC 2422      CLR	R2
    0EBD 28C2      OR	R12,R2
    0EBE 28D3      OR	R13,R3
(0103)           for(address=0;address < APP_END;address += PAGESIZE)  //Application section = 60 pages
    0EBF 2766      CLR	R22
    0EC0 2777      CLR	R23
    0EC1 C03A      RJMP	0x0EFC
(0104)           { 
(0105)           for(page_size=0;page_size < PAGESIZE;page_size += 2)  //Application section = 60 pages
    0EC2 24AA      CLR	R10
    0EC3 C02F      RJMP	0x0EF3
(0106)           	{
(0107)           	if(page_address!=0)
    0EC4 20CC      TST	R12
    0EC5 F411      BNE	0x0EC8
    0EC6 20DD      TST	R13
    0EC7 F021      BEQ	0x0ECC
(0108)           	 data=recchar();
    0EC8 D07A      RCALL	_recchar
    0EC9 2EE0      MOV	R14,R16
    0ECA 24FF      CLR	R15
    0ECB C003      RJMP	0x0ECF
(0109)                 else
(0110)                 data=0xFF;
    0ECC EF8F      LDI	R24,0xFF
    0ECD E090      LDI	R25,0
    0ECE 017C      MOVW	R14,R24
(0111)                 if(page_address)
    0ECF 20CC      TST	R12
    0ED0 F411      BNE	0x0ED3
    0ED1 20DD      TST	R13
    0ED2 F019      BEQ	0x0ED6
(0112)                 page_address--;
    0ED3 01C6      MOVW	R24,R12
    0ED4 9701      SBIW	R24,1
    0ED5 016C      MOVW	R12,R24
(0113)                 if(page_address!=0)
    0ED6 20CC      TST	R12
    0ED7 F411      BNE	0x0EDA
    0ED8 20DD      TST	R13
    0ED9 F041      BEQ	0x0EE2
(0114)                data|=recchar()<<8;
    0EDA D068      RCALL	_recchar
    0EDB 2E20      MOV	R2,R16
    0EDC 2433      CLR	R3
    0EDD 2C32      MOV	R3,R2
    0EDE 2422      CLR	R2
    0EDF 28E2      OR	R14,R2
    0EE0 28F3      OR	R15,R3
    0EE1 C003      RJMP	0x0EE5
(0115)                 else
(0116)                data|=0xFF<<8;
    0EE2 01C7      MOVW	R24,R14
    0EE3 6F9F      ORI	R25,0xFF
    0EE4 017C      MOVW	R14,R24
(0117)                 if(page_address)
    0EE5 20CC      TST	R12
    0EE6 F411      BNE	0x0EE9
    0EE7 20DD      TST	R13
    0EE8 F019      BEQ	0x0EEC
(0118)                 page_address--;
    0EE9 01C6      MOVW	R24,R12
    0EEA 9701      SBIW	R24,1
    0EEB 016C      MOVW	R12,R24
(0119)                fill_temp_buffer(data,(page_size)); //call asm routine. 
    0EEC 2D2A      MOV	R18,R10
    0EED 2733      CLR	R19
    0EEE 0187      MOVW	R16,R14
    0EEF D07E      RCALL	_fill_temp_buffer
    0EF0 2D8A      MOV	R24,R10
    0EF1 5F8E      SUBI	R24,0xFE
    0EF2 2EA8      MOV	R10,R24
    0EF3 2D8A      MOV	R24,R10
    0EF4 3480      CPI	R24,0x40
    0EF5 F408      BCC	0x0EF7
    0EF6 CFCD      RJMP	0x0EC4
(0120)           	}
(0121)             write_page((address),0x05);       
    0EF7 E025      LDI	R18,5
    0EF8 018B      MOVW	R16,R22
    0EF9 D06D      RCALL	_write_page
    0EFA 5C60      SUBI	R22,0xC0
    0EFB 4F7F      SBCI	R23,0xFF
    0EFC 3060      CPI	R22,0
    0EFD E1EC      LDI	R30,0x1C
    0EFE 077E      CPC	R23,R30
    0EFF F408      BCC	0x0F01
    0F00 CFC1      RJMP	0x0EC2
(0122)           	}
(0123)            sendstr("End Write ");  
    0F01 E709      LDI	R16,0x79
    0F02 E010      LDI	R17,0
    0F03 D02F      RCALL	_sendstr
(0124)         }
    0F04 CFA7      RJMP	0x0EAC
(0125)         
(0126)        else if(val=='e')                   //Chip erase 
    0F05 3645      CPI	R20,0x65
    0F06 F009      BEQ	0x0F08
    0F07 CFA4      RJMP	0x0EAC
(0127)         {   
(0128)         sendstr("Start Erase ");  
    0F08 E60C      LDI	R16,0x6C
    0F09 E010      LDI	R17,0
    0F0A D028      RCALL	_sendstr
(0129) 
(0130)           for(address=0;address < APP_END;address += PAGESIZE)  //Application section = 60 pages
    0F0B 2766      CLR	R22
    0F0C 2777      CLR	R23
    0F0D C008      RJMP	0x0F16
(0131)           {Delay(20000);
    0F0E E200      LDI	R16,0x20
    0F0F E41E      LDI	R17,0x4E
    0F10 DF56      RCALL	_Delay
(0132)             write_page(address,0x03);       //Perform page erase
    0F11 E023      LDI	R18,3
    0F12 018B      MOVW	R16,R22
    0F13 D053      RCALL	_write_page
    0F14 5C60      SUBI	R22,0xC0
    0F15 4F7F      SBCI	R23,0xFF
    0F16 3060      CPI	R22,0
    0F17 E1EC      LDI	R30,0x1C
    0F18 077E      CPC	R23,R30
    0F19 F3A0      BCS	0x0F0E
(0133)           }
(0134)             sendstr("End  Erase ");  
    0F1A E600      LDI	R16,0x60
    0F1B E010      LDI	R17,0
    0F1C D016      RCALL	_sendstr
    0F1D CF8E      RJMP	0x0EAC
(0135)         }
(0136) 	
(0137) 
(0138)       }
(0139)     	}
(0140)     else
(0141)     	  { asm("JMP 0x0000") ;
    0F1E 940C0000  JMP	0x0
(0142)     	     UCSRB = 0x00; 
    0F20 2422      CLR	R2
    0F21 B82A      OUT	0x0A,R2
(0143)     	  }
(0144) 
(0145)     }
    0F22 9508      RET
FILE: D:\AVR_Demo\M8IAP\Source\serial.c
(0001) #include "defines.h"
(0002) void SerialInit(void)
(0003) {

⌨️ 快捷键说明

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