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