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

📄 main.lis

📁 AVRMega16单片机的项目
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 01BC 0296              adiw R24,2
 01BE E62F              mov R30,R22
 01C0 FF27              clr R31
 01C2 E80F              add R30,R24
 01C4 F91F              adc R31,R25
 01C6 0083              std z+0,R16
 01C8           L36:
 01C8 6395              inc R22
 01CA           L38:
 01CA 6431              cpi R22,20
 01CC 68F3              brlo L35
 01CE           ;         {
 01CE           ;                       CmpData[cByteNum] = SPI_ReadPageCtx(curpage, curBlockIndex*20+cByteNum);
 01CE           ;         }
 01CE           ;         
 01CE           ;         cByteNum = memcmp((void *)szBytes, (void *)CmpData, 20);
 01CE 84E1              ldi R24,20
 01D0 90E0              ldi R25,0
 01D2 9983              std y+1,R25
 01D4 8883              std y+0,R24
 01D6 9E01              movw R18,R28
 01D8 2E5F              subi R18,254  ; offset = 2
 01DA 3F4F              sbci R19,255
 01DC 8601              movw R16,R12
 01DE 0E940000          xcall _memcmp
 01E2 602F              mov R22,R16
 01E4           ;         
 01E4           ;         return cByteNum == 0;
 01E4 0023              tst R16
 01E6 19F4              brne L39
 01E8 41E0              ldi R20,1
 01EA 50E0              ldi R21,0
 01EC 02C0              xjmp L40
 01EE           L39:
 01EE 4427              clr R20
 01F0 5527              clr R21
 01F2           L40:
 01F2 042F              mov R16,R20
 01F4           L30:
 01F4 6696              adiw R28,22
 01F6 0E940000          xcall pop_gset5
 01FA                   .dbline 0 ; func end
 01FA 0895              ret
 01FC           ;          cData -> R10
 01FC           ;    oldByteAddr -> R20,R21
 01FC           ;        oldpage -> R22,R23
                        .even
 01FC           _GetHistoryPageAndBytesAddr::
 01FC 0E940000          xcall push_gset3
 0200 A901              movw R20,R18
 0202 B801              movw R22,R16
 0204           ; }
 0204           ; 
 0204           ; //读出前次消费记录的待写FLASH页地址和页内字节地址。
 0204           ; void  GetHistoryPageAndBytesAddr(uint *oldpage, uint *oldByteAddr)
 0204           ; {
 0204           ;       uchar  cData = 0;
 0204 AA24              clr R10
 0206           ;       
 0206           ;         *oldpage = SPI_ReadPageCtx(0, 0);
 0206 2227              clr R18
 0208 3327              clr R19
 020A 0027              clr R16
 020C 1127              clr R17
 020E 0BDF              xcall _SPI_ReadPageCtx
 0210 202E              mov R2,R16
 0212 3324              clr R3
 0214 FB01              movw R30,R22
 0216 3182              std z+1,R3
 0218 2082              std z+0,R2
 021A           ;         cData = SPI_ReadPageCtx(0, 1);
 021A 21E0              ldi R18,1
 021C 30E0              ldi R19,0
 021E 0027              clr R16
 0220 1127              clr R17
 0222 01DF              xcall _SPI_ReadPageCtx
 0224 A02E              mov R10,R16
 0226           ;         
 0226           ;         *oldpage     = *oldpage*256;
 0226 FB01              movw R30,R22
 0228 2081              ldd R18,z+0
 022A 3181              ldd R19,z+1
 022C 00E0              ldi R16,256
 022E 11E0              ldi R17,1
 0230 0E940000          xcall empy16s
 0234 FB01              movw R30,R22
 0236 1183              std z+1,R17
 0238 0083              std z+0,R16
 023A           ;         *oldpage     += cData;
 023A 2A2C              mov R2,R10
 023C 3324              clr R3
 023E 4080              ldd R4,z+0
 0240 5180              ldd R5,z+1
 0242 420C              add R4,R2
 0244 531C              adc R5,R3
 0246 5182              std z+1,R5
 0248 4082              std z+0,R4
 024A           ;         
 024A           ;         *oldByteAddr = SPI_ReadPageCtx(0, 2);
 024A 22E0              ldi R18,2
 024C 30E0              ldi R19,0
 024E 0027              clr R16
 0250 1127              clr R17
 0252 E9DE              xcall _SPI_ReadPageCtx
 0254 202E              mov R2,R16
 0256 3324              clr R3
 0258 FA01              movw R30,R20
 025A 3182              std z+1,R3
 025C 2082              std z+0,R2
 025E           L41:
 025E 0E940000          xcall pop_gset3
 0262                   .dbline 0 ; func end
 0262 0895              ret
 0264           ;    newByteAddr -> y+2
 0264           ;        newPage -> y+0
 0264           ;    oldByteAddr -> R18,R19
 0264           ;        oldpage -> R16,R17
                        .even
 0264           _CalcNextPageAndBytesAddr::
 0264           ; }
 0264           ; 
 0264           ; //计算出下次消费记录的待写FLASH页地址和页内字节地址。
 0264           ; //注意忽略每页的后4个字节,只考虑使用前260个字节,每条记录20个字节。
 0264           ; void  CalcNextPageAndBytesAddr(uint oldpage, uint oldByteAddr, uint *newPage, 
 0264           ; 	  							uint *newByteAddr)
 0264           ; {
 0264           ;  	  *newByteAddr = oldByteAddr +1;
 0264 C901              movw R24,R18
 0266 0196              adiw R24,1
 0268 EA81              ldd R30,y+2
 026A FB81              ldd R31,y+3
 026C 9183              std z+1,R25
 026E 8083              std z+0,R24
 0270           ;       *newPage     = oldpage;
 0270 E881              ldd R30,y+0
 0272 F981              ldd R31,y+1
 0274 1183              std z+1,R17
 0276 0083              std z+0,R16
 0278           ;         
 0278           ;         if (*newByteAddr > 12) //换页时
 0278 8CE0              ldi R24,12
 027A 90E0              ldi R25,0
 027C EA81              ldd R30,y+2
 027E FB81              ldd R31,y+3
 0280 2080              ldd R2,z+0
 0282 3180              ldd R3,z+1
 0284 8215              cp R24,R2
 0286 9305              cpc R25,R3
 0288 60F4              brsh L43
 028A           ;         {
 028A           ;                *newPage  = oldpage + 1;
 028A C801              movw R24,R16
 028C 0196              adiw R24,1
 028E E881              ldd R30,y+0
 0290 F981              ldd R31,y+1
 0292 9183              std z+1,R25
 0294 8083              std z+0,R24
 0296           ;                *newByteAddr = 0;
 0296 2224              clr R2
 0298 3324              clr R3
 029A EA81              ldd R30,y+2
 029C FB81              ldd R31,y+3
 029E 3182              std z+1,R3
 02A0 2082              std z+0,R2
 02A2           ;         }
 02A2           L43:
 02A2           L42:
 02A2                   .dbline 0 ; func end
 02A2 0895              ret
 02A4           ;           data -> R16
                        .even
 02A4           _i2cSendByte::
 02A4           ; }
 02A4           ; 
 02A4           ; 
 02A4           ; 
 02A4           ; 
 02A4           ; 
 02A4           ; 
 02A4           ; 
 02A4           ; /******************************************************************************* 
 02A4           ; **            与I2C通信的子程序 
 02A4           ; *******************************************************************************/
 02A4           ; void i2cSendByte(uchar data) 
 02A4           ; { 
 02A4           ;    	// 装载数据到 TWDR 
 02A4           ;    	TWDR=data; 
 02A4 03B9              out 0x3,R16
 02A6           ;       // 发送开始 
 02A6           ;       TWCR = (TWCR&0x0F)|(1<<TWINT); 
 02A6 86B7              in R24,0x36
 02A8 8F70              andi R24,15
 02AA 8068              ori R24,128
 02AC 86BF              out 0x36,R24
 02AE           L45:
 02AE                   .dbline 0 ; func end
 02AE 0895              ret
                        .even
 02B0           _i2cSendStart::
 02B0           ; }
 02B0           ; 
 02B0           ; // 发送开始信号
 02B0           ; void i2cSendStart(void) 
 02B0           ; {   
 02B0           ;  	TWCR = (TWCR&0x0F)|(1<<TWINT)|(1<<TWSTA); 
 02B0 86B7              in R24,0x36
 02B2 8F70              andi R24,15
 02B4 806A              ori R24,160
 02B6 86BF              out 0x36,R24
 02B8           L46:
 02B8                   .dbline 0 ; func end
 02B8 0895              ret
                        .even
 02BA           _i2cSendStop::
 02BA           ; }
 02BA           ; 
 02BA           ; // 发送停止信号
 02BA           ; void i2cSendStop(void) 
 02BA           ; { 
 02BA           ;     TWCR = (TWCR&0x0F)|(1<<TWINT)|(1<<TWEA)|(1<<TWSTO); 
 02BA 86B7              in R24,0x36
 02BC 8F70              andi R24,15
 02BE 806D              ori R24,208
 02C0 86BF              out 0x36,R24
 02C2           L47:
 02C2                   .dbline 0 ; func end
 02C2 0895              ret
 02C4           ;        ackFlag -> R16
                        .even
 02C4           _i2cAckSignal::
 02C4           ; }
 02C4           ; 
 02C4           ; // 产生应答信号否
 02C4           ; void i2cAckSignal(uchar ackFlag) 
 02C4           ; { 
 02C4           ;    if( ackFlag )
 02C4 0023              tst R16
 02C6 29F0              breq L49
 02C8           ;        TWCR = (TWCR&0x0F)|(1<<TWINT)|(1<<TWEA); 
 02C8 86B7              in R24,0x36
 02CA 8F70              andi R24,15
 02CC 806C              ori R24,192
 02CE 86BF              out 0x36,R24
 02D0 04C0              xjmp L50
 02D2           L49:
 02D2           ;    else
 02D2           ;        TWCR = (TWCR&0x0F)|(1<<TWINT);
 02D2 86B7              in R24,0x36
 02D4 8F70              andi R24,15
 02D6 8068              ori R24,128
 02D8 86BF              out 0x36,R24
 02DA           L50:
 02DA           L48:
 02DA                   .dbline 0 ; func end
 02DA 0895              ret
 02DC           ;            num -> y+8
 02DC           ;         szBuff -> y+6
 02DC           ;           suba -> R20
 02DC           ;           wsla -> R22
                        .even
 02DC           _I2C_SendInfo::
 02DC 0E940000          xcall push_gset2
 02E0 422F              mov R20,R18
 02E2 602F              mov R22,R16
 02E4 2297              sbiw R28,2
 02E6           ; }
 02E6           ; 
 02E6           ; //向I2C器件发送字符串
 02E6           ; void I2C_SendInfo(uchar wsla, uchar suba, uchar *szBuff, uchar num)
 02E6           ; {
 02E6           ;      I2cSendData[0] = wsla;
 02E6 60930000          sts _I2cSendData,R22
 02EA           ;        I2cSendData[1] = suba;
 02EA 40930100          sts _I2cSendData+1,R20
 02EE           ;        if (num > 0)
 02EE 2224              clr R2
 02F0 0884              ldd R0,y+8
 02F2 2014              cp R2,R0
 02F4 50F4              brsh L53
 02F6           ;        memcpy((void *)&I2cSendData[2], (void *)szBuff, num);
 02F6 202C              mov R2,R0
 02F8 3324              clr R3
 02FA 3982              std y+1,R3
 02FC 2882              std y+0,R2
 02FE 2E81              ldd R18,y+6
 0300 3F81              ldd R19,y+7
 0302 00E0              ldi R16,<_I2cSendData+2
 0304 10E0              ldi R17,>_I2cSendData+2
 0306 0E940000          xcall _memcpy
 030A           L53:
 030A           ; 	 
 030A           ;      I2cSendDataLength = num+1;
 030A 8885              ldd R24,y+8
 030C 8F5F              subi R24,255    ; addi 1
 030E 80930500          sts _I2cSendDataLength,R24
 0312           ;      I2cSendDataIndex  = 0;    //从从地址开始计算
 0312 2224              clr R2
 0314 20920400          sts _I2cSendDataIndex,R2
 0318           ;      
 0318           ;        //启动I2C传送
 0318           ;        i2cSendStart();
 0318 CBDF              xcall _i2cSendStart
 031A           L51:
 031A 2296              adiw R28,2
 031C 0E940000          xcall pop_gset2
 0320                   .dbline 0 ; func end
 0320 0895              ret
 0322           ;            num -> y+6
 0322           ;         szBuff -> y+4

⌨️ 快捷键说明

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