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

📄 main.lis

📁 AVRMega16单片机的项目
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 046E 8FE8              ldi R24,143
 0470 83BD              out 0x23,R24
 0472           ;       
 0472           ;       gTmr2OvrCount = _20ms;
 0472 10930C00          sts _gTmr2OvrCount+1,R17
 0476 00930B00          sts _gTmr2OvrCount,R16
 047A           ;       
 047A           ;       TCCR2 = 0x07;           // Count clock/1024, start Timer0
 047A 87E0              ldi R24,7
 047C 85BD              out 0x25,R24
 047E           L77:
 047E                   .dbline 0 ; func end
 047E 0895              ret
                        .even
 0480           _stop_time2::
 0480           ; }
 0480           ; 
 0480           ; /**********************************************************************
 0480           ; functionName:void stop_time2(void)
 0480           ; description:停止定时器2
 0480           ; **********************************************************************/
 0480           ; void stop_time2(void)
 0480           ; {
 0480           ;     TCCR0 = 0x00; //stop
 0480 2224              clr R2
 0482 23BE              out 0x33,R2
 0484           ;       
 0484           ;     gTmr2OvrCount = 0;  
 0484 3324              clr R3
 0486 30920C00          sts _gTmr2OvrCount+1,R3
 048A 20920B00          sts _gTmr2OvrCount,R2
 048E           L78:
 048E                   .dbline 0 ; func end
 048E 0895              ret
 0490           ;       cKeyCode -> R22
 0490           ;           sak1 -> y+71
 0490           ;        tempbuf -> y+66
 0490           ;      M41T0Data -> y+58
 0490           ;            tt1 -> y+56
 0490           ;       OpCardOk -> R10
 0490           ;      blockdata -> y+40
 0490           ;      leftMoney -> R12,R13
 0490           ;   CurrTimeInfo -> y+28
 0490           ;   cardserialno -> y+24
 0490           ;     statusOfIC -> R14
 0490           ; szRecordInfoBytes -> y+4
 0490           ;        counter -> R20
                        .even
 0490           _main::
 0490 EF97              sbiw R28,63
 0492 2A97              sbiw R28,10  ; offset = 73
 0494           ; }
 0494           ; 
 0494           ; 
 0494           ; 
 0494           ; 
 0494           ; 
 0494           ; 
 0494           ; 
 0494           ; 
 0494           ; 
 0494           ; 
 0494           ; 
 0494           ; 
 0494           ; 
 0494           ; /**********************************************************************
 0494           ; functionName:void main(void)
 0494           ; description:主函数
 0494           ; **********************************************************************/
 0494           ; void main(void)
 0494           ; {
 0494           ;         uchar counter;
 0494           ;       char  tempbuf[5];
 0494           ;         
 0494           ;         //键盘
 0494           ;         uchar cKeyCode = 0;     
 0494 6627              clr R22
 0496           ;         
 0496           ;         uchar tt1[2];
 0496           ;         uchar statusOfIC;
 0496           ;       
 0496           ;         //寻射频卡号和扇区的某数据块缓冲
 0496           ;         uchar cardserialno[4];
 0496           ;         uchar *sak1;
 0496           ;         uchar blockdata[16];
 0496           ;         
 0496           ;         //卡内剩余金额
 0496           ;         uint  leftMoney = 0;
 0496 CC24              clr R12
 0498 DD24              clr R13
 049A           ;         
 049A           ;         //从M41T0器件中读取的当前时间信息
 049A           ;         uchar M41T0Data[8];
 049A           ;         uchar CurrTimeInfo[12];
 049A           ;         
 049A           ;         //完整的一条消费信息字节
 049A           ;         uchar szRecordInfoBytes[20];
 049A           ;         //卡消费成功标志
 049A           ;         uchar OpCardOk = 0;
 049A AA24              clr R10
 049C           ;         
 049C           ;         
 049C           ;         
 049C           ;         
 049C           ;         
 049C           ;         ///////////////////////////////////////////////////////////////////
 049C           ;         //初始化硬件资源
 049C           ;         all_init();
 049C 0E940000          xcall _all_init
 04A0           ;         
 04A0           ;         //得到FLASH的历史数据页号和字节地址
 04A0           ;         GetHistoryPageAndBytesAddr(&gnHistoryFlashPage, &gnHistoryBytesBlock);
 04A0 20E0              ldi R18,<_gnHistoryBytesBlock
 04A2 30E0              ldi R19,>_gnHistoryBytesBlock
 04A4 00E0              ldi R16,<_gnHistoryFlashPage
 04A6 10E0              ldi R17,>_gnHistoryFlashPage
 04A8 A9DE              xcall _GetHistoryPageAndBytesAddr
 04AA 25C1              xjmp L81
 04AC           L80:
 04AC           ; 	  
 04AC           ;       while(1)
 04AC           ;       {			
 04AC           ; 	           ////////////////////////////////////////////////////////   
 04AC           ; 			   //当有用户选择用水模式时
 04AC           ; 			   if (cKeyRiseEvent == 1)
 04AC 80910D00          lds R24,_cKeyRiseEvent
 04B0 8130              cpi R24,1
 04B2 09F0              breq X2
 04B4 0BC1              xjmp L83
 04B6           X2:
 04B6           ; 			   {  
 04B6           ; 			       //屏蔽int1、int0中断和UART中断,定时器Timer0,Timer2仍开始
 04B6           ; 				   DISINT01INT()
 04B6 8BB7              in R24,0x3b
 04B8 8F7B              andi R24,191
 04BA 8BBF              out 0x3b,R24
 04BC 8BB7              in R24,0x3b
 04BE 8F77              andi R24,127
 04C0 8BBF              out 0x3b,R24
 04C2           ;                                  DISRXINT()
 04C2 579A              sbi 0xa,7
 04C4           ;                                  
 04C4           ;                                  //清除用水标记
 04C4           ;                              cKeyRiseEvent = 0;
 04C4 2224              clr R2
 04C6 20920D00          sts _cKeyRiseEvent,R2
 04CA           ;                                  
 04CA           ;                                  //判断出出水模式
 04CA           ;                      cKeyCode = Zlg7290_ReadKey();                               
 04CA 62DF              xcall _Zlg7290_ReadKey
 04CC 602F              mov R22,R16
 04CE           ;                                  
 04CE           ;                                  //启动定时器0,等待5秒内刷卡
 04CE           ;                                  start_timer0(2000);
 04CE 00ED              ldi R16,2000
 04D0 17E0              ldi R17,7
 04D2 ADDF              xcall _start_timer0
 04D4 F0C0              xjmp L86
 04D6           L85:
 04D6           ; 				   
 04D6           ; 				   //若超时
 04D6           ; 				   while (gTmr0OvrCount>0)
 04D6           ; 				   {
 04D6           ; 				        M500PcdConfig();  	        // Initialise the RC500 must be call in the initialisation
 04D6 0E940000          xcall _M500PcdConfig
 04DA           ;                                           PcdReadE2(8, 4, Snr_RC500);  // Read out the MFRC500 serial number and store it
 04DA 80E0              ldi R24,<_Snr_RC500
 04DC 90E0              ldi R25,>_Snr_RC500
 04DE 9983              std y+1,R25
 04E0 8883              std y+0,R24
 04E2 24E0              ldi R18,4
 04E4 08E0              ldi R16,8
 04E6 10E0              ldi R17,0
 04E8 0E940000          xcall _PcdReadE2
 04EC           ;                                           M500PcdMfOutSelect(2);   // 设定MFOut管教的信号类型
 04EC 02E0              ldi R16,2
 04EE 0E940000          xcall _M500PcdMfOutSelect
 04F2           ;                                           
 04F2           ;                                   statusOfIC = M500PiccRequest(PICC_REQALL, tt1);      //寻卡
 04F2 9E01              movw R18,R28
 04F4 285C              subi R18,200  ; offset = 56
 04F6 3F4F              sbci R19,255
 04F8 02E5              ldi R16,82
 04FA 0E940000          xcall _M500PiccRequest
 04FE E02E              mov R14,R16
 0500           ;       
 0500           ;                                   if (statusOfIC == MI_OK)
 0500 0023              tst R16
 0502 39F4              brne L88
 0504           ;                                          statusOfIC = M500PiccAnticoll(0,cardserialno); //取第1卡
 0504 9E01              movw R18,R28
 0506 285E              subi R18,232  ; offset = 24
 0508 3F4F              sbci R19,255
 050A 0027              clr R16
 050C 0E940000          xcall _M500PiccAnticoll
 0510 E02E              mov R14,R16
 0512           L88:
 0512           ; 	
 0512           ; 	  		       	    if (statusOfIC == MI_OK)
 0512 EE20              tst R14
 0514 59F4              brne L90
 0516           ;                                  statusOfIC = M500PiccSelect(cardserialno,sak1);//选中卡号
 0516 FE01              movw R30,R28
 0518 E95B              subi R30,185  ; addi 71
 051A FF4F              sbci R31,255
 051C 2081              ldd R18,z+0
 051E 3181              ldd R19,z+1
 0520 8E01              movw R16,R28
 0522 085E              subi R16,232  ; offset = 24
 0524 1F4F              sbci R17,255
 0526 0E940000          xcall _M500PiccSelect
 052A E02E              mov R14,R16
 052C           L90:
 052C           ; 	
 052C           ; 	  		       	    if (statusOfIC == MI_OK)							 //安全验证
 052C EE20              tst R14
 052E 59F4              brne L92
 0530           ;                                          statusOfIC = M500PiccAuth(PICC_AUTHENT1A, cardserialno, 1, 4);
 0530 84E0              ldi R24,4
 0532 8A83              std y+2,R24
 0534 81E0              ldi R24,1
 0536 8883              std y+0,R24
 0538 9E01              movw R18,R28
 053A 285E              subi R18,232  ; offset = 24
 053C 3F4F              sbci R19,255
 053E 00E6              ldi R16,96
 0540 0E940000          xcall _M500PiccAuth
 0544 E02E              mov R14,R16
 0546           L92:
 0546           ; 	
 0546           ; 	  	           		if (statusOfIC == MI_OK)
 0546 EE20              tst R14
 0548 39F4              brne L94
 054A           ;                                  statusOfIC = M500PiccRead(4, blockdata);                                                
 054A 9E01              movw R18,R28
 054C 285D              subi R18,216  ; offset = 40
 054E 3F4F              sbci R19,255
 0550 04E0              ldi R16,4
 0552 0E940000          xcall _M500PiccRead
 0556 E02E              mov R14,R16
 0558           L94:
 0558           ; 						 
 0558           ; 						//RC500得到IC卡号后
 0558           ; 						if (statusOfIC == MI_OK)
 0558 EE20              tst R14
 055A 09F0              breq X3
 055C A4C0              xjmp L96
 055E           X3:
 055E           ; 						{
 055E           ; 						  		//计算IC卡余额
 055E           ; 						        leftMoney = blockdata[0];
 055E C8A4              ldd R12,y+40
 0560 DD24              clr R13
 0562           ;                                                               leftMoney = leftMoney<<8+blockdata[1];
 0562 29A5              ldd R18,y+41
 0564 3327              clr R19
 0566 285F              subi R18,248  ; offset = 8
 0568 3F4F              sbci R19,255
 056A 8601              movw R16,R12
 056C 0E940000          xcall lsl16
 0570 6801              movw R12,R16
 0572           ;                                                               
 0572           ;                                                               //检查余额是否还够消费
 0572           ;                                                               if (leftMoney < 50) //蜂鸣器响2次
 0572 0233              cpi R16,50
 0574 E0E0              ldi R30,0
 0576 1E07              cpc R17,R30
 0578 40F4              brsh L99
 057A           ;                                                       {
 057A           ;                                                                               SETBIT(PORTD,6);
 057A 969A              sbi 0x12,6
 057C           ;                                                                               SoftDelay();//每次循环延时0.8秒
 057C 41DD              xcall _SoftDelay
 057E           ;                                                                               CLRBIT(PORTD,6);
 057E 9698              cbi 0x12,6
 0580           ;                                                                               
 0580           ;                                                                               SoftDelay();
 0580 3FDD              xcall _SoftDelay
 0582           ;                                                                               SETBIT(PORTD,6);
 0582 969A              sbi 0x12,6
 0584           ;                                                                               
 0584           ;                                                                               SoftDelay();
 0584 3DDD              xcall _SoftDelay
 0586           ;                                                                               CLRBIT(PORTD,6);
 0586 9698              cbi 0x12,6
 0588           ;                                                                               break;
 0588 A0C0              xjmp L87
 058A           L99:
 058A           ; 								}
 058A           ; 								
 058A           ; 								//扣除IC卡余额
 058A           ; 							    leftMoney   -= 50;
 058A C601              movw R24,R12
 058C C297              sbiw R24,50
 058E 6C01              movw R12,R24
 0590           ;                                           blockdata[0] = (uchar)((leftMoney&0xFF00)>>8);
 0590 8070              andi R24,0
 0592 892F              mov R24,R25
 0594 9927              clr R25
 0596 88A7              std y+40,R24
 0598           ;                                                               blockdata[1] = leftMoney&0xFF;
 0598 C601              movw R24,R12
 059A 9070              andi R25,0
 059C 89A7              std y+41,R24
 059E           ;                                                               
 059E           ;                                                       //根据卡号、金额和时间形成完整一个消

⌨️ 快捷键说明

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