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

📄 charger.lst

📁 a good program for battery charge,only for reference
💻 LST
📖 第 1 页 / 共 5 页
字号:
    01D5 0000      NOP
(0160)   _nop_();
    01D6 0000      NOP
(0161)   _nop_();
    01D7 0000      NOP
(0162)   _nop_();
    01D8 0000      NOP
(0163)   _nop_();         
    01D9 0000      NOP
(0164)   PORTC &= ~(1<<SCL);   
    01DA 9845      CBI	0x08,5
(0165)   _nop_();
    01DB 0000      NOP
(0166)   _nop_();     
    01DC 0000      NOP
    01DD 9508      RET
(0167) }
(0168) /*******************************************************************
(0169)                       结束总线函数               
(0170) 函数原型: void  Stop_I2c();  
(0171) 功能:       结束I2C总线,即发送I2C结束条件.
(0172)   
(0173) ********************************************************************/
(0174) void Stop_I2c()
(0175) {
(0176)   PORTC &= ~(1<<SDA);  		/*发送结束条件的数据信号*/
_Stop_I2c:
    01DE 9844      CBI	0x08,4
(0177)   _nop_();   				/*发送结束条件的时钟信号*/
    01DF 0000      NOP
(0178)   PORTC |= (1<<SCL);  		/*结束条件建立时间大于4μs*/
    01E0 9A45      SBI	0x08,5
(0179)   _nop_();
    01E1 0000      NOP
(0180)   _nop_();
    01E2 0000      NOP
(0181)   _nop_();
    01E3 0000      NOP
(0182)   _nop_();
    01E4 0000      NOP
(0183)   _nop_();
    01E5 0000      NOP
(0184)   PORTC |= (1<<SDA);  		/*发送I2C总线结束信号*/
    01E6 9A44      SBI	0x08,4
(0185)   _nop_();
    01E7 0000      NOP
(0186)   _nop_();
    01E8 0000      NOP
(0187)   _nop_();
    01E9 0000      NOP
(0188)   _nop_(); 
    01EA 0000      NOP
    01EB 9508      RET
_SendByte:
  BitCnt               --> R20
  c                    --> R22
    01EC D5CD      RCALL	push_gset2
    01ED 2F60      MOV	R22,R16
(0189) }
(0190) /*******************************************************************
(0191)                  字节数据传送函数               
(0192) 函数原型: void  SendByte(unsigned char c);
(0193) 功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
(0194)      此状态位进行操作.(不应答或非应答都使ack=0 假)     
(0195)      发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
(0196) ********************************************************************/
(0197) void  SendByte(unsigned char c)
(0198) {
(0199)  unsigned char BitCnt;
(0200)  for(BitCnt=0;BitCnt<8;BitCnt++)  				/*要传送的数据长度为8位*/
    01EE 2744      CLR	R20
    01EF C013      RJMP	0x0203
(0201)     {
(0202)      if((c<<BitCnt)&0x80){PORTC |= (1<<SDA);}   /*判断发送位*/
    01F0 2F06      MOV	R16,R22
    01F1 2F14      MOV	R17,R20
    01F2 D5E0      RCALL	lsl8
    01F3 2F80      MOV	R24,R16
    01F4 7880      ANDI	R24,0x80
    01F5 F011      BEQ	0x01F8
    01F6 9A44      SBI	0x08,4
    01F7 C001      RJMP	0x01F9
(0203)        else  {PORTC &= ~(1<<SDA);}                
    01F8 9844      CBI	0x08,4
(0204)      _nop_();
    01F9 0000      NOP
(0205)      PORTC |= (1<<SCL);               			/*置时钟线为高,通知被控器开始接收数据位*/
    01FA 9A45      SBI	0x08,5
(0206)       _nop_(); 
    01FB 0000      NOP
(0207)       _nop_();               		  			/*保证时钟高电平周期大于4μs*/
    01FC 0000      NOP
(0208)       _nop_();
    01FD 0000      NOP
(0209)       _nop_();
    01FE 0000      NOP
(0210)       _nop_(); 
    01FF 0000      NOP
(0211) 	  _nop_();     
    0200 0000      NOP
(0212)      PORTC &= ~(1<<SCL); 
    0201 9845      CBI	0x08,5
    0202 9543      INC	R20
    0203 3048      CPI	R20,0x8
    0204 F358      BCS	0x01F0
(0213)     }
(0214) 
(0215) 	_nop_();
    0205 0000      NOP
(0216)     _nop_();
    0206 0000      NOP
(0217)     _nop_();	
    0207 0000      NOP
(0218)     PORTC |= (1<<SDA);               			/*8位发送完后释放数据线,准备接收应答位*/
    0208 9A44      SBI	0x08,4
(0219) 	 _nop_();
    0209 0000      NOP
(0220)     _nop_(); 
    020A 0000      NOP
(0221) 	_nop_();
    020B 0000      NOP
(0222)     PORTC |= (1<<SCL);
    020C 9A45      SBI	0x08,5
(0223)     _nop_();
    020D 0000      NOP
(0224)     _nop_();
    020E 0000      NOP
(0225)     _nop_();
    020F 0000      NOP
(0226) 	_nop_();
    0210 0000      NOP
(0227) 	_nop_();
    0211 0000      NOP
(0228)  if((PINC&(1<<SDA))==1){temp &= ~(1<<ack);}     
    0212 B186      IN	R24,0x06
    0213 7180      ANDI	R24,0x10
    0214 3081      CPI	R24,1
    0215 F431      BNE	0x021C
    0216 91800116  LDS	R24,temp
    0218 7F8E      ANDI	R24,0xFE
    0219 93800116  STS	temp,R24
    021B C005      RJMP	0x0221
(0229)        else {temp |= (1<<ack);}        			/*判断是否接收到应答信号*/
    021C 91800116  LDS	R24,temp
    021E 6081      ORI	R24,1
    021F 93800116  STS	temp,R24
(0230)     PORTC &= ~(1<<SCL);
    0221 9845      CBI	0x08,5
(0231)     _nop_();
    0222 0000      NOP
(0232)     _nop_();
    0223 0000      NOP
(0233) 	_nop_();
    0224 0000      NOP
(0234) 	_nop_();   	
    0225 0000      NOP
    0226 D58B      RCALL	pop_gset2
    0227 9508      RET
_TC1321_SET:
  tem                  --> Y+0
  i                    --> R20
  DA_SET               --> R20
    0228 D593      RCALL	push_gset1
    0229 01A8      MOVW	R20,R16
    022A 9724      SBIW	R28,4
(0235) }
(0236) /*******************************************************************
(0237)                     向有子地址器件发送多字节数据函数               
(0238) 函数原型: bit TC1321_SET(unsigned int DA_SET);  
(0239) 功能:     设定TC1321的DATA寄存器,从而控制输出所设定的电压值:(DA_SET/1024)*VREF.
(0240) 注意:    																		  
(0241) ****************************14.3V时候的D/A输出值*******************************/
(0242) TC1321_SET(unsigned int DA_SET)
(0243) {
(0244)    unsigned char i;
(0245)    unsigned char tem[4];
(0246)    temp_det();
    022B D0E0      RCALL	_temp_det
(0247)     _nop_();     
    022C 0000      NOP
(0248)   temp_det();
    022D D0DE      RCALL	_temp_det
(0249)     _nop_();  
    022E 0000      NOP
(0250) 	xxyy=now_temp-5;
    022F 91800107  LDS	R24,now_temp
    0231 91900108  LDS	R25,now_temp+1
    0233 9705      SBIW	R24,5
    0234 9390011C  STS	xxyy+1,R25
    0236 9380011B  STS	xxyy,R24
(0251) 	DA_SET=ABC[xxyy];
    0238 019C      MOVW	R18,R24
    0239 E002      LDI	R16,2
    023A E010      LDI	R17,0
    023B D566      RCALL	empy16s
    023C 01F8      MOVW	R30,R16
    023D E384      LDI	R24,0x34
    023E E090      LDI	R25,0
    023F 0FE8      ADD	R30,R24
    0240 1FF9      ADC	R31,R25
    0241 9145      LPM	R20,Z+
    0242 9154      LPM	R21,0(Z)
(0252) 
(0253) 	if(now_temp <6)	  
    0243 91800107  LDS	R24,now_temp
    0245 91900108  LDS	R25,now_temp+1
    0247 3086      CPI	R24,6
    0248 E0E0      LDI	R30,0
    0249 079E      CPC	R25,R30
    024A F414      BGE	0x024D
(0254) 		{
(0255) 		DA_SET=735;
    024B ED4F      LDI	R20,0xDF
    024C E052      LDI	R21,2
(0256) 		}			
(0257)    
(0258)    tem[0]=0x90;	 		
    024D E980      LDI	R24,0x90
    024E 8388      STD	Y+0,R24
(0259)    tem[1]=0x00;			  
    024F 2422      CLR	R2
    0250 8229      STD	Y+1,R2
(0260)    tem[2]=DA_SET/4;		
    0251 011A      MOVW	R2,R20
    0252 9436      LSR	R3
    0253 9427      ROR	R2
    0254 9436      LSR	R3
    0255 9427      ROR	R2
    0256 822A      STD	Y+2,R2
(0261)    tem[3]=DA_SET%4;		  
    0257 01CA      MOVW	R24,R20
    0258 7083      ANDI	R24,3
    0259 7090      ANDI	R25,0
    025A 838B      STD	Y+3,R24
(0262)    tem[3]=tem[3]<<6;	
    025B 2E28      MOV	R2,R24
    025C 0C22      LSL	R2
    025D 0C22      LSL	R2
    025E 0C22      LSL	R2
    025F 0C22      LSL	R2
    0260 0C22      LSL	R2
    0261 0C22      LSL	R2
    0262 822B      STD	Y+3,R2
(0263) 
(0264)    Start_I2c();             
    0263 DF68      RCALL	_Start_I2c
(0265)      for(i=0;i<4;i++)
    0264 2744      CLR	R20
    0265 C00F      RJMP	0x0275
(0266)     {   
(0267)      SendByte(tem[i]);            
    0266 01CE      MOVW	R24,R28
    0267 2FE4      MOV	R30,R20
    0268 27FF      CLR	R31
    0269 0FE8      ADD	R30,R24
    026A 1FF9      ADC	R31,R25
    026B 8100      LDD	R16,Z+0
    026C DF7F      RCALL	_SendByte
(0268) 	   if((temp&(1<<ack))==0)return(0);  
    026D 90200116  LDS	R2,temp
    026F FC20      SBRC	R2,0
    0270 C003      RJMP	0x0274
    0271 2700      CLR	R16
    0272 2711      CLR	R17
    0273 C006      RJMP	0x027A
    0274 9543      INC	R20
    0275 3044      CPI	R20,4
    0276 F378      BCS	0x0266
(0269)      } 
(0270)   Stop_I2c();               
    0277 DF66      RCALL	_Stop_I2c
(0271)   return(1);   
    0278 E001      LDI	R16,1
    0279 E010      LDI	R17,0
    027A 9624      ADIW	R28,4
    027B D543      RCALL	pop_gset1
    027C 9508      RET
_TC1321_SET_138:
  tem                  --> Y+0
  i                    --> R20
  DA_SET               --> R20
    027D D53E      RCALL	push_gset1
    027E 01A8      MOVW	R20,R16
    027F 9724      SBIW	R28,4
(0272) }
(0273) /**********************13.8V时候的D/A输出值  ***************************/
(0274) TC1321_SET_138(unsigned int DA_SET)
(0275) {
(0276)    unsigned char i;
(0277)    unsigned char tem[4];
(0278)    temp_det();
    0280 D08B      RCALL	_temp_det
(0279)     _nop_();     
    0281 0000      NOP
(0280)   temp_det();
    0282 D089      RCALL	_temp_det
(0281)     _nop_();  
    0283 0000      NOP
(0282)  
(0283) 	xxyy=now_temp+5;
    0284 91800107  LDS	R24,now_temp
    0286 91900108  LDS	R25,now_temp+1
    0288 9605      ADIW	R24,5
    0289 9390011C  STS	xxyy+1,R25
    028B 9380011B  STS	xxyy,R24
(0284) 	DA_SET=ABC_2[xxyy];
    028D 019C      MOVW	R18,R24
    028E E002      LDI	R16,2
    028F E010      LDI	R17,0
    0290 D511      RCALL	empy16s
    0291 01F8      MOVW	R30,R16
    0292 ED86      LDI	R24,0xD6
    0293 E090      LDI	R25,0
    0294 0FE8      ADD	R30,R24
    0295 1FF9      ADC	R31,R25
    0296 9145      LPM	R20,Z+
    0297 9154      LPM	R21,0(Z)
(0285) 
(0286) 	if(now_temp <-4 )	  		   //温度小于-30°时候输出15.3V
    0298 91800107  LDS	R24,now_temp
    029A 91900108  LDS	R25,now_temp+1
    029C 3F8C      CPI	R24,0xFC
    029D EFEF      LDI	R30,0xFF
    029E 079E      CPC	R25,R30
    029F F414      BGE	0x02A2
(0287) 		{
(0288) 		DA_SET=752;
    02A0 EF40      LDI	R20,0xF0
    02A1 E052      LDI	R21,2
(0289) 		}			   
(0290)    
(0291)    tem[0]=0x90;	 		
    02A2 E980      LDI	R24,0x90
    02A3 8388      STD	Y+0,R24
(0292)    tem[1]=0x00;			  
    02A4 2422      CLR	R2
    02A5 8229      STD	Y+1,R2
(0293)    tem[2]=DA_SET/4;		
    02A6 011A      MOVW	R2,R20
    02A7 9436      LSR	R3
    02A8 9427      ROR	R2
    02A9 9436      LSR	R3
    02AA 9427      ROR	R2
    02AB 822A      STD	Y+2,R2
(0294)    tem[3]=DA_SET%4;		  
    02AC 01CA      MOVW	R24,R20
    02AD 7083      ANDI	R24,3
    02AE 7090      ANDI	R25,0
    02AF 838B      STD	Y+3,R24
(0295)    tem[3]=tem[3]<<6;	
    02B0 2E28      MOV	R2,R24
    02B1 0C22      LSL	R2
    02B2 0C22      LSL	R2
    02B3 0C22      LSL	R2
    02B4 0C22      LSL	R2
    02B5 0C22      LSL	R2
    02B6 0C22      LSL	R2
    02B7 822B      STD	Y+3,R2
(0296) 
(0297)    Start_I2c();             
    02B8 DF13      RCALL	_Start_I2c
(0298)      for(i=0;i<4;i++)
    02B9 2744      CLR	R20
    02BA C00F      RJMP	0x02CA
(0299)     {   
(0300)      SendByte(tem[i]);            
    02BB 01CE      MOVW	R24,R28
    02BC 2FE4      MOV	R30,R20
    02BD 27FF      CLR	R31
    02BE 0FE8      ADD	R30,R24
    02BF 1FF9      ADC	R31,R25
    02C0 8100      LDD	R16,Z+0

⌨️ 快捷键说明

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