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

📄 sle4442.s

📁 基于AVR单片机实现了食堂IC卡售饭机系统
💻 S
📖 第 1 页 / 共 4 页
字号:
	.dbsym r Byte2 20 c
	.dbsym r Byte1 22 c
	.dbend
	.dbfunc e ReadMainMemory _ReadMainMemory fV
;              N -> R20
;              p -> R22,R23
;           addr -> R10
	.even
_ReadMainMemory::
	rcall push_gset3
	mov R22,R18
	mov R23,R19
	mov R10,R16
	sbiw R28,1
	ldd R20,y+7
	.dbline -1
	.dbline 187
; 
; 
; /**********读主存储器**************/
; void ReadMainMemory(uchar addr,uchar *p,uchar N)
; {Command(0x30,addr,0xff);
	.dbline 187
	ldi R24,255
	std y+0,R24
	mov R18,R10
	ldi R16,48
	rcall _Command
L62:
	.dbline 188
;  do{*p=ReceiveData();
	.dbline 188
	rcall _ReceiveData
	mov R30,R22
	mov R31,R23
	std z+0,R16
	.dbline 189
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 189
L63:
	.dbline 189
;     p++;}while(--N);
	mov R24,R20
	subi R24,1
	mov R20,R24
	tst R24
	brne L62
	.dbline -2
	.dbline 190
; }
L61:
	adiw R28,1
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r N 20 c
	.dbsym r p 22 pc
	.dbsym r addr 10 c
	.dbend
	.dbfunc e ReadProtectMemory _ReadProtectMemory fV
;              i -> R20
;              p -> R22,R23
	.even
_ReadProtectMemory::
	rcall push_gset2
	mov R22,R16
	mov R23,R17
	sbiw R28,1
	.dbline -1
	.dbline 194
; 
; /**********读保护存储器***********/
; void ReadProtectMemory(uchar *p)
; {uchar i=4;
	.dbline 194
	ldi R20,4
	.dbline 195
;  Command(0x34,0xff,0xff);
	ldi R24,255
	std y+0,R24
	ldi R18,255
	ldi R16,52
	rcall _Command
L66:
	.dbline 196
;  do{*p=ReceiveData();
	.dbline 196
	rcall _ReceiveData
	mov R30,R22
	mov R31,R23
	std z+0,R16
	.dbline 197
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 197
L67:
	.dbline 197
;     p++;}while(i--);
	mov R2,R20
	clr R3
	subi R20,1
	tst R2
	brne L66
	.dbline -2
	.dbline 198
; }
L65:
	adiw R28,1
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r p 22 pc
	.dbend
	.dbfunc e WriteMainMemory _WriteMainMemory fV
;           Data -> R22
;        Address -> R20
	.even
_WriteMainMemory::
	rcall push_gset2
	mov R22,R18
	mov R20,R16
	sbiw R28,1
	.dbline -1
	.dbline 202
; 
; /************写主存储器************/
; void WriteMainMemory(uchar Address,uchar Data)
; {Command(0x38,Address,Data);
	.dbline 202
	std y+0,R22
	mov R18,R20
	ldi R16,56
	rcall _Command
	.dbline 203
;  Process();
	rcall _Process
	.dbline -2
	.dbline 204
; }
L69:
	adiw R28,1
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Data 22 c
	.dbsym r Address 20 c
	.dbend
	.dbfunc e WriteProtectMemory _WriteProtectMemory fV
;           Data -> R22
;        Address -> R20
	.even
_WriteProtectMemory::
	rcall push_gset2
	mov R22,R18
	mov R20,R16
	sbiw R28,1
	.dbline -1
	.dbline 208
; 
; /**************写保护存储器**********/
; void WriteProtectMemory(uchar Address,uchar Data)
; {Command(0x3c,Address,Data);
	.dbline 208
	std y+0,R22
	mov R18,R20
	ldi R16,60
	rcall _Command
	.dbline 209
;  Process();
	rcall _Process
	.dbline -2
	.dbline 210
; }
L70:
	adiw R28,1
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Data 22 c
	.dbsym r Address 20 c
	.dbend
	.dbfunc e ReadSafeMemory _ReadSafeMemory fV
;              i -> R20
;              p -> R22,R23
	.even
_ReadSafeMemory::
	rcall push_gset2
	mov R22,R16
	mov R23,R17
	sbiw R28,1
	.dbline -1
	.dbline 214
; 
; /**************读安全存储器************/
; void ReadSafeMemory(uchar *p)
; {uchar i;
	.dbline 215
;  Command(0x31,0xff,0xff);
	ldi R24,255
	std y+0,R24
	ldi R18,255
	ldi R16,49
	rcall _Command
	.dbline 216
;  for(i=0;i<4;i++)
	clr R20
	rjmp L75
L72:
	.dbline 217
	.dbline 217
	rcall _ReceiveData
	mov R30,R22
	mov R31,R23
	std z+0,R16
	.dbline 218
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 218
L73:
	.dbline 216
	inc R20
L75:
	.dbline 216
	cpi R20,4
	brlo L72
	.dbline -2
	.dbline 219
;  	{*p=ReceiveData();
; 	 p++;}
; }
L71:
	adiw R28,1
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r p 22 pc
	.dbend
	.dbfunc e WriteSafeMemory _WriteSafeMemory fV
;           Data -> R22
;        Address -> R20
	.even
_WriteSafeMemory::
	rcall push_gset2
	mov R22,R18
	mov R20,R16
	sbiw R28,1
	.dbline -1
	.dbline 223
; 
; /*************写安全存储器***************/
; void WriteSafeMemory(uchar Address,uchar Data)
; {Command(0x39,Address,Data);//Address=0,1,2,3
	.dbline 223
	std y+0,R22
	mov R18,R20
	ldi R16,57
	rcall _Command
	.dbline 224
;  Process();
	rcall _Process
	.dbline -2
	.dbline 225
; }
L76:
	adiw R28,1
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Data 22 c
	.dbsym r Address 20 c
	.dbend
	.dbfunc e VerifyPassword _VerifyPassword fc
;           temp -> y+1
;              i -> R20
;              p -> R22,R23
	.even
_VerifyPassword::
	rcall push_gset2
	mov R22,R16
	mov R23,R17
	sbiw R28,5
	.dbline -1
	.dbline 229
; 
; /**************校验密码*******************/
; uchar VerifyPassword(uchar *p)
; {uchar temp[4];//暂存4字节保护密码;
	.dbline 231
;  uchar i;
;  ReadSafeMemory(temp);//读安全代码以取得错误计数器
	mov R16,R28
	mov R17,R29
	subi R16,255  ; offset = 1
	sbci R17,255
	rcall _ReadSafeMemory
	.dbline 232
;  if((temp[0]&0x07)!=0)
	ldd R24,y+1
	andi R24,7
	breq L78
	.dbline 233
;  	{if((temp[0]&0x07)==0x07)  i=0x06;
	.dbline 233
	ldd R24,y+1
	andi R24,7
	cpi R24,7
	brne L80
	.dbline 233
	ldi R20,6
L80:
	.dbline 234
; 	 if((temp[0]&0x07)==0x06)  i=0x04;
	ldd R24,y+1
	andi R24,7
	cpi R24,6
	brne L82
	.dbline 234
	ldi R20,4
L82:
	.dbline 235
;      if((temp[0]&0x07)==0x04)  i=0x00;
	ldd R24,y+1
	andi R24,7
	cpi R24,4
	brne L84
	.dbline 235
	clr R20
L84:
	.dbline 236
; 	 WriteSafeMemory(0,i);
	mov R18,R20
	clr R16
	rcall _WriteSafeMemory
	.dbline 237
; 	 for(i=1;i<4;i++,p++)
	ldi R20,1
	rjmp L89
L86:
	.dbline 238
	.dbline 238
	mov R30,R22
	mov R31,R23
	ldd R2,z+0
	std y+0,R2
	mov R18,R20
	ldi R16,51
	rcall _Command
	.dbline 239
	rcall _Process
	.dbline 239
L87:
	.dbline 237
	inc R20
	subi R22,255  ; offset = 1
	sbci R23,255
L89:
	.dbline 237
	cpi R20,4
	brlo L86
	.dbline 240
; 	 	{Command(0x33,i,*p);
; 		 Process();}
;      WriteSafeMemory(0,0xff);
	ldi R18,255
	clr R16
	rcall _WriteSafeMemory
	.dbline 241
; 	 ReadSafeMemory(temp);
	mov R16,R28
	mov R17,R29
	subi R16,255  ; offset = 1
	sbci R17,255
	rcall _ReadSafeMemory
	.dbline 242
; 	 if((temp[0]&0x07)==0x07) return(0x1);
	ldd R24,y+1
	andi R24,7
	cpi R24,7
	brne L90
	.dbline 242
	ldi R16,1
	rjmp L77
L90:
	.dbline 244
; 	 
;  }
L78:
	.dbline 245
;  return(0);
	clr R16
	.dbline -2
L77:
	adiw R28,5
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l temp 1 A[4:4]c
	.dbsym r i 20 c
	.dbsym r p 22 pc
	.dbend
	.dbfunc e Change _Change fV
;           temp -> R20
;              i -> R22
;              N -> R10
;    Destination -> R18,R19
;         Source -> R16,R17
	.even
_Change::
	rcall push_gset3
	ldd R10,y+6
	.dbline -1
	.dbline 251
; }
; //*************SLE4442函数结束*****************//
; 
; //*************数据变换**********//
; void Change(uchar *Source,uchar *Destination,uchar N)
; {uchar i,temp;
	.dbline 252
;  for(i=0;i<N;i++)
	clr R22
	rjmp L96
L93:
	.dbline 253
	.dbline 253
	mov R30,R22
	clr R31
	add R30,R16
	adc R31,R17
	ldd R20,z+0
	.dbline 254
	mov R30,R22
	clr R31
	add R30,R18
	adc R31,R19
	mov R24,R20
	swap R24
	andi R24,#0x0F
	std z+0,R24
	.dbline 255
	mov R30,R22
	clr R31
	lsl R30
	rol R31
	add R30,R18
	adc R31,R19
	mov R24,R20
	andi R24,15
	std z+1,R24
	.dbline 255
L94:
	.dbline 252
	inc R22
L96:
	.dbline 252
	cp R22,R10
	brlo L93
	.dbline -2
	.dbline 256
;  {temp=Source[i];
;   Destination[i]=temp>>4;
;   Destination[2*i+1]=temp&0x0f;}
; }
L92:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r i 22 c
	.dbsym r N 10 c
	.dbsym r Destination 18 pc
	.dbsym r Source 16 pc
	.dbend
	.dbfunc e Buzzle_Password _Buzzle_Password fV
;              i -> R20
	.even
_Buzzle_Password::
	rcall push_gset1
	.dbline -1
	.dbline 260
; 
; //***********密码错误报警***********************//
; void Buzzle_Password(void)
; {uchar i;
	.dbline 261
;  for(i=0;i<2;i++)
	clr R20
	rjmp L101
L98:
	.dbline 262
	.dbline 262
	clr R16
	rcall _Voice
	.dbline 263
	ldi R16,1000
	ldi R17,3
	rcall _DelayMs
	.dbline 264
	ldi R16,1
	rcall _Voice
	.dbline 265
	ldi R16,1000
	ldi R17,3
	rcall _DelayMs
	.dbline 265
L99:
	.dbline 261
	inc R20
L101:
	.dbline 261
	cpi R20,2
	brlo L98
	.dbline -2
	.dbline 266
; 	{Voice(0);
;      DelayMs(1000);
;      Voice(1);
;      DelayMs(1000);}
; }
L97:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e Buzzle_Card _Buzzle_Card fV
;              i -> R20
	.even
_Buzzle_Card::
	rcall push_gset1
	.dbline -1
	.dbline 270
;  
; //**********非法卡错误报警*************************// 
; void Buzzle_Card(void)
; {uchar i;
	.dbline 271
;  for(i=0;i<2;i++)
	clr R20
	rjmp L106
L103:
	.dbline 272
	.dbline 272
	clr R16
	rcall _Voice
	.dbline 273
	ldi R16,3000
	ldi R17,11
	rcall _DelayMs
	.dbline 273
L104:
	.dbline 271
	inc R20
L106:
	.dbline 271
	cpi R20,2
	brlo L103
	.dbline -2
	.dbline 274
; 	{Voice(0);
;      DelayMs(3000);}
; }
L102:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e Buzzle_Money _Buzzle_Money fV
;              i -> R20
	.even
_Buzzle_Money::
	rcall push_gset1
	.dbline -1
	.dbline 278
; 
; //*************余额不足报警**********************//
; void Buzzle_Money(void)
; {uchar i;
	.dbline 279
;  for(i=0;i<1;i++)
	clr R20
	rjmp L111
L108:
	.dbline 280
	.dbline 280
	rcall _Buzzle_Password
	.dbline 281
	rcall _Buzzle_Card
	.dbline 281
L109:
	.dbline 279
	inc R20
L111:
	.dbline 279
	cpi R20,1
	brlo L108
	.dbline -2
	.dbline 282
;   {Buzzle_Password();
;    Buzzle_Card();}
; }
L107:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e Read_Card _Read_Card fc
;           temp -> y+1
;            tag -> R20
;              i -> R22
;              p -> R10,R11
	.even
_Read_Card::
	rcall push_gset3
	mov R10,R16
	mov R11,R17
	sbiw R28,5
	.dbline -1
	.dbline 293
;   
; //*********************读卡函数********************//
; //说明:
; //函数使用的数组参数用来存放读出的余额值;
; //返回值信息:
; //0:卡坏!
; //1:非法卡(特征值不正确)
; //2:非法卡(特征值正确,帐号不正确)
; //3:读卡成功!
; uchar Read_Card(uchar *p)
; {uchar i,tag=0,temp[4];
	.dbline 293
	clr R20
	.dbline 294
;  ReadSafeMemory(temp);
	mov R16,R28
	mov R17,R29
	subi R16,255  ; offset = 1
	sbci R17,255
	rcall _ReadSafeMemory
	.dbline 295
;  if(temp[0]==0x07)
	ldd R24,y+1
	cpi R24,7
	breq X2
	rjmp L113
X2:
	.dbline 296
;   {ReadMainMemory(32,p,14);//读主存储器14字节:32-35特征码;36-3A帐号;3B-3F余额
	.dbline 296
	ldi R24,14
	std y+0,R24
	mov R18,R10
	mov R19,R11
	ldi R16,32
	rcall _ReadMainMemory
	.dbline 297
;    if(p[0]==0x00&&p[1]==0x0f&&p[2]==0xf0&&p[3]==0xff)//特征码:0x00,0x0f,0xf0,0xff
	mov R30,R10
	mov R31,R11
	ldd R2,z+0
	tst R2
	brne L115
	ldd R24,z+1
	cpi R24,15
	brne L115
	mov R30,R10
	mov R31,R11
	ldd R24,z+2
	cpi R24,240
	brne L115
	mov R30,R10
	mov R31,R11
	ldd R24,z+3
	cpi R24,255
	brne L115
	.dbline 298
;  	{for(i=0;i<10;i++)
	.dbline 298
	clr R22
	rjmp L120
L117:
	.dbline 299
; 		if((p[i+4]>=0&&p[i+4]<=9)) tag=tag+1;
	mov R30,R22
	clr R31
	add R30,R10
	adc R31,R11
	ldd R2,z+4
	clr R3
	mov R24,R2
	cpi R24,0
	brlo L121
	ldi R24,9
	cp R24,R2
	brlo L121
	.dbline 299
	inc R20
L121:
L118:
	.dbline 298
	inc R22
L120:
	.dbline 298
	cpi R22,10
	brlo L117
	.dbline 300
; 	 if(tag!=10) return(2);
	cpi R20,10
	breq L123
	.dbline 300
	ldi R16,2
	rjmp L112
L123:
	.dbline 301
; 	 else return(3);
	ldi R16,3
	rjmp L112
L115:
	.dbline 304
; 	}
;    else
;     return(1);
	ldi R16,1
	rjmp L112
L113:
	.dbline 306
;   }
;  else return(0);
	clr R16
	.dbline -2
L112:
	adiw R28,5
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym l temp 1 A[4:4]c
	.dbsym r tag 20 c
	.dbsym r i 22 c
	.dbsym r p 10 pc
	.dbend
	.area lit(rom, con, rel)
L126:
	.byte 255,255
	.byte 255
	.area text(rom, con, rel)
	.dbfile J:\SLE4442-avr\sle4442.c
	.dbfunc e Initial_Card _Initial_Card fc
;            Psw -> y+20
;              j -> R20
;             tp -> y+0
;           temp -> R22
;              i -> R10
;              p -> R12,R13
	.even
_Initial_Card::
	rcall push_gset4
	mov R12,R16
	mov R13,R17
	sbiw R28,23
	.dbline -1
	.dbline 316
; }
; 
; //*********************卡初始化函数********************//
; //说明:
; //函数使用的数组参数用来存放写入的的ID值;
; //返回值信息:
; //2:初始化失败!
; //3:初始化成功!
; uchar Initial_Card(uchar *p)
; {uchar Psw[3]={0xff,0xff,0xff};
	.dbline 316
	ldi R24,<L126
	ldi R25,>L126
	mov R30,R28
	mov R31,R29
	adiw R30,20
	ldi R16,3
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 317
;  uchar i,j,temp=0;
	clr R22
	.dbline 320
;  uchar tp[20];
; // ResetIC(ICcode);//IC卡复位,读出复位后的厂家信息代码A2131091;
;   j=VerifyPassword(Psw);
	mov R16,R28
	mov R17,R29
	subi R16,236  ; offset = 20
	sbci R17,255
	rcall _VerifyPassword
	mov R20,R16
	.dbline 321
;   WriteMainMemory(32,0x00);//写特征码:
	clr R18
	ldi R16,32
	rcall _WriteMainMemory
	.dbline 322
;   WriteMainMemory(33,0x0f);
	ldi R18,15
	ldi R16,33
	rcall _WriteMainMemory
	.dbline 323
;   WriteMainMemory(34,0xf0);
	ldi R18,240
	ldi R16,34
	rcall _WriteMainMemory
	.dbline 324
;   WriteMainMemory(35,0xff);
	ldi R18,255
	ldi R16,35
	rcall _WriteMainMemory
	.dbline 325
;   for(i=0;i<5;i++)//写帐号
	clr R10
	rjmp L130
L127:
	.dbline 326
	mov R30,R10
	clr R31
	add R30,R12
	adc R31,R13
	ldd R18,z+0
	mov R16,R10
	subi R16,220    ; addi 36

⌨️ 快捷键说明

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