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

📄 main.lis

📁 AVRMega16单片机的项目
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 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 + -