📄 51.lst
字号:
0135 9380007E STS 0x7E,R24
(0152) pw.fpWrite=Write02;
0137 E28C LDI R24,0x2C
0138 E090 LDI R25,0
0139 93900081 STS 0x81,R25
013B 93800080 STS 0x80,R24
(0153) pw.fpRead=Read02;
013D E28A LDI R24,0x2A
013E E090 LDI R25,0
013F 93900083 STS 0x83,R25
0141 93800082 STS 0x82,R24
(0154) pw.fpLock=Lock02;
0143 E288 LDI R24,0x28
0144 E090 LDI R25,0
0145 93900085 STS 0x85,R25
0147 93800084 STS 0x84,R24
(0155) pw.fpProOver=ProOver02;
0149 E286 LDI R24,0x26
014A E090 LDI R25,0
014B 93900087 STS 0x87,R25
014D 93800086 STS 0x86,R24
014F 9508 RET
_Delay_us:
a --> R20
b --> R22
us --> R16
0150 D1EE RCALL push_gset2
FILE: E:\学习专区\AVR专区\个人创作区\ICC\51pro.c
(0001) //////////////////////////////////////////////////////////////////////////////////////////////////
(0002) //E51Pro.c
(0003) //Easy 51Pro编程器主程序,负责通讯,管理编程操作
(0004) ///////////////////////////////////////////////////////////////////////////////////////////////////
(0005)
(0006) #include <iom8v.h>
(0007) #include <macros.h>
(0008) #include <e51pro.h>
(0009) #include <signal.h>
(0010) #define uchar unsigned char
(0011) //BYTE ComBuf[18];//串口通讯数据缓存,发送和接收都使用
(0012) UINT nAddress;//ROM中地址计数
(0013) UINT nTimeOut;//超时计数
(0014) ProWork pw;//编程器一般操作
(0015) void Delay_us(BYTE us)//微秒级延时<255us
(0016) {
(0017) char a=0;
0151 2744 CLR R20
(0018) char b=0;
0152 2766 CLR R22
(0019) for (a=0;a<7;a++)
0153 C006 RJMP 0x015A
(0020) for (b=0;b<us;b++)
0154 2766 CLR R22
0155 C001 RJMP 0x0157
0156 9563 INC R22
0157 1760 CP R22,R16
0158 F3E8 BCS 0x0156
0159 9543 INC R20
015A 3047 CPI R20,7
015B F3C0 BCS 0x0154
015C D1DA RCALL pop_gset2
015D 9508 RET
_Delay_ms:
a --> R20
b --> R22
ms --> R16
015E D1E0 RCALL push_gset2
(0021) ;
(0022) }
(0023) void Delay_ms(UINT ms)//豪秒级的延时<65535ms
(0024) {
(0025) int a=0;
015F 2744 CLR R20
0160 2755 CLR R21
(0026) int b=0;
0161 2766 CLR R22
0162 2777 CLR R23
(0027) for (a=0;a<4000;a++)
(0028) for (b=0;b<ms;b++)
0163 2766 CLR R22
0164 2777 CLR R23
0165 C002 RJMP 0x0168
0166 5F6F SUBI R22,0xFF
0167 4F7F SBCI R23,0xFF
0168 1760 CP R22,R16
0169 0771 CPC R23,R17
016A F3D8 BCS 0x0166
016B 5F4F SUBI R20,0xFF
016C 4F5F SBCI R21,0xFF
016D 3A40 CPI R20,0xA0
016E E0EF LDI R30,0xF
016F 075E CPC R21,R30
0170 F394 BLT 0x0163
0171 D1C5 RCALL pop_gset2
0172 9508 RET
(0029) ;
(0030) }
(0031)
(0032)
(0033) void uart_init(void) //串口通信
(0034) {
(0035) UCSRB|=(TXEN)|(1<<RXEN);
_uart_init:
0173 B18A IN R24,0x0A
0174 6183 ORI R24,0x13
0175 B98A OUT 0x0A,R24
(0036) UBRRL=7; //设置波特率 57600
0176 E087 LDI R24,7
0177 B989 OUT 0x09,R24
(0037) UBRRH=0x00;
0178 2422 CLR R2
0179 BC20 OUT 0x20,R2
(0038) UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
017A B580 IN R24,0x20
017B 6886 ORI R24,0x86
017C BD80 OUT 0x20,R24
017D 9508 RET
(0039) }
(0040) void uart_putchar(char x)//发送数据
(0041) {
(0042) while (!(UCSRA&0x20))
_uart_putchar:
x --> R16
017E 9B5D SBIS 0x0B,5
017F CFFE RJMP _uart_putchar
(0043) ;
(0044) UDR=x;
0180 B90C OUT 0x0C,R16
0181 9508 RET
(0045) }
(0046)
(0047) BOOL WaitComm()//等待上位机的命令,18字节
(0048) {
(0049) BYTE n=0;
_WaitComm:
n --> R16
0182 2700 CLR R16
(0050) while(!(UCSRA&0x80)){}//等待第一个字节
0183 9B5F SBIS 0x0B,7
0184 CFFE RJMP 0x0183
(0051) ComBuf[n]=UDR;
0185 E688 LDI R24,0x68
0186 E090 LDI R25,0
0187 2FE0 MOV R30,R16
0188 27FF CLR R31
0189 0FE8 ADD R30,R24
018A 1FF9 ADC R31,R25
018B B02C IN R2,0x0C
018C 8220 STD Z+0,R2
(0052) n++;
018D 9503 INC R16
(0053) for(n;n<=17;n++)
018E C026 RJMP 0x01B5
(0054) {
(0055) nTimeOut=0;
018F 2422 CLR R2
0190 2433 CLR R3
0191 92300089 STS nTimeOut+1,R3
0193 92200088 STS nTimeOut,R2
0195 C014 RJMP 0x01AA
(0056) while(!(UCSRA&0x80))
(0057) {
(0058) nTimeOut++;
0196 91800088 LDS R24,nTimeOut
0198 91900089 LDS R25,nTimeOut+1
019A 9601 ADIW R24,1
019B 93900089 STS nTimeOut+1,R25
019D 93800088 STS nTimeOut,R24
(0059) if(nTimeOut>10000)//后17个字节都有超时限制
019F E180 LDI R24,0x10
01A0 E297 LDI R25,0x27
01A1 90200088 LDS R2,nTimeOut
01A3 90300089 LDS R3,nTimeOut+1
01A5 1582 CP R24,R2
01A6 0593 CPC R25,R3
01A7 F410 BCC 0x01AA
(0060) return 0;
01A8 2700 CLR R16
01A9 C00F RJMP 0x01B9
01AA 9B5F SBIS 0x0B,7
01AB CFEA RJMP 0x0196
(0061) }
(0062) ComBuf[n]=UDR;
01AC E688 LDI R24,0x68
01AD E090 LDI R25,0
01AE 2FE0 MOV R30,R16
01AF 27FF CLR R31
01B0 0FE8 ADD R30,R24
01B1 1FF9 ADC R31,R25
01B2 B02C IN R2,0x0C
01B3 8220 STD Z+0,R2
01B4 9503 INC R16
01B5 E181 LDI R24,0x11
01B6 1780 CP R24,R16
01B7 F6B8 BCC 0x018F
(0063)
(0064) }
(0065) return 1;
01B8 E001 LDI R16,1
01B9 9508 RET
(0066) }
(0067) BOOL WaitResp()//等待上位机回应,1字节,有超时限制
(0068) {
(0069) nTimeOut=0;
_WaitResp:
01BA 2422 CLR R2
01BB 2433 CLR R3
01BC 92300089 STS nTimeOut+1,R3
01BE 92200088 STS nTimeOut,R2
01C0 C014 RJMP 0x01D5
(0070) while(!(UCSRA&0x80))
(0071) {
(0072) nTimeOut++;
01C1 91800088 LDS R24,nTimeOut
01C3 91900089 LDS R25,nTimeOut+1
01C5 9601 ADIW R24,1
01C6 93900089 STS nTimeOut+1,R25
01C8 93800088 STS nTimeOut,R24
(0073) if(nTimeOut>50000)
01CA E580 LDI R24,0x50
01CB EC93 LDI R25,0xC3
01CC 90200088 LDS R2,nTimeOut
01CE 90300089 LDS R3,nTimeOut+1
01D0 1582 CP R24,R2
01D1 0593 CPC R25,R3
01D2 F410 BCC 0x01D5
(0074) {
(0075) return 0;
01D3 2700 CLR R16
01D4 C006 RJMP 0x01DB
01D5 9B5F SBIS 0x0B,7
01D6 CFEA RJMP 0x01C1
(0076) }
(0077) }
(0078)
(0079) ComBuf[0]=UDR;
01D7 B02C IN R2,0x0C
01D8 92200068 STS ComBuf,R2
(0080) return 1;
01DA E001 LDI R16,1
01DB 9508 RET
(0081) }
(0082)
(0083) BOOL WaitData()//写器件时等待上位机数据,18字节,有超时限制
(0084) {
(0085) BYTE n;
(0086) for(n=0;n<=17;n++)
_WaitData:
n --> R16
01DC 2700 CLR R16
01DD C026 RJMP 0x0204
(0087) {
(0088) nTimeOut=0;
01DE 2422 CLR R2
01DF 2433 CLR R3
01E0 92300089 STS nTimeOut+1,R3
01E2 92200088 STS nTimeOut,R2
01E4 C014 RJMP 0x01F9
(0089) while(!(UCSRA&0x80))
(0090) {
(0091) nTimeOut++;
01E5 91800088 LDS R24,nTimeOut
01E7 91900089 LDS R25,nTimeOut+1
01E9 9601 ADIW R24,1
01EA 93900089 STS nTimeOut+1,R25
01EC 93800088 STS nTimeOut,R24
(0092) if(nTimeOut>10000)
01EE E180 LDI R24,0x10
01EF E297 LDI R25,0x27
01F0 90200088 LDS R2,nTimeOut
01F2 90300089 LDS R3,nTimeOut+1
01F4 1582 CP R24,R2
01F5 0593 CPC R25,R3
01F6 F410 BCC 0x01F9
(0093) {
(0094) return 0;
01F7 2700 CLR R16
01F8 C00F RJMP 0x0208
01F9 9B5F SBIS 0x0B,7
01FA CFEA RJMP 0x01E5
(0095) }
(0096) }
(0097) ComBuf[n]=UDR;
01FB E688 LDI R24,0x68
01FC E090 LDI R25,0
01FD 2FE0 MOV R30,R16
01FE 27FF CLR R31
01FF 0FE8 ADD R30,R24
0200 1FF9 ADC R31,R25
0201 B02C IN R2,0x0C
0202 8220 STD Z+0,R2
0203 9503 INC R16
0204 E181 LDI R24,0x11
0205 1780 CP R24,R16
0206 F6B8 BCC 0x01DE
(0098) }
(0099) return 1;
0207 E001 LDI R16,1
0208 9508 RET
_SendData:
n --> R20
0209 D137 RCALL push_gset1
(0100) }
(0101)
(0102) void SendData()//发送数据或回应操作完成,18字节
(0103) {
(0104) BYTE n=0;
020A 2744 CLR R20
(0105) for(n;n<=17;n++)
020B C009 RJMP 0x0215
(0106) {
(0107) uart_putchar(ComBuf[n]);
020C E688 LDI R24,0x68
020D E090 LDI R25,0
020E 2FE4 MOV R30,R20
020F 27FF CLR R31
0210 0FE8 ADD R30,R24
0211 1FF9 ADC R31,R25
0212 8100 LDD R16,Z+0
0213 DF6A RCALL _uart_putchar
0214 9543 INC R20
0215 E181 LDI R24,0x11
0216 1784 CP R24,R20
0217 F7A0 BCC 0x020C
0218 D12B RCALL pop_gset1
0219 9508 RET
(0108) }
(0109) }
(0110)
(0111) void SendResp()//回应上位机1个字节,在写器件函数中使用
(0112) {
(0113) uart_putchar(ComBuf[0]);
_SendResp:
021A 91000068 LDS R16,ComBuf
021C DF61 RCALL _uart_putchar
021D 9508 RET
(0114) }
(0115)
(0116) void RstPro()//编程器复位
(0117) {
(0118) pw.fpProOver();//直接编程结束
_RstPro:
021E 91E00086 LDS R30,0x86
0220 91F00087 LDS R31,0x87
0222 D135 RCALL xicall
(0119) SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同
0223 DFE5 RCALL _SendData
0224 9508 RET
(0120) }
(0121)
(0122) void ReadSign()//读特征字
(0123) {
(0124) pw.fpReadSign();
_ReadSign:
0225 91E0007C LDS R30,pw+2
0227 91F0007D LDS R31,pw+3
0229 D12E RCALL xicall
(0125) SendData();//通知上位机,送出读出器件特征字
022A DFDE RCALL _SendData
022B 9508 RET
(0126) }
(0127)
(0128) void Erase()//擦除器件
(0129) {
(0130) pw.fpErase();
_Erase:
022C 91E0007E LDS R30,0x7E
022E 91F0007F LDS R31,0x7F
0230 D127 RCALL xicall
(0131) SendData();//通知上位机,擦除了器件
0231 DFD7 RCALL _SendData
0232 9508 RET
_Write:
n --> R20
0233 D10D RCALL push_gset1
(0132) }
(0133)
(0134) void Write()//写器件
(0135) {
(0136) BYTE n;
(0137) pw.fpInitPro();//编程前的准备工作
0234 91E0007A LDS R30,pw
0236 91F0007B LDS R31,pw+1
0238 D11F RCALL xicall
(0138) SendData();//回应上位机表示进入写器件状态,可以发来数据
0239 DFCF RCALL _SendData
023A C047 RJMP 0x0282
(0139) while(1)
(0140) {
(0141) if(WaitData())//如果等待数据成功
023B DFA0 RCALL _WaitData
023C 2300 TST R16
023D F409 BNE 0x023F
023E C03D RJMP 0x027C
(0142) {
(0143) if(ComBuf[0]==0x07)//判断是否继续写
023F 91800068 LDS R24,ComBuf
0241 3087 CPI R24,7
0242 F009 BEQ 0x0244
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -