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

📄 ic_card.lst

📁 环保型IC卡门禁系统的C程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -