📄 s51.lis
字号:
.module s51.c
.area text(rom, con, rel)
0000 .dbfile E:\学习专区\AVR专区\个人创作区\ICC\s51.c
0000 .dbfunc e SendInstrc _SendInstrc fV
0000 ; n -> R20
0000 ; nByte -> R16
.even
0000 _SendInstrc::
0000 00D0 rcall push_gset1
0002 .dbline -1
0002 .dbline 13
0002 ; ///////////////////////////////////////////////////////////////////////////////////////////////////
0002 ; //FID=02:AT89S51系列编程器
0002 ; //实现编程的读,写,擦等细节
0002 ; ///////////////////////////////////////////////////////////////////////////////////////////////////
0002 ; #include <iom8v.h>
0002 ; #include <macros.h>
0002 ; #include<signal.h>
0002 ; #include<e51pro.h>
0002 ; #define uchar unsigned char
0002 ; BYTE OutBuf[4];//发送命令缓冲
0002 ; BYTE InBuf[4];//接收缓冲
0002 ; void SendInstrc(uchar nByte)//用MOSI串行发送命令的同时用MISO接收相关数据
0002 ; {
0002 .dbline 14
0002 ; uchar n=0;
0002 4427 clr R20
0004 .dbline 15
0004 ; DDRB=(1<<PB5)|(1<<PB3)|(1<<PB2);
0004 8CE2 ldi R24,44
0006 87BB out 0x17,R24
0008 .dbline 16
0008 ; SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);//SCK时钟为fosc/16
0008 81E5 ldi R24,81
000A 8DB9 out 0xd,R24
000C .dbline 17
000C ; for (n=0;n<nByte;n++)
000C 13C0 rjmp L5
000E L2:
000E .dbline 18
000E ; {
000E .dbline 19
000E ; SPDR=OutBuf[n];
000E 80E0 ldi R24,<_OutBuf
0010 90E0 ldi R25,>_OutBuf
0012 E42F mov R30,R20
0014 FF27 clr R31
0016 E80F add R30,R24
0018 F91F adc R31,R25
001A 2080 ldd R2,z+0
001C 2FB8 out 0xf,R2
001E L6:
001E .dbline 21
001E L7:
001E .dbline 20
001E 779B sbis 0xe,7
0020 FECF rjmp L6
0022 .dbline 22
0022 80E0 ldi R24,<_InBuf
0024 90E0 ldi R25,>_InBuf
0026 E42F mov R30,R20
0028 FF27 clr R31
002A E80F add R30,R24
002C F91F adc R31,R25
002E 2FB0 in R2,0xf
0030 2082 std z+0,R2
0032 .dbline 23
0032 L3:
0032 .dbline 17
0032 4395 inc R20
0034 L5:
0034 .dbline 17
0034 4017 cp R20,R16
0036 58F3 brlo L2
0038 .dbline -2
0038 L1:
0038 00D0 rcall pop_gset1
003A .dbline 0 ; func end
003A 0895 ret
003C .dbsym r n 20 c
003C .dbsym r nByte 16 c
003C .dbend
003C .dbfunc e InitPro02 _InitPro02 fV
.even
003C _InitPro02::
003C .dbline -1
003C .dbline 26
003C ; while (!(SPSR&(1<<SPIF)))
003C ; ;
003C ; InBuf[n]=SPDR;
003C ; }
003C ; }
003C ; void InitPro02()//编程前的准备工作
003C ; {
003C .dbline 27
003C ; DDRB=0xff;
003C 8FEF ldi R24,255
003E 87BB out 0x17,R24
0040 .dbline 28
0040 ; PORTB&=~BIT(PB2);
0040 C298 cbi 0x18,2
0042 .dbline 29
0042 ; Delay_ms(10);
0042 0AE0 ldi R16,10
0044 10E0 ldi R17,0
0046 00D0 rcall _Delay_ms
0048 .dbline 30
0048 ; PORTB|=BIT(PB2);
0048 C29A sbi 0x18,2
004A .dbline 31
004A ; PORTC|=BIT(PB1);
004A A99A sbi 0x15,1
004C .dbline 32
004C ; PORTC&=~BIT(PB0);
004C A898 cbi 0x15,0
004E .dbline 33
004E ; Delay_ms(10);
004E 0AE0 ldi R16,10
0050 10E0 ldi R17,0
0052 00D0 rcall _Delay_ms
0054 .dbline 34
0054 ; nAddress=0x0000;
0054 2224 clr R2
0056 3324 clr R3
0058 30920100 sts _nAddress+1,R3
005C 20920000 sts _nAddress,R2
0060 .dbline 35
0060 ; OutBuf[0]=0xac;//正好在这里可以安排DataSheet上所规定的
0060 8CEA ldi R24,172
0062 80930400 sts _OutBuf,R24
0066 .dbline 36
0066 ; OutBuf[1]=0x53;//Eanable Programming命令
0066 83E5 ldi R24,83
0068 80930500 sts _OutBuf+1,R24
006C .dbline 37
006C ; OutBuf[2]=0;
006C 20920600 sts _OutBuf+2,R2
0070 .dbline 38
0070 ; OutBuf[3]=0;
0070 20920700 sts _OutBuf+3,R2
0074 .dbline 39
0074 ; SendInstrc(4);
0074 04E0 ldi R16,4
0076 C4DF rcall _SendInstrc
0078 .dbline -2
0078 L9:
0078 .dbline 0 ; func end
0078 0895 ret
007A .dbend
007A .dbfunc e ProOver02 _ProOver02 fV
.even
007A _ProOver02::
007A .dbline -1
007A .dbline 43
007A ; }
007A ;
007A ; void ProOver02()//编程结束后的工作,设置合适的引脚电平
007A ; {
007A .dbline 44
007A ; PORTC|=BIT(PB0);
007A A89A sbi 0x15,0
007C .dbline 45
007C ; PORTC&=~BIT(PB1);
007C A998 cbi 0x15,1
007E .dbline 46
007E ; DDRB=0x00;
007E 2224 clr R2
0080 27BA out 0x17,R2
0082 .dbline -2
0082 L13:
0082 .dbline 0 ; func end
0082 0895 ret
0084 .dbend
0084 .dbfunc e Read02 _Read02 fc
.even
0084 _Read02::
0084 .dbline -1
0084 .dbline 50
0084 ; }
0084 ; uchar ComBuf[18];
0084 ; uchar Read02()
0084 ; {
0084 .dbline 51
0084 ; OutBuf[0]=0x20;
0084 80E2 ldi R24,32
0086 80930400 sts _OutBuf,R24
008A .dbline 52
008A ; OutBuf[1]=((uchar*)&nAddress)[1];
008A 20900100 lds R2,_nAddress+1
008E 20920500 sts _OutBuf+1,R2
0092 .dbline 53
0092 ; OutBuf[2]=((uchar*)&nAddress)[0];
0092 E0E0 ldi R30,<_nAddress
0094 F0E0 ldi R31,>_nAddress
0096 2080 ldd R2,z+0
0098 20920600 sts _OutBuf+2,R2
009C .dbline 54
009C ; SendInstrc(4);
009C 04E0 ldi R16,4
009E B0DF rcall _SendInstrc
00A0 .dbline 55
00A0 ; return InBuf[3];
00A0 00910300 lds R16,_InBuf+3
00A4 .dbline -2
00A4 L14:
00A4 .dbline 0 ; func end
00A4 0895 ret
00A6 .dbend
00A6 .dbfunc e ReadSign02 _ReadSign02 fV
.even
00A6 _ReadSign02::
00A6 .dbline -1
00A6 .dbline 59
00A6 ; }
00A6 ;
00A6 ; void ReadSign02()//读特征字
00A6 ; {
00A6 .dbline 60
00A6 ; InitPro02();//先设置成编程状态
00A6 CADF rcall _InitPro02
00A8 .dbline 63
00A8 ; //-----------------------------------------------------------------------------
00A8 ; //根据器件的DataSheet,设置相应的编程控制信号
00A8 ; OutBuf[0]=0x28;
00A8 88E2 ldi R24,40
00AA 80930400 sts _OutBuf,R24
00AE .dbline 64
00AE ; OutBuf[1]=0x00;
00AE 2224 clr R2
00B0 20920500 sts _OutBuf+1,R2
00B4 .dbline 65
00B4 ; OutBuf[2]=0x00;
00B4 20920600 sts _OutBuf+2,R2
00B8 .dbline 66
00B8 ; OutBuf[3]=0x00;
00B8 20920700 sts _OutBuf+3,R2
00BC .dbline 67
00BC ; SendInstrc(4);
00BC 04E0 ldi R16,4
00BE A0DF rcall _SendInstrc
00C0 .dbline 68
00C0 ; ComBuf[2]=InBuf[3];
00C0 20900300 lds R2,_InBuf+3
00C4 20920A00 sts _ComBuf+2,R2
00C8 .dbline 69
00C8 ; OutBuf[1]=0x01;
00C8 81E0 ldi R24,1
00CA 80930500 sts _OutBuf+1,R24
00CE .dbline 70
00CE ; SendInstrc(4);
00CE 04E0 ldi R16,4
00D0 97DF rcall _SendInstrc
00D2 .dbline 71
00D2 ; ComBuf[3]=InBuf[3];
00D2 20900300 lds R2,_InBuf+3
00D6 20920B00 sts _ComBuf+3,R2
00DA .dbline 72
00DA ; OutBuf[1]=0x02;
00DA 82E0 ldi R24,2
00DC 80930500 sts _OutBuf+1,R24
00E0 .dbline 73
00E0 ; SendInstrc(4);
00E0 04E0 ldi R16,4
00E2 8EDF rcall _SendInstrc
00E4 .dbline 74
00E4 ; ComBuf[4]=InBuf[3];
00E4 20900300 lds R2,_InBuf+3
00E8 20920C00 sts _ComBuf+4,R2
00EC .dbline 76
00EC ; //-----------------------------------------------------------------------------
00EC ; ProOver02();
00EC C6DF rcall _ProOver02
00EE .dbline -2
00EE L19:
00EE .dbline 0 ; func end
00EE 0895 ret
00F0 .dbend
00F0 .dbfunc e Erase02 _Erase02 fV
.even
00F0 _Erase02::
00F0 .dbline -1
00F0 .dbline 80
00F0 ; }
00F0 ;
00F0 ; void Erase02()//擦除器件
00F0 ; {
00F0 .dbline 81
00F0 ; InitPro02();
00F0 A5DF rcall _InitPro02
00F2 .dbline 84
00F2 ; //-----------------------------------------------------------------------------
00F2 ; //根据器件的DataSheet,设置相应的编程控制信号
00F2 ; OutBuf[0]=0xac;
00F2 8CEA ldi R24,172
00F4 80930400 sts _OutBuf,R24
00F8 .dbline 85
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -