📄 ic_card.lst
字号:
__start:
__text_start:
0170 E5CF LDI R28,0x5F
0171 E0D4 LDI R29,4
0172 BFCD OUT 0x3D,R28
0173 BFDE OUT 0x3E,R29
0174 51C0 SUBI R28,0x10
0175 40D0 SBCI R29,0
0176 EA0A LDI R16,0xAA
0177 8308 STD Y+0,R16
0178 2400 CLR R0
0179 E5EB LDI R30,0x5B
017A E0F2 LDI R31,2
017B E012 LDI R17,2
017C 35EB CPI R30,0x5B
017D 07F1 CPC R31,R17
017E F011 BEQ 0x0181
017F 9201 ST R0,Z+
0180 CFFB RJMP 0x017C
0181 8300 STD Z+0,R16
0182 EEE4 LDI R30,0xE4
0183 E0F0 LDI R31,0
0184 E6A0 LDI R26,0x60
0185 E0B0 LDI R27,0
0186 E012 LDI R17,2
0187 3DEF CPI R30,0xDF
0188 07F1 CPC R31,R17
0189 F021 BEQ 0x018E
018A 95C8 LPM
018B 9631 ADIW R30,1
018C 920D ST R0,X+
018D CFF9 RJMP 0x0187
018E D4A9 RCALL _main
_exit:
018F CFFF RJMP _exit
_Balance_dis:
Balance --> R20
IC_Balance --> Y+0
j --> R22
i --> R10
flag --> R12
0190 D93F RCALL push_gset4
0191 9724 SBIW R28,4
FILE: D:\PROGRA~1\ICC\Pro(AVR)\环保型IC卡门禁系统\Card_Verify.C
(0001)
(0002) #include <iom8v.h>
(0003) #include <macros.h>
(0004) #include "lcd1602.h"
(0005)
(0006) unsigned char Card_ID = 0 ;
(0007)
(0008) void Balance_dis(void)
(0009) {
(0010) unsigned char i = 0 , j = 0 , flag = 0 , IC_Balance[4] = { 0 } ;
0192 24AA CLR R10
0193 2766 CLR R22
0194 24CC CLR R12
0195 E488 LDI R24,0x48
0196 E090 LDI R25,0
0197 01FE MOVW R30,R28
0198 E004 LDI R16,4
0199 E010 LDI R17,0
019A 93FA ST R31,-Y
019B 93EA ST R30,-Y
019C 939A ST R25,-Y
019D 938A ST R24,-Y
019E D954 RCALL asgncblk
(0011)
(0012) unsigned int Balance = 0 ; // 余额变量
019F 2744 CLR R20
01A0 2755 CLR R21
(0013)
(0014) for(i=0;i<4;i++)
01A1 C01B RJMP 0x01BD
(0015) {
(0016) flag=0x01 ;
01A2 24CC CLR R12
01A3 94C3 INC R12
(0017) for(j=0;j<8;j++)
01A4 2766 CLR R22
01A5 C014 RJMP 0x01BA
(0018) { // 计算出IC_Value[4]中每个字节中有多少位为1
(0019) if((IC_Codes_8[9+i]&flag)!=0) // 并记在IC_Balance[4]数组中
01A6 E382 LDI R24,0x32
01A7 E092 LDI R25,2
01A8 2DEA MOV R30,R10
01A9 27FF CLR R31
01AA 0FE8 ADD R30,R24
01AB 1FF9 ADC R31,R25
01AC 8020 LDD R2,Z+0
01AD 202C AND R2,R12
01AE F049 BEQ 0x01B8
(0020) {
(0021) IC_Balance[i]++ ;
01AF 01CE MOVW R24,R28
01B0 2C2A MOV R2,R10
01B1 2433 CLR R3
01B2 0E28 ADD R2,R24
01B3 1E39 ADC R3,R25
01B4 01F1 MOVW R30,R2
01B5 8180 LDD R24,Z+0
01B6 5F8F SUBI R24,0xFF
01B7 8380 STD Z+0,R24
(0022) }
(0023) flag=flag<<1;
01B8 0CCC LSL R12
01B9 9563 INC R22
01BA 3068 CPI R22,0x8
01BB F350 BCS 0x01A6
01BC 94A3 INC R10
01BD 2D8A MOV R24,R10
01BE 3084 CPI R24,4
01BF F310 BCS 0x01A2
(0024) }
(0025) }
(0026)
(0027) /**************计算出卡内金钱的单元数(一个单元对应0.1元)********************/
(0028) Balance = IC_Balance[0]*512 + IC_Balance[1]*64 + IC_Balance[2]*8 +IC_Balance[3] ;
01C0 8029 LDD R2,Y+1
01C1 E480 LDI R24,0x40
01C2 9D82 MUL R24,R2
01C3 0110 MOVW R2,R0
01C4 8128 LDD R18,Y+0
01C5 2733 CLR R19
01C6 E000 LDI R16,0
01C7 E012 LDI R17,2
01C8 D8ED RCALL empy16s
01C9 01A8 MOVW R20,R16
01CA 0D42 ADD R20,R2
01CB 1D53 ADC R21,R3
01CC 802A LDD R2,Y+2
01CD E088 LDI R24,0x8
01CE 9D82 MUL R24,R2
01CF 0D40 ADD R20,R0
01D0 1D51 ADC R21,R1
01D1 802B LDD R2,Y+3
01D2 2433 CLR R3
01D3 0D42 ADD R20,R2
01D4 1D53 ADC R21,R3
(0029) IC_Balance[0] = Balance / 1000 ; // 计算出卡内金钱的单元数的千位
01D5 EE28 LDI R18,0xE8
01D6 E033 LDI R19,3
01D7 018A MOVW R16,R20
01D8 D8AB RCALL div16u
01D9 8308 STD Y+0,R16
(0030) IC_Balance[1] = ( Balance / 100 ) % 10 ; // 计算出卡内金钱的单元数的百位
01DA E624 LDI R18,0x64
01DB E030 LDI R19,0
01DC 018A MOVW R16,R20
01DD D8A6 RCALL div16u
01DE E02A LDI R18,0xA
01DF E030 LDI R19,0
01E0 D8A1 RCALL mod16u
01E1 8309 STD Y+1,R16
(0031) IC_Balance[2] = ( Balance / 10 ) % 10 ; // 计算出卡内金钱的单元数的十位
01E2 E02A LDI R18,0xA
01E3 E030 LDI R19,0
01E4 018A MOVW R16,R20
01E5 D89E RCALL div16u
01E6 E02A LDI R18,0xA
01E7 E030 LDI R19,0
01E8 D899 RCALL mod16u
01E9 830A STD Y+2,R16
(0032) IC_Balance[3] = Balance % 10 ; // 计算出卡内金钱的单元数的个位
01EA E02A LDI R18,0xA
01EB E030 LDI R19,0
01EC 018A MOVW R16,R20
01ED D894 RCALL mod16u
01EE 830B STD Y+3,R16
(0033)
(0034) for(i=0;i<3;i++)
01EF 24AA CLR R10
01F0 C00A RJMP 0x01FB
(0035) {
(0036) display(IC_Balance[i] , 27+i); // 显示卡内金额
01F1 2D2A MOV R18,R10
01F2 5E25 SUBI R18,0xE5
01F3 01CE MOVW R24,R28
01F4 2DEA MOV R30,R10
01F5 27FF CLR R31
01F6 0FE8 ADD R30,R24
01F7 1FF9 ADC R31,R25
01F8 8100 LDD R16,Z+0
01F9 D1AA RCALL _display
01FA 94A3 INC R10
01FB 2D8A MOV R24,R10
01FC 3083 CPI R24,3
01FD F398 BCS 0x01F1
(0037) }
(0038) display(IC_Balance[3] , 31);
01FE E12F LDI R18,0x1F
01FF 810B LDD R16,Y+3
0200 D1A3 RCALL _display
0201 9624 ADIW R28,4
0202 D8C7 RCALL pop_gset4
0203 9508 RET
_Right_Card:
Card_ID_ge --> R12
Card_ID_shi --> R14
tem --> R10
Key --> R20
i --> R22
0204 D8C9 RCALL push_gset5
0205 9722 SBIW R28,2
(0039) }
(0040)
(0041) void Right_Card(void)
(0042) {
(0043) unsigned char Card_ID_shi = 0 , Card_ID_ge = 0 , Key = 0 , i = 0 , tem = 0 ;
0206 24EE CLR R14
0207 24CC CLR R12
0208 2744 CLR R20
0209 2766 CLR R22
020A 24AA CLR R10
(0044)
(0045) LCD_write_char(0x01,0); //清屏
020B 2722 CLR R18
020C 2733 CLR R19
020D E001 LDI R16,1
020E E010 LDI R17,0
020F D387 RCALL _LCD_write_char
(0046) delay_nms(2);
0210 E002 LDI R16,2
0211 E010 LDI R17,0
0212 D184 RCALL _delay_nms
(0047)
(0048) Card_ID_shi = ( Card_ID / 10 ) ;
0213 E01A LDI R17,0xA
0214 91000060 LDS R16,Card_ID
0216 D889 RCALL div8u
0217 2EE0 MOV R14,R16
(0049) Card_ID_ge = ( Card_ID % 10 ) ;
0218 E01A LDI R17,0xA
0219 91000060 LDS R16,Card_ID
021B D882 RCALL mod8u
021C 2EC0 MOV R12,R16
(0050)
(0051) LCD_write_string(2,0,"Card_ID : ");
021D EC85 LDI R24,0xC5
021E E090 LDI R25,0
021F 8399 STD Y+1,R25
0220 8388 STD Y+0,R24
0221 2722 CLR R18
0222 E002 LDI R16,2
0223 D345 RCALL _LCD_write_string
(0052)
(0053) if(Menu_flag==1)
0224 91800112 LDS R24,Menu_flag
0226 3081 CPI R24,1
0227 F441 BNE 0x0230
(0054) {
(0055) LCD_write_string(0,1,"Del this Card ?");
0228 EB85 LDI R24,0xB5
0229 E090 LDI R25,0
022A 8399 STD Y+1,R25
022B 8388 STD Y+0,R24
022C E021 LDI R18,1
022D 2700 CLR R16
022E D33A RCALL _LCD_write_string
(0056) }
022F C009 RJMP 0x0239
(0057) else
(0058) {
(0059) LCD_write_string(0,1,"Welcome! $: . ");
0230 EA84 LDI R24,0xA4
0231 E090 LDI R25,0
0232 8399 STD Y+1,R25
0233 8388 STD Y+0,R24
0234 E021 LDI R18,1
0235 2700 CLR R16
0236 D332 RCALL _LCD_write_string
(0060) Balance_dis();
0237 DF58 RCALL _Balance_dis
(0061) LED_ON ;
0238 9AC0 SBI 0x18,0
(0062) }
(0063) display( Card_ID_shi , 12 );
0239 E02C LDI R18,0xC
023A 2D0E MOV R16,R14
023B D168 RCALL _display
(0064) display( Card_ID_ge , 13 );
023C E02D LDI R18,0xD
023D 2D0C MOV R16,R12
023E D165 RCALL _display
(0065)
(0066) if(Menu_flag==1)
023F 91800112 LDS R24,Menu_flag
0241 3081 CPI R24,1
0242 F009 BEQ 0x0244
0243 C054 RJMP 0x0298
(0067) {
(0068) Menu_flag=0;
0244 2422 CLR R2
0245 92200112 STS Menu_flag,R2
0247 C038 RJMP 0x0280
(0069)
(0070) while(1)
(0071) {
(0072) Key = Key_Scan() ;
0248 D2BE RCALL _Key_Scan
0249 2F40 MOV R20,R16
(0073)
(0074) if(Key == 11)
024A 300B CPI R16,0xB
024B F409 BNE 0x024D
(0075) {
(0076) Menu_0();
024C D5D8 RCALL _Menu_0
(0077) }
(0078)
(0079) if(Key == 12)
024D 304C CPI R20,0xC
024E F589 BNE 0x0280
(0080) {
(0081) for(i=0;i<6;i++)
024F 2766 CLR R22
0250 C00C RJMP 0x025D
(0082) {
(0083) EEPROM_write((Card_ID*6)+i, 0);
0251 2722 CLR R18
0252 90200060 LDS R2,Card_ID
0254 E086 LDI R24,6
0255 9D82 MUL R24,R2
0256 0180 MOVW R16,R0
0257 2E26 MOV R2,R22
0258 2433 CLR R3
0259 0D02 ADD R16,R2
025A 1D13 ADC R17,R3
025B D1F8 RCALL _EEPROM_write
025C 9563 INC R22
025D 3066 CPI R22,6
025E F390 BCS 0x0251
(0084) }
(0085)
(0086) tem = EEPROM_read(511) - 1 ;
025F EF0F LDI R16,0xFF
0260 E011 LDI R17,1
0261 D1FA RCALL _EEPROM_read
0262 2F80 MOV R24,R16
0263 5081 SUBI R24,1
0264 2EA8 MOV R10,R24
(0087) EEPROM_write(511, tem);
0265 2F28 MOV R18,R24
0266 EF0F LDI R16,0xFF
0267 E011 LDI R17,1
0268 D1EB RCALL _EEPROM_write
(0088)
(0089) LCD_write_string(0,1,"Del Successfully");
0269 E983 LDI R24,0x93
026A E090 LDI R25,0
026B 8399 STD Y+1,R25
026C 8388 STD Y+0,R24
026D E021 LDI R18,1
026E 2700 CLR R16
026F D2F9 RCALL _LCD_write_string
0270 C00E RJMP 0x027F
(0090)
(0091) while(1)
(0092) {
(0093) if(IC_SW!=0)
0271 B380 IN R24,0x10
0272 7088 ANDI R24,0x8
0273 BB80 OUT 0x10,R24
0274 2388 TST R24
0275 F049 BEQ 0x027F
(0094) {
(0095) delay_nms(50); // 检测是否有卡插入
0276 E302 LDI R16,0x32
0277 E010 LDI R17,0
0278 D11E RCALL _delay_nms
(0096) if(IC_SW!=0)
0279 B380 IN R24,0x10
027A 7088 ANDI R24,0x8
027B BB80 OUT 0x10,R24
027C 2388 TST R24
027D F009 BEQ 0x027F
(0097) {
(0098) Menu_0();
027E D5A6 RCALL _Menu_0
027F CFF1 RJMP 0x0271
0280 CFC7 RJMP 0x0248
(0099) }
(0100) }
(0101) }
(0102) }
(0103) }
(0104) }
0281 C016 RJMP 0x0298
(0105)
(0106) while(1)
(0107) {
(0108) if(IC_SW!=0)
0282 B380 IN R24,0x10
0283 7088 ANDI R24,0x8
0284 BB80 OUT 0x10,R24
0285 2388 TST R24
0286 F061 BEQ 0x0293
(0109) {
(0110) delay_nms(50); // 检测是否有卡插入
0287 E302 LDI R16,0x32
0288 E010 LDI R17,0
0289 D10D RCALL _delay_nms
(0111) if(IC_SW!=0)
028A B380 IN R24,0x10
028B 7088 ANDI R24,0x8
028C BB80 OUT 0x10,R24
028D 2388 TST R24
028E F021 BEQ 0x0293
(0112) {
(0113) LED_OFF ;
028F B388 IN R24,0x18
0290 7F8E ANDI R24,0xFE
0291 BB88 OUT 0x18,R24
(0114) menu_Init();
0292 D361 RCALL _menu_Init
(0115) }
(0116) }
(0117)
(0118) Key = Key_Scan() ;
0293 D273 RCALL _Key_Scan
0294 2F40 MOV R20,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -