📄 sle4442.lst
字号:
(0150) DelayUs(2);
0102 E002 LDI R16,2
0103 DF60 RCALL _DelayUs
(0151) IO(1);
0104 E001 LDI R16,1
0105 DF4E RCALL _IO
(0152) DelayUs(2);
0106 E002 LDI R16,2
0107 DF5C RCALL _DelayUs
(0153) IO(0);
0108 2700 CLR R16
(0154) }
0109 CF4A RJMP _IO
_Process:
j --> R20
010A D4F4 RCALL push_gset1
(0155)
(0156) //******************处理过程**************//
(0157) void Process(void)
(0158) {uint j;
(0159) SetIO(1);//设置IO脚为输出脚
010B E001 LDI R16,1
010C DF4D RCALL _SetIO
(0160) CLK(0);
010D 2700 CLR R16
010E DF3F RCALL _CLK
(0161) DelayUs(5);
010F E005 LDI R16,5
0110 DF53 RCALL _DelayUs
(0162) IO(0);
0111 2700 CLR R16
0112 DF41 RCALL _IO
(0163) for(j=255;j>0;j--)
0113 EF4F LDI R20,0xFF
0114 E050 LDI R21,0
0115 C00A RJMP 0x0120
(0164) {CLK(1);
0116 E001 LDI R16,1
0117 DF36 RCALL _CLK
(0165) DelayUs(5);
0118 E005 LDI R16,5
0119 DF4A RCALL _DelayUs
(0166) CLK(0);
011A 2700 CLR R16
011B DF32 RCALL _CLK
(0167) DelayUs(5);
011C E005 LDI R16,5
011D DF46 RCALL _DelayUs
011E 5041 SUBI R20,1
011F 4050 SBCI R21,0
0120 3040 CPI R20,0
0121 0745 CPC R20,R21
0122 F799 BNE 0x0116
(0168) }
(0169) IO(1);
0123 E001 LDI R16,1
0124 DF2F RCALL _IO
(0170) }
0125 D4DC RCALL pop_gset1
0126 9508 RET
_Command:
Byte3 --> Y+4
Byte2 --> R20
Byte1 --> R22
0127 D4EE RCALL push_gset2
0128 2F42 MOV R20,R18
0129 2F60 MOV R22,R16
(0171)
(0172) //****************说明*********************//
(0173) //*********输出模式接口命令,包括读主存储器30H,读保护存储器34H,读安全代码的接口命令31H***********//
(0174) //******处理模式数据接口命令,包括写主存储器38H,写保护存储器3CH,写安全代码39H,校验安全代码33H*******//
(0175)
(0176) void Command(uchar Byte1,uchar Byte2,uchar Byte3)
(0177) {Start();
012A DFBB RCALL _Start
(0178) SendData(Byte1);
012B 2F06 MOV R16,R22
012C DF72 RCALL _SendData
(0179) SendData(Byte2);
012D 2F04 MOV R16,R20
012E DF70 RCALL _SendData
(0180) SendData(Byte3);
012F 810C LDD R16,Y+4
0130 DF6E RCALL _SendData
(0181) Stop();
0131 DFC6 RCALL _Stop
(0182) }
0132 D4C6 RCALL pop_gset2
0133 9508 RET
_ReadMainMemory:
N --> R20
p --> R22
addr --> R10
0134 D4E4 RCALL push_gset3
0135 2F62 MOV R22,R18
0136 2F73 MOV R23,R19
0137 2EA0 MOV R10,R16
0138 9721 SBIW R28,1
0139 814F LDD R20,Y+7
(0183)
(0184)
(0185) /**********读主存储器**************/
(0186) void ReadMainMemory(uchar addr,uchar *p,uchar N)
(0187) {Command(0x30,addr,0xff);
013A EF8F LDI R24,0xFF
013B 8388 STD Y+0,R24
013C 2D2A MOV R18,R10
013D E300 LDI R16,0x30
013E DFE8 RCALL _Command
(0188) do{*p=ReceiveData();
013F DF3E RCALL _ReceiveData
0140 2FE6 MOV R30,R22
0141 2FF7 MOV R31,R23
0142 8300 STD Z+0,R16
(0189) p++;}while(--N);
0143 5F6F SUBI R22,0xFF
0144 4F7F SBCI R23,0xFF
0145 2F84 MOV R24,R20
0146 5081 SUBI R24,1
0147 2F48 MOV R20,R24
0148 2388 TST R24
0149 F7A9 BNE 0x013F
(0190) }
014A 9621 ADIW R28,1
014B D4AF RCALL pop_gset3
014C 9508 RET
_ReadProtectMemory:
i --> R20
p --> R22
014D D4C8 RCALL push_gset2
014E 2F60 MOV R22,R16
014F 2F71 MOV R23,R17
0150 9721 SBIW R28,1
(0191)
(0192) /**********读保护存储器***********/
(0193) void ReadProtectMemory(uchar *p)
(0194) {uchar i=4;
0151 E044 LDI R20,4
(0195) Command(0x34,0xff,0xff);
0152 EF8F LDI R24,0xFF
0153 8388 STD Y+0,R24
0154 EF2F LDI R18,0xFF
0155 E304 LDI R16,0x34
0156 DFD0 RCALL _Command
(0196) do{*p=ReceiveData();
0157 DF26 RCALL _ReceiveData
0158 2FE6 MOV R30,R22
0159 2FF7 MOV R31,R23
015A 8300 STD Z+0,R16
(0197) p++;}while(i--);
015B 5F6F SUBI R22,0xFF
015C 4F7F SBCI R23,0xFF
015D 2E24 MOV R2,R20
015E 2433 CLR R3
015F 5041 SUBI R20,1
0160 2022 TST R2
0161 F7A9 BNE 0x0157
(0198) }
0162 9621 ADIW R28,1
0163 D495 RCALL pop_gset2
0164 9508 RET
_WriteMainMemory:
Data --> R22
Address --> R20
0165 D4B0 RCALL push_gset2
0166 2F62 MOV R22,R18
0167 2F40 MOV R20,R16
0168 9721 SBIW R28,1
(0199)
(0200) /************写主存储器************/
(0201) void WriteMainMemory(uchar Address,uchar Data)
(0202) {Command(0x38,Address,Data);
0169 8368 STD Y+0,R22
016A 2F24 MOV R18,R20
016B E308 LDI R16,0x38
016C DFBA RCALL _Command
(0203) Process();
016D DF9C RCALL _Process
(0204) }
016E 9621 ADIW R28,1
016F D489 RCALL pop_gset2
0170 9508 RET
_WriteProtectMemory:
Data --> R22
Address --> R20
0171 D4A4 RCALL push_gset2
0172 2F62 MOV R22,R18
0173 2F40 MOV R20,R16
0174 9721 SBIW R28,1
(0205)
(0206) /**************写保护存储器**********/
(0207) void WriteProtectMemory(uchar Address,uchar Data)
(0208) {Command(0x3c,Address,Data);
0175 8368 STD Y+0,R22
0176 2F24 MOV R18,R20
0177 E30C LDI R16,0x3C
0178 DFAE RCALL _Command
(0209) Process();
0179 DF90 RCALL _Process
(0210) }
017A 9621 ADIW R28,1
017B D47D RCALL pop_gset2
017C 9508 RET
_ReadSafeMemory:
i --> R20
p --> R22
017D D498 RCALL push_gset2
017E 2F60 MOV R22,R16
017F 2F71 MOV R23,R17
0180 9721 SBIW R28,1
(0211)
(0212) /**************读安全存储器************/
(0213) void ReadSafeMemory(uchar *p)
(0214) {uchar i;
(0215) Command(0x31,0xff,0xff);
0181 EF8F LDI R24,0xFF
0182 8388 STD Y+0,R24
0183 EF2F LDI R18,0xFF
0184 E301 LDI R16,0x31
0185 DFA1 RCALL _Command
(0216) for(i=0;i<4;i++)
0186 2744 CLR R20
0187 C007 RJMP 0x018F
(0217) {*p=ReceiveData();
0188 DEF5 RCALL _ReceiveData
0189 2FE6 MOV R30,R22
018A 2FF7 MOV R31,R23
018B 8300 STD Z+0,R16
(0218) p++;}
018C 5F6F SUBI R22,0xFF
018D 4F7F SBCI R23,0xFF
018E 9543 INC R20
018F 3044 CPI R20,4
0190 F3B8 BCS 0x0188
(0219) }
0191 9621 ADIW R28,1
0192 D466 RCALL pop_gset2
0193 9508 RET
_WriteSafeMemory:
Data --> R22
Address --> R20
0194 D481 RCALL push_gset2
0195 2F62 MOV R22,R18
0196 2F40 MOV R20,R16
0197 9721 SBIW R28,1
(0220)
(0221) /*************写安全存储器***************/
(0222) void WriteSafeMemory(uchar Address,uchar Data)
(0223) {Command(0x39,Address,Data);//Address=0,1,2,3
0198 8368 STD Y+0,R22
0199 2F24 MOV R18,R20
019A E309 LDI R16,0x39
019B DF8B RCALL _Command
(0224) Process();
019C DF6D RCALL _Process
(0225) }
019D 9621 ADIW R28,1
019E D45A RCALL pop_gset2
019F 9508 RET
_VerifyPassword:
temp --> Y+1
i --> R20
p --> R22
01A0 D475 RCALL push_gset2
01A1 2F60 MOV R22,R16
01A2 2F71 MOV R23,R17
01A3 9725 SBIW R28,5
(0226)
(0227) /**************校验密码*******************/
(0228) uchar VerifyPassword(uchar *p)
(0229) {uchar temp[4];//暂存4字节保护密码;
(0230) uchar i;
(0231) ReadSafeMemory(temp);//读安全代码以取得错误计数器
01A4 2F0C MOV R16,R28
01A5 2F1D MOV R17,R29
01A6 5F0F SUBI R16,0xFF
01A7 4F1F SBCI R17,0xFF
01A8 DFD4 RCALL _ReadSafeMemory
(0232) if((temp[0]&0x07)!=0)
01A9 8189 LDD R24,Y+1
01AA 7087 ANDI R24,7
01AB F179 BEQ 0x01DB
(0233) {if((temp[0]&0x07)==0x07) i=0x06;
01AC 8189 LDD R24,Y+1
01AD 7087 ANDI R24,7
01AE 3087 CPI R24,7
01AF F409 BNE 0x01B1
01B0 E046 LDI R20,6
(0234) if((temp[0]&0x07)==0x06) i=0x04;
01B1 8189 LDD R24,Y+1
01B2 7087 ANDI R24,7
01B3 3086 CPI R24,6
01B4 F409 BNE 0x01B6
01B5 E044 LDI R20,4
(0235) if((temp[0]&0x07)==0x04) i=0x00;
01B6 8189 LDD R24,Y+1
01B7 7087 ANDI R24,7
01B8 3084 CPI R24,4
01B9 F409 BNE 0x01BB
01BA 2744 CLR R20
(0236) WriteSafeMemory(0,i);
01BB 2F24 MOV R18,R20
01BC 2700 CLR R16
01BD DFD6 RCALL _WriteSafeMemory
(0237) for(i=1;i<4;i++,p++)
01BE E041 LDI R20,1
01BF C00B RJMP 0x01CB
(0238) {Command(0x33,i,*p);
01C0 2FE6 MOV R30,R22
01C1 2FF7 MOV R31,R23
01C2 8020 LDD R2,Z+0
01C3 8228 STD Y+0,R2
01C4 2F24 MOV R18,R20
01C5 E303 LDI R16,0x33
01C6 DF60 RCALL _Command
(0239) Process();}
01C7 DF42 RCALL _Process
01C8 9543 INC R20
01C9 5F6F SUBI R22,0xFF
01CA 4F7F SBCI R23,0xFF
01CB 3044 CPI R20,4
01CC F398 BCS 0x01C0
(0240) WriteSafeMemory(0,0xff);
01CD EF2F LDI R18,0xFF
01CE 2700 CLR R16
01CF DFC4 RCALL _WriteSafeMemory
(0241) ReadSafeMemory(temp);
01D0 2F0C MOV R16,R28
01D1 2F1D MOV R17,R29
01D2 5F0F SUBI R16,0xFF
01D3 4F1F SBCI R17,0xFF
01D4 DFA8 RCALL _ReadSafeMemory
(0242) if((temp[0]&0x07)==0x07) return(0x1);
01D5 8189 LDD R24,Y+1
01D6 7087 ANDI R24,7
01D7 3087 CPI R24,7
01D8 F411 BNE 0x01DB
01D9 E001 LDI R16,1
01DA C001 RJMP 0x01DC
(0243)
(0244) }
(0245) return(0);
01DB 2700 CLR R16
01DC 9625 ADIW R28,5
01DD D41B RCALL pop_gset2
01DE 9508 RET
_Change:
temp --> R20
i --> R22
N --> R10
Destination --> R18
Source --> R16
01DF D439 RCALL push_gset3
01E0 80AE LDD R10,Y+6
(0246) }
(0247) //*************SLE4442函数结束*****************//
(0248)
(0249) //*************数据变换**********//
(0250) void Change(uchar *Source,uchar *Destination,uchar N)
(0251) {uchar i,temp;
(0252) for(i=0;i<N;i++)
01E1 2766 CLR R22
01E2 C017 RJMP 0x01FA
(0253) {temp=Source[i];
01E3 2FE6 MOV R30,R22
01E4 27FF CLR R31
01E5 0FE0 ADD R30,R16
01E6 1FF1 ADC R31,R17
01E7 8140 LDD R20,Z+0
(0254) Destination[i]=temp>>4;
01E8 2FE6 MOV R30,R22
01E9 27FF CLR R31
01EA 0FE2 ADD R30,R18
01EB 1FF3 ADC R31,R19
01EC 2F84 MOV R24,R20
01ED 9582 SWAP R24
01EE 708F ANDI R24,0xF
01EF 8380 STD Z+0,R24
(0255) Destination[2*i+1]=temp&0x0f;}
01F0 2FE6 MOV R30,R22
01F1 27FF CLR R31
01F2 0FEE LSL R30
01F3 1FFF ROL R31
01F4 0FE2 ADD R30,R18
01F5 1FF3 ADC R31,R19
01F6 2F84 MOV R24,R20
01F7 708F ANDI R24,0xF
01F8 8381 STD Z+1,R24
01F9 9563 INC R22
01FA 156A CP R22,R10
01FB F338 BCS 0x01E3
(0256) }
01FC D3FE RCALL pop_gset3
01FD 9508 RET
_Buzzle_Password:
i --> R20
01FE D400 RCALL push_gset1
(0257)
(0258) //***********密码错误报警***********************//
(0259) void Buzzle_Password(void)
(0260) {uchar i;
(0261) for(i=0;i<2;i++)
01FF 2744 CLR R20
0200 C00B RJMP 0x020C
(0262) {Voice(0);
0201 2700 CLR R16
0202 DE3D RCALL _Voice
(0263) DelayMs(1000);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -