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

📄 communication.s

📁 基于PIC单片机
💻 S
📖 第 1 页 / 共 5 页
字号:
	.dbline 343
; 	}	
; 	i2c_wt_8bit(device_rd);  //写I2C从器件地址及读方式	
	mov R16,R10
	xcall _i2c_wt_8bit
	.dbline 344
L164:
	.dbline 344
L165:
	.dbline 344
; 	Wait();                 //等
	lds R2,116
	sbrs R2,7
	rjmp L164
	.dbline 344
	.dbline 344
	.dbline 345
; 	if(TestAck()!=TWI_MRX_ADR_ACK )  //ACK
	lds R24,113
	andi R24,248
	cpi R24,64
	breq L167
	.dbline 346
; 	{
	.dbline 347
; 	    TWI_Master_Initialise(); 
	xcall _TWI_Master_Initialise
	.dbline 348
; 	    return 1;    //出错	
	ldi R16,1
	xjmp L138
L167:
	.dbline 350
; 	}	
; 	TWCR = (1<<TWEN)|                          // TWI Interface enabled
	ldi R24,196
	sts 116,R24
	.dbline 354
;            (0<<TWIE)|(1<<TWINT)|               // Enable TWI Interupt and clear the flag to read next byte
;            (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|    // Send ACK after reception
;            (0<<TWWC); 
; 	delay_nus(25);  //最低值!25 
	ldi R16,25
	ldi R17,0
	xcall _delay_nus
	.dbline 355
;     for(j=1;j<num;j++)   //读取num-1个
	ldi R22,1
	xjmp L172
L169:
	.dbline 356
; 	{
	.dbline 357
; 	    if(TestAck()!= TWI_MRX_DATA_ACK  )  //ACK
	lds R24,113
	andi R24,248
	cpi R24,80
	breq L173
	.dbline 358
; 		{
	.dbline 359
; 		    TWI_Master_Initialise(); 
	xcall _TWI_Master_Initialise
	.dbline 360
; 	        return 1;    //出错	
	ldi R16,1
	xjmp L138
L173:
	.dbline 362
	ldi R24,<_i2c_rd_buff-1
	ldi R25,>_i2c_rd_buff-1
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	lds R2,115
	std z+0,R2
	.dbline 363
	ldi R24,196
	sts 116,R24
	.dbline 367
	ldi R16,25
	ldi R17,0
	xcall _delay_nus
	.dbline 368
L170:
	.dbline 355
	inc R22
L172:
	.dbline 355
	cp R22,R20
	brlo L169
	.dbline 369
; 		}	
; 		i2c_rd_buff[j-1]=TWDR;  //读取数
; 		TWCR = (1<<TWEN)|                          // TWI Interface enabled
;                (0<<TWIE)|(1<<TWINT)|               // Enable TWI Interupt and clear the flag to read next byte
;                (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|    // Send ACK after reception
;                (0<<TWWC); 	
; 		delay_nus(25);   //最低值! 25
; 	}	
; 	if(TestAck()!= TWI_MRX_DATA_ACK  )  //ACK
	lds R24,113
	andi R24,248
	cpi R24,80
	breq L176
	.dbline 370
; 	{
	.dbline 371
; 	    TWI_Master_Initialise(); 
	xcall _TWI_Master_Initialise
	.dbline 372
; 	    return 1;    //出错	
	ldi R16,1
	xjmp L138
L176:
	.dbline 374
; 	}	
;     i2c_rd_buff[num-1]=TWDR;  //读取数
	ldi R24,<_i2c_rd_buff-1
	ldi R25,>_i2c_rd_buff-1
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lds R2,115
	std z+0,R2
	.dbline 375
; 	TWCR = (1<<TWEN)|                          // TWI Interface enabled
	ldi R24,132
	sts 116,R24
	.dbline 379
;            (0<<TWIE)|(1<<TWINT)|               // Enable TWI Interupt and clear the flag to read next byte
;            (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|    // Send NACK after reception
;            (0<<TWWC); 
; 	delay_nus(25);	 //最低值!   25
	ldi R16,25
	ldi R17,0
	xcall _delay_nus
	.dbline 380
; 	if(TestAck()!= TWI_MRX_DATA_NACK   )  //NACK
	lds R24,113
	andi R24,248
	cpi R24,88
	breq L179
	.dbline 381
; 	{
	.dbline 382
; 	    TWI_Master_Initialise(); 
	xcall _TWI_Master_Initialise
	.dbline 383
; 	    return 1;    //出错		
	ldi R16,1
	xjmp L138
L179:
	.dbline 385
; 	}	   
; 	Stop();   //I2C停止
	ldi R24,148
	sts 116,R24
	.dbline 386
; 	return 0;   //整个过程正常时返回0	   
	clr R16
	.dbline -2
L138:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r j 22 c
	.dbsym r num 20 c
	.dbsym l addrlo 10 c
	.dbsym l addrhi 8 c
	.dbsym r device_rd 10 c
	.dbsym r device_wt 12 c
	.dbend
	.dbfunc e I2cWrite _I2cWrite fc
;              i -> R20
;            num -> R22
;            msg -> R10,R11
	.even
_I2cWrite::
	xcall push_gset3
	mov R22,R18
	movw R10,R16
	.dbline -1
	.dbline 391
; }
; //num ,msg写的数组 num包括前面的三个字节的地址
; //返回1:失败,0:成功
; uchar I2cWrite(uchar *msg,uchar num)
; {
	.dbline 392
;     uchar i=0;  //一般用途 
	clr R20
	.dbline 393
;     i2c_wt_buff[0]=msg[0] ;  //器件
	movw R30,R10
	ldd R2,z+0
	sts _i2c_wt_buff,R2
	.dbline 394
; 	i2c_wt_buff[1]=msg[1] ;  // 地址高字节
	ldd R2,z+1
	sts _i2c_wt_buff+1,R2
	.dbline 395
; 	i2c_wt_buff[2]=msg[2] ;  // 地址低字节
	movw R30,R10
	ldd R2,z+2
	sts _i2c_wt_buff+2,R2
	.dbline 396
; 	for(i=3;i<num;i++)
	ldi R20,3
	xjmp L187
L184:
	.dbline 397
	mov R30,R20
	clr R31
	add R30,R10
	adc R31,R11
	ldd R2,z+0
	ldi R24,<_i2c_wt_buff
	ldi R25,>_i2c_wt_buff
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
L185:
	.dbline 396
	inc R20
L187:
	.dbline 396
	cp R20,R22
	brlo L184
	.dbline 398
; 	    i2c_wt_buff[i]=msg[i];   //转移字节
; 	Start()	;          //I2C开始
	ldi R24,164
	sts 116,R24
	.dbline 399
L188:
	.dbline 399
L189:
	.dbline 399
; 	Wait()  ;          //等待TWIINT标志为1
	lds R2,116
	sbrs R2,7
	rjmp L188
	.dbline 399
	.dbline 399
	.dbline 400
; 	if(TestAck()!=TWI_START )
	lds R24,113
	andi R24,248
	cpi R24,8
	breq L191
	.dbline 401
; 	{  
	.dbline 402
; 	    TWI_Master_Initialise(); 
	xcall _TWI_Master_Initialise
	.dbline 403
; 	    return 1;    //出错  
	ldi R16,1
	xjmp L181
L191:
	.dbline 405
; 	}	
; 	i2c_wt_8bit(i2c_wt_buff[0])	;   //从器件地址和写方式
	lds R16,_i2c_wt_buff
	xcall _i2c_wt_8bit
	.dbline 406
L193:
	.dbline 406
L194:
	.dbline 406
; 	Wait();                 //等
	lds R2,116
	sbrs R2,7
	rjmp L193
	.dbline 406
	.dbline 406
	.dbline 407
; 	if(TestAck()!=TWI_MTX_ADR_ACK )  //ACK
	lds R24,113
	andi R24,248
	cpi R24,24
	breq L196
	.dbline 408
; 	{  
	.dbline 409
; 	    TWI_Master_Initialise(); 
	xcall _TWI_Master_Initialise
	.dbline 410
; 	    return 1;    //出错  
	ldi R16,1
	xjmp L181
L196:
	.dbline 412
; 	}	
; 	i2c_wt_8bit(i2c_wt_buff[1])	;       //写地址高	
	lds R16,_i2c_wt_buff+1
	xcall _i2c_wt_8bit
	.dbline 413
L199:
	.dbline 413
L200:
	.dbline 413
; 	Wait();                 //等
	lds R2,116
	sbrs R2,7
	rjmp L199
	.dbline 413
	.dbline 413
	.dbline 414
; 	if(TestAck()!=TWI_MTX_DATA_ACK  )  //ACK
	lds R24,113
	andi R24,248
	cpi R24,40
	breq L202
	.dbline 415
; 	{  
	.dbline 416
; 	    TWI_Master_Initialise(); 
	xcall _TWI_Master_Initialise
	.dbline 417
; 	    return 1;    //出错  
	ldi R16,1
	xjmp L181
L202:
	.dbline 419
; 	}	
; 	i2c_wt_8bit(i2c_wt_buff[2])	;       //写地址低	
	lds R16,_i2c_wt_buff+2
	xcall _i2c_wt_8bit
	.dbline 420
L205:
	.dbline 420
L206:
	.dbline 420
; 	Wait();                 //等
	lds R2,116
	sbrs R2,7
	rjmp L205
	.dbline 420
	.dbline 420
	.dbline 421
; 	if(TestAck()!=TWI_MTX_DATA_ACK  )  //ACK
	lds R24,113
	andi R24,248
	cpi R24,40
	breq L208
	.dbline 422
; 	{  
	.dbline 423
; 	    TWI_Master_Initialise(); 
	xcall _TWI_Master_Initialise
	.dbline 424
; 	    return 1;    //出错  
	ldi R16,1
	xjmp L181
L208:
	.dbline 426
; 	}	
; 	for(i=3;i<num;i++)   //写真正的数据
	ldi R20,3
	xjmp L213
L210:
	.dbline 427
; 	{
	.dbline 428
; 	    i2c_wt_8bit(i2c_wt_buff[i])	;       //写地址高	
	ldi R24,<_i2c_wt_buff
	ldi R25,>_i2c_wt_buff
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _i2c_wt_8bit
	.dbline 429
L214:
	.dbline 429
L215:
	.dbline 429
; 		Wait();                 //等
	lds R2,116
	sbrs R2,7
	rjmp L214
	.dbline 429
	.dbline 429
	.dbline 430
; 		if(TestAck()!=TWI_MTX_DATA_ACK  )  //ACK
	lds R24,113
	andi R24,248
	cpi R24,40
	breq L217
	.dbline 431
; 		{  
	.dbline 432
; 	    TWI_Master_Initialise(); 
	xcall _TWI_Master_Initialise
	.dbline 433
; 	    return 1;    //出错  
	ldi R16,1
	xjmp L181
L217:
	.dbline 435
	ldi R16,25
	ldi R17,0
	xcall _delay_nus
	.dbline 436
L211:
	.dbline 426
	inc R20
L213:
	.dbline 426
	cp R20,R22
	brlo L210
	.dbline 437
; 	    }	
; 		delay_nus(25);                 //没必要
; 	}	
; 	Stop();   //I2C停止
	ldi R24,148
	sts 116,R24
	.dbline 438
; 	return 0;   //整个过程正常时返回0
	clr R16
	.dbline -2
L181:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r num 22 c
	.dbsym r msg 10 pc
	.dbend
	.dbfunc e clock_wt _clock_wt fc
;              i -> R20
;            num -> R22
;            msg -> R10,R11
	.even
_clock_wt::
	xcall push_gset3
	mov R22,R18
	movw R10,R16
	.dbline -1
	.dbline 443
; 	
; }
; //时钟的读写
; uchar clock_wt(uchar *msg,uchar num)
; {
	.dbline 444
;     uchar i=0;
	clr R20
	.dbline 445
;     for(i=0;i<num;i++)
	xjmp L223
L220:
	.dbline 446
	mov R30,R20
	clr R31
	add R30,R10
	adc R31,R11
	ldd R2,z+0
	ldi R24,<_i2c_wt_buff
	ldi R25,>_i2c_wt_buff
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
L221:
	.dbline 445
	inc R20
L223:
	.dbline 445
	cp R20,R22
	brlo L220
	.dbline 447
; 	    i2c_wt_buff[i]=msg[i];   //转移字节
;     Start()	;          //I2C开始
	ldi R24,164
	sts 116,R24
	.dbline 448
L224:
	.dbline 448
L225:
	.dbline 448
; 	Wait()  ;          //等待TWIINT标志为1
	lds R2,116
	sbrs R2,7
	rjmp L224
	.dbline 448
	.dbline 448
	.dbline 449
; 	if(TestAck()!=TWI_START )
	lds R24,113
	andi R24,248
	cpi R24,8
	breq L227
	.dbline 450
; 	{  
	.dbline 451
; 	    Stop();   //I2C停止
	ldi R24,148
	sts 116,R24
	.dbline 452
; 	    return 1;     //出错
	ldi R16,1
	xjmp L219
L227:
	.dbline 454
; 	}	
; 	i2c_wt_8bit(i2c_wt_buff[0])	;   //从器件地址和写方式
	lds R16,_i2c_wt_buff
	xcall _i2c_wt_8bit
	.dbline 456
L229:
	.dbline 456
L230:
	.dbline 456
; 	//delay_nms(8);
; 	Wait();                 //等
	lds R2,116
	sbrs R2,7
	rjmp L229
	.dbline 456
	.dbline 456
	.dbline 457
; 	if(TestAck()!=TWI_MTX_ADR_ACK )  //ACK
	lds R24,113
	andi R24,248
	cpi R24,24
	breq L232
	.dbline 458
; 	    return 1;    //出错	
	ldi R16,1
	xjmp L219
L232:
	.dbline 459
; 	for(i=1;i<num;i++)   //写真正的数据
	ldi R20,1
	xjmp L237
L234:
	.dbline 460
; 	{
	.dbline 461
; 	    i2c_wt_8bit(i2c_wt_buff[i])	;       //写地址高	
	ldi R24,<_i2c_wt_buff
	ldi R25,>_i2c_wt_buff
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _i2c_wt_8bit
	.dbline 462
L238:
	.dbline 462
L239:
	.dbline 462
; 		Wait();                 //等
	lds R2,116
	sbrs R2,7
	rjmp L238
	.dbline 462
	.dbline 462
	.dbline 463
; 		if(TestAck()!=TWI_MTX_DATA_ACK  )  //ACK
	lds R24,113
	andi R24,248
	cpi R24,40
	breq L241
	.dbline 464
; 	        return 1;    //出错  
	ldi R16,1
	xjmp L219
L241:
	.dbline 465
	ldi R16,50
	ldi R17,0
	xcall _delay_nms
	.dbline 466
L235:
	.dbline 459
	inc R20
L237:
	.dbline 459
	cp R20,R22
	brlo L234
	.dbline 467
; 		delay_nms(50);		
; 	}	
; 	Stop();   //I2C停止
	ldi R24,148
	sts 116,R24
	.dbline 468
; 	return 0;   //整个过程正常时返回0	
	clr R16
	.dbline -2
L219:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r num 22 c
	.dbsym r msg 10 pc
	.dbend
	.dbfunc e clock_rd _clock_rd fc
;              j -> R22
;            num -> R20
;        command -> R10
	.even
_clock_rd::
	xcall push_gset3
	mov R20,R18
	mov R10,R16
	.dbline -1
	.dbline 472
; }	
; //时钟读
; uchar clock_rd(uchar command,uchar num)
; {
	.dbline 473
;      uchar j=0;
	clr R22
	.dbline 474
; 	 Start()	;          //I2C开始
	ldi R24,164
	sts 116,R24
	.dbline 475
L244:
	.dbline 475
L245:
	.dbline 475
; 	 Wait()  ;          //等待TWIINT标志为1
	lds R2,116
	sbrs R2,7
	rjmp L244
	.dbline 475
	.dbline 475
	.dbline 476
; 	 if(TestAck()!=TWI_START )
	lds R24,113
	andi R24,248
	cpi R24,8
	breq L247
	.dbline 477
; 	     return 1;     //出错
	ldi R16,1
	xjmp L243
L247:
	.dbline 478
; 	 i2c_wt_8bit(command);  //写I2C从器件地址及写方式	
	mov R16,R10
	xcall _i2c_wt_8bit
	.dbline 479
L249:
	.dbline 479
L250:
	.dbline 479
; 	 Wait();                 //等
	lds R2,116
	sbrs R2,7
	rjmp L249
	.dbline 479
	.dbline 479
	.dbline 480
; 	 if(TestAck()!=TWI_MRX_ADR_ACK )  //ACK
	lds R24,113
	andi R24,248
	cpi R24,64
	breq L252
	.dbline 481
; 	    return 1;    //出错	
	ldi R16,1
	xjmp L243
L252:
	.dbline 482
; 	 TWCR = (1<<TWEN)|                          // TWI Interface enabled
	ldi R24,196
	sts 116,R24
	.dbline 486
;             (0<<TWIE)|(1<<TWINT)|               // Enable TWI Interupt and clear the flag to read next byte
;             (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|    // Send ACK after reception
;             (0<<TWWC); 
; 	 delay_nus(25);  //最低值! 
	ldi R16,25
	ldi R17,0
	xcall _delay_nus
	.dbline 487
; 	 for(j=1;j<num;j++)   //读取num-1个
	ldi R22,1
	xjmp L257
L254:
	.dbline 488
; 	 {
	.dbline 489
; 	     if(TestAck()!= TWI_MRX_DATA_ACK  )  //ACK
	lds R24,113
	andi R24,248
	cpi R24,80
	breq L258
	.dbline 490
; 	         return 1;    //出错	
	ldi R16,1
	xjmp L243
L258:
	.dbline 491
	ldi R24,<_i2c_rd_buff-1
	ldi R25,>_i2c_rd_buff-1
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	lds R2,115
	std z+0,R2
	.dbline 492
	ldi R24,196
	sts 116,R24
	.dbline 496
	ldi R16,25
	ldi R17,0

⌨️ 快捷键说明

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