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

📄 sle4442.lst

📁 avr单片机读写ic卡程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0203 EE08      LDI	R16,0xE8
    0204 E013      LDI	R17,3
    0205 DE64      RCALL	_DelayMs
(0264)      Voice(1);
    0206 E001      LDI	R16,1
    0207 DE38      RCALL	_Voice
(0265)      DelayMs(1000);}
    0208 EE08      LDI	R16,0xE8
    0209 E013      LDI	R17,3
    020A DE5F      RCALL	_DelayMs
    020B 9543      INC	R20
    020C 3042      CPI	R20,2
    020D F398      BCS	0x0201
(0266) }
    020E D3F3      RCALL	pop_gset1
    020F 9508      RET
_Buzzle_Card:
  i                    --> R20
    0210 D3EE      RCALL	push_gset1
(0267)  
(0268) //**********非法卡错误报警*************************// 
(0269) void Buzzle_Card(void)
(0270) {uchar i;
(0271)  for(i=0;i<2;i++)
    0211 2744      CLR	R20
    0212 C006      RJMP	0x0219
(0272) 	{Voice(0);
    0213 2700      CLR	R16
    0214 DE2B      RCALL	_Voice
(0273)      DelayMs(3000);}
    0215 EB08      LDI	R16,0xB8
    0216 E01B      LDI	R17,0xB
    0217 DE52      RCALL	_DelayMs
    0218 9543      INC	R20
    0219 3042      CPI	R20,2
    021A F3C0      BCS	0x0213
(0274) }
    021B D3E6      RCALL	pop_gset1
    021C 9508      RET
_Buzzle_Money:
  i                    --> R20
    021D D3E1      RCALL	push_gset1
(0275) 
(0276) //*************余额不足报警**********************//
(0277) void Buzzle_Money(void)
(0278) {uchar i;
(0279)  for(i=0;i<1;i++)
    021E 2744      CLR	R20
    021F C003      RJMP	0x0223
(0280)   {Buzzle_Password();
    0220 DFDD      RCALL	_Buzzle_Password
(0281)    Buzzle_Card();}
    0221 DFEE      RCALL	_Buzzle_Card
    0222 9543      INC	R20
    0223 3041      CPI	R20,1
    0224 F3D8      BCS	0x0220
(0282) }
    0225 D3DC      RCALL	pop_gset1
    0226 9508      RET
_Read_Card:
  temp                 --> Y+1
  tag                  --> R20
  i                    --> R22
  p                    --> R10
    0227 D3F1      RCALL	push_gset3
    0228 2EA0      MOV	R10,R16
    0229 2EB1      MOV	R11,R17
    022A 9725      SBIW	R28,5
(0283)   
(0284) //*********************读卡函数********************//
(0285) //说明:
(0286) //函数使用的数组参数用来存放读出的余额值;
(0287) //返回值信息:
(0288) //0:卡坏!
(0289) //1:非法卡(特征值不正确)
(0290) //2:非法卡(特征值正确,帐号不正确)
(0291) //3:读卡成功!
(0292) uchar Read_Card(uchar *p)
(0293) {uchar i,tag=0,temp[4];
    022B 2744      CLR	R20
(0294)  ReadSafeMemory(temp);
    022C 2F0C      MOV	R16,R28
    022D 2F1D      MOV	R17,R29
    022E 5F0F      SUBI	R16,0xFF
    022F 4F1F      SBCI	R17,0xFF
    0230 DF4C      RCALL	_ReadSafeMemory
(0295)  if(temp[0]==0x07)
    0231 8189      LDD	R24,Y+1
    0232 3087      CPI	R24,7
    0233 F009      BEQ	0x0235
    0234 C032      RJMP	0x0267
(0296)   {ReadMainMemory(32,p,14);//读主存储器14字节:32-35特征码;36-3A帐号;3B-3F余额
    0235 E08E      LDI	R24,0xE
    0236 8388      STD	Y+0,R24
    0237 2D2A      MOV	R18,R10
    0238 2D3B      MOV	R19,R11
    0239 E200      LDI	R16,0x20
    023A DEF9      RCALL	_ReadMainMemory
(0297)    if(p[0]==0x00&&p[1]==0x0f&&p[2]==0xf0&&p[3]==0xff)//特征码:0x00,0x0f,0xf0,0xff
    023B 2DEA      MOV	R30,R10
    023C 2DFB      MOV	R31,R11
    023D 8020      LDD	R2,Z+0
    023E 2022      TST	R2
    023F F529      BNE	0x0265
    0240 8181      LDD	R24,Z+1
    0241 308F      CPI	R24,0xF
    0242 F511      BNE	0x0265
    0243 2DEA      MOV	R30,R10
    0244 2DFB      MOV	R31,R11
    0245 8182      LDD	R24,Z+2
    0246 3F80      CPI	R24,0xF0
    0247 F4E9      BNE	0x0265
    0248 2DEA      MOV	R30,R10
    0249 2DFB      MOV	R31,R11
    024A 8183      LDD	R24,Z+3
    024B 3F8F      CPI	R24,0xFF
    024C F4C1      BNE	0x0265
(0298)  	{for(i=0;i<10;i++)
    024D 2766      CLR	R22
    024E C00E      RJMP	0x025D
(0299) 		if((p[i+4]>=0&&p[i+4]<=9)) tag=tag+1;
    024F 2FE6      MOV	R30,R22
    0250 27FF      CLR	R31
    0251 0DEA      ADD	R30,R10
    0252 1DFB      ADC	R31,R11
    0253 8024      LDD	R2,Z+4
    0254 2433      CLR	R3
    0255 2D82      MOV	R24,R2
    0256 3080      CPI	R24,0
    0257 F020      BCS	0x025C
    0258 E089      LDI	R24,0x9
    0259 1582      CP	R24,R2
    025A F008      BCS	0x025C
    025B 9543      INC	R20
    025C 9563      INC	R22
    025D 306A      CPI	R22,0xA
    025E F380      BCS	0x024F
(0300) 	 if(tag!=10) return(2);
    025F 304A      CPI	R20,0xA
    0260 F011      BEQ	0x0263
    0261 E002      LDI	R16,2
    0262 C005      RJMP	0x0268
(0301) 	 else return(3);
    0263 E003      LDI	R16,3
    0264 C003      RJMP	0x0268
(0302) 	}
(0303)    else
(0304)     return(1);
    0265 E001      LDI	R16,1
    0266 C001      RJMP	0x0268
(0305)   }
(0306)  else return(0);
    0267 2700      CLR	R16
    0268 9625      ADIW	R28,5
    0269 D391      RCALL	pop_gset3
    026A 9508      RET
_Initial_Card:
  Psw                  --> Y+20
  j                    --> R20
  tp                   --> Y+0
  temp                 --> R22
  i                    --> R10
  p                    --> R12
    026B D3B0      RCALL	push_gset4
    026C 2EC0      MOV	R12,R16
    026D 2ED1      MOV	R13,R17
    026E 9767      SBIW	R28,0x17
(0307) }
(0308) 
(0309) //*********************卡初始化函数********************//
(0310) //说明:
(0311) //函数使用的数组参数用来存放写入的的ID值;
(0312) //返回值信息:
(0313) //2:初始化失败!
(0314) //3:初始化成功!
(0315) uchar Initial_Card(uchar *p)
(0316) {uchar Psw[3]={0xff,0xff,0xff};
    026F E282      LDI	R24,0x22
    0270 E090      LDI	R25,0
    0271 2FEC      MOV	R30,R28
    0272 2FFD      MOV	R31,R29
    0273 9674      ADIW	R30,0x14
    0274 E003      LDI	R16,3
    0275 E010      LDI	R17,0
    0276 93FA      ST	R31,-Y
    0277 93EA      ST	R30,-Y
    0278 939A      ST	R25,-Y
    0279 938A      ST	R24,-Y
    027A D3D8      RCALL	asgncblk
(0317)  uchar i,j,temp=0;
    027B 2766      CLR	R22
(0318)  uchar tp[20];
(0319) // ResetIC(ICcode);//IC卡复位,读出复位后的厂家信息代码A2131091;
(0320)   j=VerifyPassword(Psw);
    027C 2F0C      MOV	R16,R28
    027D 2F1D      MOV	R17,R29
    027E 5E0C      SUBI	R16,0xEC
    027F 4F1F      SBCI	R17,0xFF
    0280 DF1F      RCALL	_VerifyPassword
    0281 2F40      MOV	R20,R16
(0321)   WriteMainMemory(32,0x00);//写特征码:
    0282 2722      CLR	R18
    0283 E200      LDI	R16,0x20
    0284 DEE0      RCALL	_WriteMainMemory
(0322)   WriteMainMemory(33,0x0f);
    0285 E02F      LDI	R18,0xF
    0286 E201      LDI	R16,0x21
    0287 DEDD      RCALL	_WriteMainMemory
(0323)   WriteMainMemory(34,0xf0);
    0288 EF20      LDI	R18,0xF0
    0289 E202      LDI	R16,0x22
    028A DEDA      RCALL	_WriteMainMemory
(0324)   WriteMainMemory(35,0xff);
    028B EF2F      LDI	R18,0xFF
    028C E203      LDI	R16,0x23
    028D DED7      RCALL	_WriteMainMemory
(0325)   for(i=0;i<5;i++)//写帐号
    028E 24AA      CLR	R10
    028F C009      RJMP	0x0299
(0326)   WriteMainMemory(36+i,p[i]);//从32+i地址开始写5字节帐号;
    0290 2DEA      MOV	R30,R10
    0291 27FF      CLR	R31
    0292 0DEC      ADD	R30,R12
    0293 1DFD      ADC	R31,R13
    0294 8120      LDD	R18,Z+0
    0295 2D0A      MOV	R16,R10
    0296 5D0C      SUBI	R16,0xDC
    0297 DECD      RCALL	_WriteMainMemory
    0298 94A3      INC	R10
    0299 2D8A      MOV	R24,R10
    029A 3085      CPI	R24,5
    029B F3A0      BCS	0x0290
(0327)   for(i=0;i<5;i++)
    029C 24AA      CLR	R10
    029D C005      RJMP	0x02A3
(0328)   WriteMainMemory(41+i,0);//从32+i地址开始写5字节初始化金额0000.0
    029E 2722      CLR	R18
    029F 2D0A      MOV	R16,R10
    02A0 5D07      SUBI	R16,0xD7
    02A1 DEC3      RCALL	_WriteMainMemory
    02A2 94A3      INC	R10
    02A3 2D8A      MOV	R24,R10
    02A4 3085      CPI	R24,5
    02A5 F3C0      BCS	0x029E
(0329)   j=Read_Card(tp);
    02A6 2F0C      MOV	R16,R28
    02A7 2F1D      MOV	R17,R29
    02A8 DF7E      RCALL	_Read_Card
    02A9 2F40      MOV	R20,R16
(0330)   if(j==3)
    02AA 3003      CPI	R16,3
    02AB F4B1      BNE	0x02C2
(0331)    {for(i=0;i<10;i++)
    02AC 24AA      CLR	R10
    02AD C011      RJMP	0x02BF
(0332)      if(p[i]==tp[i+4]) temp=temp+1;
    02AE 2F8C      MOV	R24,R28
    02AF 2F9D      MOV	R25,R29
    02B0 9604      ADIW	R24,4
    02B1 2DEA      MOV	R30,R10
    02B2 27FF      CLR	R31
    02B3 0FE8      ADD	R30,R24
    02B4 1FF9      ADC	R31,R25
    02B5 8020      LDD	R2,Z+0
    02B6 2DEA      MOV	R30,R10
    02B7 27FF      CLR	R31
    02B8 0DEC      ADD	R30,R12
    02B9 1DFD      ADC	R31,R13
    02BA 8030      LDD	R3,Z+0
    02BB 1432      CP	R3,R2
    02BC F409      BNE	0x02BE
    02BD 9563      INC	R22
    02BE 94A3      INC	R10
    02BF 2D8A      MOV	R24,R10
    02C0 308A      CPI	R24,0xA
    02C1 F360      BCS	0x02AE
(0333)   }
(0334)   if(temp==10)  return(3);
    02C2 306A      CPI	R22,0xA
    02C3 F411      BNE	0x02C6
    02C4 E003      LDI	R16,3
    02C5 C001      RJMP	0x02C7
(0335)   else return(2);
    02C6 E002      LDI	R16,2
    02C7 9667      ADIW	R28,0x17
    02C8 D334      RCALL	pop_gset4
    02C9 9508      RET
_Repair_Card:
  temp                 --> Y+1
  j                    --> Y+1
  i                    --> R20
  Psw                  --> Y+0
    02CA D334      RCALL	push_gset1
    02CB 9723      SBIW	R28,3
(0336) }
(0337) 
(0338) //***************卡修复函数********************//
(0339) //说明:
(0340) //返回值信息:
(0341) //0:修复失败!
(0342) //1:修复成功!												 
(0343) uchar Repair_Card(void)
(0344) {uchar Psw[3]={0xff,0xff,0xff};
    02CC E285      LDI	R24,0x25
    02CD E090      LDI	R25,0
    02CE 2FEC      MOV	R30,R28
    02CF 2FFD      MOV	R31,R29
    02D0 E003      LDI	R16,3
    02D1 E010      LDI	R17,0
    02D2 93FA      ST	R31,-Y
    02D3 93EA      ST	R30,-Y
    02D4 939A      ST	R25,-Y
    02D5 938A      ST	R24,-Y
    02D6 D37C      RCALL	asgncblk
(0345)  uchar i,j,temp;
(0346)  i=VerifyPassword(Psw);
    02D7 2F0C      MOV	R16,R28
    02D8 2F1D      MOV	R17,R29
    02D9 DEC6      RCALL	_VerifyPassword
    02DA 2F40      MOV	R20,R16
(0347)  return(i);
    02DB 9623      ADIW	R28,3
    02DC D325      RCALL	pop_gset1
    02DD 9508      RET
_Add_Card:
  i                    --> R22
  temp                 --> Y+0
  p                    --> R20
    02DE D337      RCALL	push_gset2
    02DF 2F40      MOV	R20,R16
    02E0 2F51      MOV	R21,R17
    02E1 972E      SBIW	R28,0xE
(0348) }
(0349) 
(0350) //********************加卡函数***********//
(0351) void Add_Card(uchar *p)
(0352) {uchar i;
(0353)  uchar temp[14];
(0354)  i=Read_Card(temp);
    02E2 2F0C      MOV	R16,R28
    02E3 2F1D      MOV	R17,R29
    02E4 DF42      RCALL	_Read_Card
    02E5 2F60      MOV	R22,R16
(0355)  if(i==3)
    02E6 3003      CPI	R16,3
    02E7 F009      BEQ	0x02E9
    02E8 C04B      RJMP	0x0334
(0356)  	{temp[13]=temp[13]+p[4];
    02E9 2FE4      MOV	R30,R20
    02EA 2FF5      MOV	R31,R21
    02EB 8024      LDD	R2,Z+4
    02EC 843D      LDD	R3,Y+13
    02ED 0C32      ADD	R3,R2
    02EE 863D      STD	Y+13,R3
(0357) 	 if(temp[13]>9) {temp[13]=temp[13]-10;temp[12]=temp[12]+1;}
    02EF E089      LDI	R24,0x9
    02F0 1583      CP	R24,R3
    02F1 F430      BCC	0x02F8
    02F2 2D83      MOV	R24,R3
    02F3 508A      SUBI	R24,0xA
    02F4 878D      STD	Y+13,R24
    02F5 858C      LDD	R24,Y+12
    02F6 5F8F      SUBI	R24,0xFF
    02F7 878C      STD	Y+12,R24
(0358) 	 temp[12]=temp[12]+p[3];
    02F8 2FE4      MOV	R30,R20
    02F9 2FF5      MOV	R31,R21
    02FA 8023      LDD	R2,Z+3
    02FB 843C      LDD	R3,Y+12
    02FC 0C32      ADD	R3,R2
    02FD 863C      STD	Y+12,R3
(0359) 	 if(temp[12]>9) {temp[12]=temp[12]-10;temp[11]=temp[11]+1;}
    02FE E089      LDI	R24,0x9
    02FF 1583      CP	R24,R3
    0300 F430      BCC	0x0307
    0301 2D83      MOV	R24,R3
    0302 508A      SUBI	R24,0xA
    0303 878C      STD	Y+12,R24
    0304 858B      LDD	R24,Y+11
    0305 5F8F      SUBI	R24,0xFF
    0306 878B      STD	Y+11,R24
(0360) 	 temp[11]=temp[11]+p[2];
    0307 2FE4      MOV	R30,R20
    0308 2FF5      MOV	R31,R21
    0309 8022      LDD	R2,Z+2
    030A 843B      LDD	R3,Y+11
    030B 0C32      ADD	R3,R2
    030C 863B      STD	Y+11,R3
(0361) 	 if(temp[11]>9) {temp[11]=temp[11]-10;temp[10]=temp[10]+1;}
    030D E089      LDI	R24,0x9
    030E 1583      CP	R24,R3
    030F F430      BCC	0x0316
    0310 2D83      MOV	R24,R3
    0311 508A      SUBI	R24,0xA
    0312 878B      STD	Y+11,R24
    0313 858A      LDD	R24,Y+10
    0314 5F8F      SUBI	R24,0xFF
    0315 878A      STD	Y+10,R24
(0362) 	 temp[10]=temp[10]+p[1];
    0316 2FE4      MOV	R30,R20
    0317 2FF5      MOV	R31,R21
    0318 8021      LDD	R2,Z+1
    0319 843A      LDD	R3,Y+10
    031A 0C32      ADD	R3,R2
    031B 863A      STD	Y+10,R3
(0363) 	 if(temp[10]>9) {temp[10]=temp[10]-10;temp[9]=temp[9]+1;}
    031C E089      LDI	R24,0x9
    031D 1583      CP	R24,R3

⌨️ 快捷键说明

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