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

📄 main.lis

📁 AVR mage8单片机的bootload程序、完整版本、本人做项目一下在用、此程序为8m晶振版本、非常好用
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 00CE           ;        TempInt -> R20,R21
 00CE           ;              i -> R22,R23
                        .even
 00CE           _WriteFlash::
 00CE 00D0              rcall push_gset2
 00D0           ;       
 00D0           ; }
 00D0           ; 
 00D0           ; /*****************************************************************************/
 00D0           ; 
 00D0           ; void WriteFlash(void)
 00D0           ; {
 00D0           ;     unsigned int i;
 00D0           ;     unsigned int TempInt;
 00D0           ; 
 00D0           ;     for(i = 0 ; i < PageByte ; i += 2)
 00D0 6627              clr R22
 00D2 7727              clr R23
 00D4 16C0              rjmp L35
 00D6           L32:
 00D6 80E0              ldi R24,<_PageBuffer
 00D8 90E0              ldi R25,>_PageBuffer
 00DA FB01              movw R30,R22
 00DC 3196              adiw R30,1
 00DE E80F              add R30,R24
 00E0 F91F              adc R31,R25
 00E2 2080              ldd R2,z+0
 00E4 3324              clr R3
 00E6 322C              mov R3,R2
 00E8 2224              clr R2
 00EA FB01              movw R30,R22
 00EC E80F              add R30,R24
 00EE F91F              adc R31,R25
 00F0 4081              ldd R20,z+0
 00F2 5527              clr R21
 00F4 420D              add R20,R2
 00F6 531D              adc R21,R3
 00F8 9B01              movw R18,R22
 00FA 8A01              movw R16,R20
 00FC 00D0              rcall _fill_temp_buffer
 00FE           L33:
 00FE 6E5F              subi R22,254  ; offset = 2
 0100 7F4F              sbci R23,255
 0102           L35:
 0102 6034              cpi R22,64
 0104 E0E0              ldi R30,0
 0106 7E07              cpc R23,R30
 0108 30F3              brlo L32
 010A           ;       {
 010A           ;           TempInt = PageBuffer[i] + (PageBuffer[i+1]<<8);
 010A           ;           fill_temp_buffer(TempInt,i);    //call asm routine.
 010A           ;       }
 010A           ;         write_page(PageAddress,0x03);       //Perform page ERASE
 010A 23E0              ldi R18,3
 010C 00910200          lds R16,_PageAddress
 0110 10910300          lds R17,_PageAddress+1
 0114 00D0              rcall _write_page
 0116           ;     write_page(PageAddress,0x05);       //Perform page write
 0116 25E0              ldi R18,5
 0118 00910200          lds R16,_PageAddress
 011C 10910300          lds R17,_PageAddress+1
 0120 00D0              rcall _write_page
 0122           ;     enableRWW();
 0122 00D0              rcall _enableRWW
 0124           ;     WDR();
 0124 A895              wdr
 0126           L31:
 0126 00D0              rcall pop_gset2
 0128                   .dbline 0 ; func end
 0128 0895              ret
 012A           ;       TempInt2 -> R22,R23
 012A           ;        TempInt -> R10,R11
 012A           ;              i -> R20,R21
                        .even
 012A           _CheckFlash::
 012A 00D0              rcall push_gset3
 012C           ; }
 012C           ; 
 012C           ; /*****************************************************************************/
 012C           ; 
 012C           ; char CheckFlash(void)
 012C           ; {
 012C           ;     unsigned int i;                                                   
 012C           ;     unsigned int TempInt;
 012C           ;     unsigned int TempInt2;
 012C           ;     WDR();
 012C A895              wdr
 012E           ;     for (i = 0 ; i < PageByte ; i += 2)
 012E 4427              clr R20
 0130 5527              clr R21
 0132 21C0              rjmp L40
 0134           L37:
 0134           ;     {
 0134           ; 	      TempInt = read_program_memory(PageAddress + i , 0x00);
 0134 2227              clr R18
 0136 00910200          lds R16,_PageAddress
 013A 10910300          lds R17,_PageAddress+1
 013E 040F              add R16,R20
 0140 151F              adc R17,R21
 0142 00D0              rcall _read_program_memory
 0144 5801              movw R10,R16
 0146           ;             TempInt2 = PageBuffer[i] +(PageBuffer[i+1] << 8);
 0146 80E0              ldi R24,<_PageBuffer
 0148 90E0              ldi R25,>_PageBuffer
 014A FA01              movw R30,R20
 014C 3196              adiw R30,1
 014E E80F              add R30,R24
 0150 F91F              adc R31,R25
 0152 2080              ldd R2,z+0
 0154 3324              clr R3
 0156 322C              mov R3,R2
 0158 2224              clr R2
 015A FA01              movw R30,R20
 015C E80F              add R30,R24
 015E F91F              adc R31,R25
 0160 6081              ldd R22,z+0
 0162 7727              clr R23
 0164 620D              add R22,R2
 0166 731D              adc R23,R3
 0168           ;             if (TempInt != TempInt2) return 0;
 0168 0617              cp R16,R22
 016A 1707              cpc R17,R23
 016C 11F0              breq L41
 016E 0027              clr R16
 0170 07C0              rjmp L36
 0172           L41:
 0172           L38:
 0172 4E5F              subi R20,254  ; offset = 2
 0174 5F4F              sbci R21,255
 0176           L40:
 0176 4034              cpi R20,64
 0178 E0E0              ldi R30,0
 017A 5E07              cpc R21,R30
 017C D8F2              brlo L37
 017E           ;     }
 017E           ;     return 1;
 017E 01E0              ldi R16,1
 0180           L36:
 0180 00D0              rcall pop_gset3
 0182                   .dbline 0 ; func end
 0182 0895              ret
 0184           ;       CheckSum -> R22
 0184           ;           Data -> R10
 0184           ;    ByteAddress -> R12,R13
 0184           ; ByteAddressLow -> R22
 0184           ; ByteAddressHigh -> R10
 0184           ;  LocalCheckSum -> R20
                        .even
 0184           _EEpromLoad::
 0184 00D0              rcall push_gset4
 0186           ; }
 0186           ; 
 0186           ; /*****************************************************************************/
 0186           ; /* EEprom Programing Code                                                                                  */
 0186           ; /*****************************************************************************/
 0186           ; 
 0186           ; #ifdef EEPROM
 0186           ; void EEpromLoad()
 0186           ; {
 0186           ; unsigned char ByteAddressHigh;
 0186           ; unsigned char ByteAddressLow;
 0186           ; unsigned int ByteAddress;
 0186           ; unsigned char Data;
 0186           ; unsigned char LocalCheckSum;
 0186           ; unsigned char CheckSum;
 0186           ; 
 0186           ; TxChar(')');
 0186 09E2              ldi R16,41
 0188 51D0              rcall _TxChar
 018A           ; TxChar('!');
 018A 01E2              ldi R16,33
 018C 4FD0              rcall _TxChar
 018E 33C0              rjmp L45
 0190           L44:
 0190           ; while (1)
 0190           ; 	  {
 0190           ; 	  WDR();
 0190 A895              wdr
 0192           ;         LocalCheckSum = 0;
 0192 4427              clr R20
 0194           L47:
 0194           L48:
 0194           ; 	  
 0194           ; 	  while(!IsChar());
 0194 43D0              rcall _IsChar
 0196 0023              tst R16
 0198 E9F3              breq L47
 019A           ;         ByteAddressHigh = RxChar();
 019A 46D0              rcall _RxChar
 019C A02E              mov R10,R16
 019E           ;         LocalCheckSum += ByteAddressHigh;
 019E 400F              add R20,R16
 01A0           L50:
 01A0           L51:
 01A0           ; 	  
 01A0           ; 	  while(!IsChar());
 01A0 3DD0              rcall _IsChar
 01A2 0023              tst R16
 01A4 E9F3              breq L50
 01A6           ;         ByteAddressLow = RxChar();
 01A6 40D0              rcall _RxChar
 01A8 602F              mov R22,R16
 01AA           ;         LocalCheckSum += ByteAddressLow;
 01AA 400F              add R20,R16
 01AC           ;         
 01AC           ;         ByteAddress = (ByteAddressHigh<<8)+ByteAddressLow;
 01AC DA2C              mov R13,R10
 01AE C62E              mov R12,R22
 01B0           ;         
 01B0           ;         if (ByteAddress == 0xffff) return;
 01B0 C601              movw R24,R12
 01B2 8F3F              cpi R24,255
 01B4 EFEF              ldi R30,255
 01B6 9E07              cpc R25,R30
 01B8 09F4              brne L56
 01BA 1EC0              rjmp L43
 01BC           L55:
 01BC           L56:
 01BC           ; 	  
 01BC           ; 	  while(!IsChar());
 01BC 2FD0              rcall _IsChar
 01BE 0023              tst R16
 01C0 E9F3              breq L55
 01C2           ;         Data = RxChar();
 01C2 32D0              rcall _RxChar
 01C4 A02E              mov R10,R16
 01C6           ;         LocalCheckSum += Data;
 01C6 400F              add R20,R16
 01C8           ;         
 01C8           ;         WDR();
 01C8 A895              wdr
 01CA           L58:
 01CA           L59:
 01CA           ; 	  
 01CA           ; 	  while(!IsChar());
 01CA 28D0              rcall _IsChar
 01CC 0023              tst R16
 01CE E9F3              breq L58
 01D0           ;         CheckSum = RxChar();  
 01D0 2BD0              rcall _RxChar
 01D2 602F              mov R22,R16
 01D4           ;         
 01D4           ;         if (CheckSum == LocalCheckSum)        
 01D4 0417              cp R16,R20
 01D6 69F4              brne L61
 01D8           ;                {  
 01D8           ;                EEPROMwrite(ByteAddress, Data);
 01D8 2A2D              mov R18,R10
 01DA 8601              movw R16,R12
 01DC 0FD0              rcall _EEPROMwrite
 01DE           ;                if (EEPROMread(ByteAddress) == Data) TxChar('!');
 01DE 8601              movw R16,R12
 01E0 16D0              rcall _EEPROMread
 01E2 0A15              cp R16,R10
 01E4 19F4              brne L63
 01E6 01E2              ldi R16,33
 01E8 21D0              rcall _TxChar
 01EA 05C0              rjmp L62
 01EC           L63:
 01EC           ; 	  	 else TxChar('@');
 01EC 00E4              ldi R16,64
 01EE 1ED0              rcall _TxChar
 01F0           ;                }
 01F0 02C0              rjmp L62
 01F2           L61:
 01F2           ; 	  else
 01F2           ; 	     {
 01F2           ; 		 TxChar('@');
 01F2 00E4              ldi R16,64
 01F4 1BD0              rcall _TxChar
 01F6           ;                }
 01F6           L62:
 01F6           L45:
 01F6 CCCF              rjmp L44
 01F8           X2:
 01F8           L43:
 01F8 00D0              rcall pop_gset4
 01FA                   .dbline 0 ; func end
 01FA 0895              ret
 01FC           ;           byte -> R18
 01FC           ;       location -> R16,R17
                        .even
 01FC           _EEPROMwrite::
 01FC           ; 	  }
 01FC           ; }
 01FC           ; #endif
 01FC           ; 
 01FC           ; 
 01FC           ; 
 01FC           ; #ifdef EEPROM
 01FC           ; void EEPROMwrite( int location, unsigned char byte)
 01FC           ; {
 01FC           L66:
 01FC           L67:
 01FC           ; while (EECR & 0x02);   // Wait until any earlier write is done
 01FC E199              sbic 0x1c,1
 01FE FECF              rjmp L66
 0200           ; EEAR = location;
 0200 1FBB              out 0x1f,R17
 0202 0EBB              out 0x1e,R16
 0204           ; EEDR = byte;
 0204 2DBB              out 0x1d,R18
 0206           ; EECR |= 0x04;          // Set MASTER WRITE enable
 0206 E29A              sbi 0x1c,2
 0208           ; EECR |= 0x02;          // Set WRITE strobe
 0208 E19A              sbi 0x1c,1
 020A           ; WDR();
 020A A895              wdr
 020C           L65:
 020C                   .dbline 0 ; func end
 020C 0895              ret

⌨️ 快捷键说明

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