📄 main.lis
字号:
005E 462F mov R20,R22
0060 5070 andi R21,0
0062 ; SPI_MasterTransmit(cData);//byte Addr High,4th
0062 042F mov R16,R20
0064 DCDF xcall _SPI_MasterTransmit
0066 ;
0066 ; //空命令,凑足剩余4字节
0066 ; SPI_MasterTransmit(0);
0066 0027 clr R16
0068 DADF xcall _SPI_MasterTransmit
006A ; SPI_MasterTransmit(0);
006A 0027 clr R16
006C D8DF xcall _SPI_MasterTransmit
006E ; SPI_MasterTransmit(0);
006E 0027 clr R16
0070 D6DF xcall _SPI_MasterTransmit
0072 ; SPI_MasterTransmit(0);
0072 0027 clr R16
0074 D4DF xcall _SPI_MasterTransmit
0076 L15:
0076 L16:
0076 ;
0076 ; /* 等待传输结束 */
0076 ; while(!(SPSR & (1<<SPIF)));
0076 779B sbis 0xe,7
0078 FECF rjmp L15
007A ; cData = SPDR;
007A 4FB1 in R20,0xf
007C ;
007C ; SETBIT(PORTB,4);
007C C49A sbi 0x18,4
007E ; return cData;
007E 042F mov R16,R20
0080 L14:
0080 0E940000 xcall pop_gset3
0084 .dbline 0 ; func end
0084 0895 ret
0086 ; cData -> R20
0086 ; cByte -> y+6
0086 ; byteAddr -> R22,R23
0086 ; page -> R10,R11
.even
0086 _SPI_WritePageCtx::
0086 0E940000 xcall push_gset3
008A B901 movw R22,R18
008C 5801 movw R10,R16
008E ; }
008E ;
008E ; //写入某页内某字节地址的命令
008E ; void SPI_WritePageCtx(uint page/*0~4095*/, uint byteAddr/*0~263*/, uchar cByte)
008E ; {
008E ; uchar cData =0;
008E 4427 clr R20
0090 ;
0090 ; CLRBIT(PORTB,4);
0090 C498 cbi 0x18,4
0092 ;
0092 ; //把数据写入Buffer1
0092 ; SPI_MasterTransmit(0x84); //CMD, 1st
0092 04E8 ldi R16,132
0094 C4DF xcall _SPI_MasterTransmit
0096 ; SPI_MasterTransmit(0); //Not Care
0096 0027 clr R16
0098 C2DF xcall _SPI_MasterTransmit
009A ;
009A ; cData |= (char)((byteAddr & 0x100)>>8);
009A CB01 movw R24,R22
009C 8070 andi R24,0
009E 9170 andi R25,1
00A0 892F mov R24,R25
00A2 9927 clr R25
00A4 482B or R20,R24
00A6 ; SPI_MasterTransmit(cData);//Byte Addr High,3rd
00A6 042F mov R16,R20
00A8 BADF xcall _SPI_MasterTransmit
00AA ;
00AA ; cData = (char)(byteAddr & 0xFF);
00AA 462F mov R20,R22
00AC 5070 andi R21,0
00AE ; SPI_MasterTransmit(cData);//Byte Addr High,4th
00AE 042F mov R16,R20
00B0 B6DF xcall _SPI_MasterTransmit
00B2 ;
00B2 ; //传输字节
00B2 ; SPI_MasterTransmit(cByte);//Byte Data
00B2 0E81 ldd R16,y+6
00B4 B4DF xcall _SPI_MasterTransmit
00B6 ;
00B6 ; SETBIT(PORTB,4);
00B6 C49A sbi 0x18,4
00B8 L18:
00B8 0E940000 xcall pop_gset3
00BC .dbline 0 ; func end
00BC 0895 ret
00BE ; bResult -> R22
00BE ; page -> R10
00BE ; cData -> R20
.even
00BE _EraseFlashCtx::
00BE 0E940000 xcall push_gset4
00C2 ; }
00C2 ;
00C2 ; //擦除FLASH芯片所有内容
00C2 ; char EraseFlashCtx(void)
00C2 ; {
00C2 ; uchar bResult = 1;
00C2 61E0 ldi R22,1
00C4 ; uchar cData = 0;
00C4 4427 clr R20
00C6 ; char page = 0;
00C6 AA24 clr R10
00C8 ;
00C8 ; CLRBIT(PORTB,4);
00C8 C498 cbi 0x18,4
00CA ;
00CA ; for (page =0; page<4096; page++)
00CA 2BC0 xjmp L23
00CC L20:
00CC ; {
00CC ; SPI_MasterTransmit(0x58); //CMD, 1st
00CC 08E5 ldi R16,88
00CE A7DF xcall _SPI_MasterTransmit
00D0 ; cData = 0x1F & ((char)(page>>7));
00D0 27E0 ldi R18,7
00D2 30E0 ldi R19,0
00D4 0A2D mov R16,R10
00D6 1127 clr R17
00D8 0E940000 xcall asr16
00DC 402F mov R20,R16
00DE 4F71 andi R20,31
00E0 ; SPI_MasterTransmit(cData);//Page Addr High,2nd
00E0 042F mov R16,R20
00E2 9DDF xcall _SPI_MasterTransmit
00E4 ;
00E4 ; cData = ((char)(page>>7))<<1;
00E4 27E0 ldi R18,7
00E6 30E0 ldi R19,0
00E8 0A2D mov R16,R10
00EA 1127 clr R17
00EC 0E940000 xcall asr16
00F0 402F mov R20,R16
00F2 440F lsl R20
00F4 ; SPI_MasterTransmit(cData);//Page Addr low,3rd
00F4 042F mov R16,R20
00F6 93DF xcall _SPI_MasterTransmit
00F8 ;
00F8 ; SPI_MasterTransmit(0); //not care
00F8 0027 clr R16
00FA 91DF xcall _SPI_MasterTransmit
00FC ;
00FC ; //读取状态寄存器
00FC ; SPI_MasterTransmit(0x57);
00FC 07E5 ldi R16,87
00FE 8FDF xcall _SPI_MasterTransmit
0100 L24:
0100 L25:
0100 ;
0100 ; /* 等待传输结束 */
0100 ; while(!(SPSR & (1<<SPIF)));
0100 779B sbis 0xe,7
0102 FECF rjmp L24
0104 ; cData = SPDR;
0104 4FB1 in R20,0xf
0106 ;
0106 ; cData &= 0x40;
0106 4074 andi R20,64
0108 ; bResult &= (cData == 0);
0108 21F4 brne L27
010A 81E0 ldi R24,1
010C 90E0 ldi R25,0
010E 6C01 movw R12,R24
0110 02C0 xjmp L28
0112 L27:
0112 CC24 clr R12
0114 DD24 clr R13
0116 L28:
0116 262E mov R2,R22
0118 3324 clr R3
011A 2C20 and R2,R12
011C 3D20 and R3,R13
011E 622D mov R22,R2
0120 L21:
0120 A394 inc R10
0122 L23:
0122 8A2D mov R24,R10
0124 8030 cpi R24,0
0126 94F2 brlt L20
0128 ; }
0128 ;
0128 ; SETBIT(PORTB,4);
0128 C49A sbi 0x18,4
012A ; return bResult;
012A 062F mov R16,R22
012C L19:
012C 0E940000 xcall pop_gset4
0130 .dbline 0 ; func end
0130 0895 ret
0132 ; curBlockIndex -> R20
0132 ; curpage -> R22,R23
.even
0132 _WriteContextInfo::
0132 0E940000 xcall push_gset2
0136 422F mov R20,R18
0138 B801 movw R22,R16
013A 2197 sbiw R28,1
013C ; }
013C ;
013C ; //向FLASH中写入已使用的总页数和字节数,或下一个页数和字节地址
013C ; void WriteContextInfo(uint curpage/*当前页地址*/,
013C ; uchar curBlockIndex/*当前页内字节块的索引号*/)
013C ; {
013C ; //页地址高字节和低字节(范围:22..4095),20个字节的倍数(范围:0..12)
013C ; SPI_WritePageCtx(0, 0, (uchar)(curpage>>8));
013C 1B01 movw R2,R22
013E 232C mov R2,R3
0140 3324 clr R3
0142 2882 std y+0,R2
0144 2227 clr R18
0146 3327 clr R19
0148 0027 clr R16
014A 1127 clr R17
014C 9CDF xcall _SPI_WritePageCtx
014E ; SPI_WritePageCtx(0, 1, (uchar)(curpage&0xFF));
014E CB01 movw R24,R22
0150 9070 andi R25,0
0152 8883 std y+0,R24
0154 21E0 ldi R18,1
0156 30E0 ldi R19,0
0158 0027 clr R16
015A 1127 clr R17
015C 94DF xcall _SPI_WritePageCtx
015E ; SPI_WritePageCtx(0, 2, curBlockIndex);
015E 4883 std y+0,R20
0160 22E0 ldi R18,2
0162 30E0 ldi R19,0
0164 0027 clr R16
0166 1127 clr R17
0168 8EDF xcall _SPI_WritePageCtx
016A L29:
016A 2196 adiw R28,1
016C 0E940000 xcall pop_gset2
0170 .dbline 0 ; func end
0170 0895 ret
0172 ; CmpData -> y+2
0172 ; cByteNum -> R22
0172 ; num -> y+34
0172 ; szBytes -> R12,R13
0172 ; curBlockIndex -> R14
0172 ; curpage -> R10,R11
.even
0172 _CommitPaidSuccess::
0172 0E940000 xcall push_gset5
0176 E22E mov R14,R18
0178 5801 movw R10,R16
017A 6697 sbiw R28,22
017C C8A0 ldd R12,y+32
017E D9A0 ldd R13,y+33
0180 ; }
0180 ;
0180 ; //确认当前消费记录写操作成功,完成写入和读出的记录钱数要相等。
0180 ; //成功:1, 失败:0。
0180 ; char CommitPaidSuccess(uint curpage/*当前页地址*/,
0180 ; uchar curBlockIndex/*当前页内字节块的索引号*/, uchar *szBytes, uchar num)
0180 ; {
0180 ; char cByteNum = 0;
0180 6627 clr R22
0182 ; uchar CmpData[20];
0182 ;
0182 ; //先写入当前的记录
0182 ; for (cByteNum = 0; cByteNum<20; cByteNum++)
0182 0EC0 xjmp L34
0184 L31:
0184 F601 movw R30,R12
0186 2190 ld R2,Z+
0188 6F01 movw R12,R30
018A 2882 std y+0,R2
018C 84E1 ldi R24,20
018E 8E9D mul R24,R14
0190 9001 movw R18,R0
0192 262E mov R2,R22
0194 3324 clr R3
0196 220D add R18,R2
0198 331D adc R19,R3
019A 8501 movw R16,R10
019C 74DF xcall _SPI_WritePageCtx
019E L32:
019E 6395 inc R22
01A0 L34:
01A0 6431 cpi R22,20
01A2 80F3 brlo L31
01A4 ; {
01A4 ; SPI_WritePageCtx(curpage, curBlockIndex*20+cByteNum, *szBytes++);
01A4 ; }
01A4 ;
01A4 ; //再读出当前消费记录
01A4 ; for (cByteNum = 0; cByteNum<20; cByteNum++)
01A4 6627 clr R22
01A6 11C0 xjmp L38
01A8 L35:
01A8 84E1 ldi R24,20
01AA 8E9D mul R24,R14
01AC 9001 movw R18,R0
01AE 262E mov R2,R22
01B0 3324 clr R3
01B2 220D add R18,R2
01B4 331D adc R19,R3
01B6 8501 movw R16,R10
01B8 36DF xcall _SPI_ReadPageCtx
01BA CE01 movw R24,R28
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -