📄 main.lis
字号:
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 + -