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

📄 51.lst

📁 笔者的《用M8L制作的89S51单片机 USB下载线》在无线电2007年第9期已刊登过
💻 LST
📖 第 1 页 / 共 3 页
字号:
    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 + -