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

📄 twi_master_polling.s

📁 usart的驱动程序
💻 S
字号:
	.module twi_master_polling.c
	.area text(rom, con, rel)
	.dbfile H:\程序库\twi_master_polling.c
	.dbfunc e twi_init _twi_init fV
	.even
_twi_init::
	.dbline -1
	.dbline 10
; #include <iom8v.h>
; #include <macros.h>
; #include "delay.h"
; #include "twi_master_polling.h"
; 
; unsigned char Write_Succsee_Flag;
; unsigned char Read_Succsee_Flag;
; 
; void twi_init(void)
; {
	.dbline 11
;  Write_Succsee_Flag = false;
	clr R2
	sts _Write_Succsee_Flag,R2
	.dbline 12
;  Read_Succsee_Flag  = false;
	sts _Read_Succsee_Flag,R2
	.dbline 14
;  
;  TWCR= 0X00; //disable twi
	out 0x36,R2
	.dbline 15
;  TWBR= 0x20; //set bit rate
	ldi R24,32
	out 0x0,R24
	.dbline 16
;  TWSR= 0x00; //set prescale
	out 0x1,R2
	.dbline 18
;  //TWAR= DEVICE_ADR; //set slave address 本身作为主控
;  TWCR= 0x44; //enable twi 置位TWEA,TWEN TWIE
	ldi R24,68
	out 0x36,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e twi_write_byte _twi_write_byte fc
;          Wdata -> y+4
;     RamAddress -> R20
;     device_adr -> R22
	.even
_twi_write_byte::
	rcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 26
; }
; /******************************************
;                 I2C总线写一个字节
; 			    返回0:       写成功
; 				返回错误状态字:写失败
; *******************************************/
; unsigned char twi_write_byte(unsigned char device_adr,unsigned char RamAddress,unsigned char Wdata) 
; {
	.dbline 28
	ldi R24,164
	out 0x36,R24
	.dbline 28
L3:
	.dbline 28
L4:
	.dbline 28
; 	  //I2C启动
; 	  Start();                      Wait(); //等TWINT置位
	in R2,0x36
	sbrs R2,7
	rjmp L3
	.dbline 28
	.dbline 28
	.dbline 29
; 	  if(TestAck()!=START)         {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L6
	.dbline 29
	.dbline 29
	clr R2
	sts _Write_Succsee_Flag,R2
	.dbline 29
	ldi R24,148
	out 0x36,R24
	.dbline 29
	in R16,0x1
	andi R16,248
	rjmp L2
L6:
	.dbline 31
	.dbline 31
	out 0x3,R22
	.dbline 31
	ldi R24,132
	out 0x36,R24
	.dbline 31
	.dbline 31
	.dbline 31
L8:
	.dbline 31
L9:
	.dbline 31
; 	  //写I2C从器件地址和写方式
; 	  Write8Bit(device_adr);        Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L8
	.dbline 31
	.dbline 31
	.dbline 32
; 	  if(TestAck()!=MT_SLA_ACK)    {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L11
	.dbline 32
	.dbline 32
	clr R2
	sts _Write_Succsee_Flag,R2
	.dbline 32
	ldi R24,148
	out 0x36,R24
	.dbline 32
	in R16,0x1
	andi R16,248
	rjmp L2
L11:
	.dbline 34
	.dbline 34
	out 0x3,R20
	.dbline 34
	ldi R24,132
	out 0x36,R24
	.dbline 34
	.dbline 34
	.dbline 34
L13:
	.dbline 34
L14:
	.dbline 34
; 	  //写RAM地址
; 	  Write8Bit(RamAddress);        Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L13
	.dbline 34
	.dbline 34
	.dbline 35
; 	  if(TestAck()!=MT_DATA_ACK)   {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L16
	.dbline 35
	.dbline 35
	clr R2
	sts _Write_Succsee_Flag,R2
	.dbline 35
	ldi R24,148
	out 0x36,R24
	.dbline 35
	in R16,0x1
	andi R16,248
	rjmp L2
L16:
	.dbline 37
	.dbline 37
	ldd R0,y+4
	out 0x3,R0
	.dbline 37
	ldi R24,132
	out 0x36,R24
	.dbline 37
	.dbline 37
	.dbline 37
L18:
	.dbline 37
L19:
	.dbline 37
; 	  //写数据
; 	  Write8Bit(Wdata);             Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L18
	.dbline 37
	.dbline 37
	.dbline 38
; 	  if(TestAck()!=MT_DATA_ACK)   {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK	
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L21
	.dbline 38
	.dbline 38
	clr R2
	sts _Write_Succsee_Flag,R2
	.dbline 38
	ldi R24,148
	out 0x36,R24
	.dbline 38
	in R16,0x1
	andi R16,248
	rjmp L2
L21:
	.dbline 40
; 	  //I2C停止
; 	  Stop();
	ldi R24,148
	out 0x36,R24
	.dbline 41
;  	  delay_ms(10);//延时等写完
	ldi R16,10
	ldi R17,0
	rcall _delay_ms
	.dbline 42
; 	  Write_Succsee_Flag = true;
	ldi R24,1
	sts _Write_Succsee_Flag,R24
	.dbline 43
; 	  return Write_Succsee_Flag;
	mov R16,R24
	.dbline -2
L2:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l Wdata 4 c
	.dbsym r RamAddress 20 c
	.dbsym r device_adr 22 c
	.dbend
	.dbfunc e twi_read_byte _twi_read_byte fc
;           temp -> R20
;     RamAddress -> R18
;     device_adr -> R16
	.even
_twi_read_byte::
	rcall push_gset1
	.dbline -1
	.dbline 50
; }
; /******************************************
;                I2C总线读一个字节
; 			   如果读失败也返回0
; *******************************************/
; unsigned char twi_read_byte(unsigned char device_adr,unsigned char RamAddress) 
;       {
	.dbline 54
	ldi R24,164
	out 0x36,R24
	.dbline 54
L24:
	.dbline 54
L25:
	.dbline 54
; 	   unsigned char temp;
; 	   
; 	   //I2C启动
; 	   Start();                      Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L24
	.dbline 54
	.dbline 54
	.dbline 55
; 	   if (TestAck()!=START)        {Read_Succsee_Flag  = false;Stop();return TestAck();}//ACK	   
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L27
	.dbline 55
	.dbline 55
	clr R2
	sts _Read_Succsee_Flag,R2
	.dbline 55
	ldi R24,148
	out 0x36,R24
	.dbline 55
	in R16,0x1
	andi R16,248
	rjmp L23
L27:
	.dbline 57
	.dbline 57
	out 0x3,R16
	.dbline 57
	ldi R24,132
	out 0x36,R24
	.dbline 57
	.dbline 57
	.dbline 57
L29:
	.dbline 57
L30:
	.dbline 57
; 	   //写I2C从器件地址和写方式
; 	   Write8Bit(device_adr);        Wait(); 
	in R2,0x36
	sbrs R2,7
	rjmp L29
	.dbline 57
	.dbline 57
	.dbline 58
; 	   if (TestAck()!=MT_SLA_ACK)   {Read_Succsee_Flag  = false;Stop();return TestAck();}//ACK
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L32
	.dbline 58
	.dbline 58
	clr R2
	sts _Read_Succsee_Flag,R2
	.dbline 58
	ldi R24,148
	out 0x36,R24
	.dbline 58
	in R16,0x1
	andi R16,248
	rjmp L23
L32:
	.dbline 60
	.dbline 60
	out 0x3,R18
	.dbline 60
	ldi R24,132
	out 0x36,R24
	.dbline 60
	.dbline 60
	.dbline 60
L34:
	.dbline 60
L35:
	.dbline 60
; 	   //写RAM地址
; 	   Write8Bit(RamAddress);        Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L34
	.dbline 60
	.dbline 60
	.dbline 61
; 	   if (TestAck()!=MT_DATA_ACK)  {Read_Succsee_Flag  = false;Stop();return TestAck();}
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L37
	.dbline 61
	.dbline 61
	clr R2
	sts _Read_Succsee_Flag,R2
	.dbline 61
	ldi R24,148
	out 0x36,R24
	.dbline 61
	in R16,0x1
	andi R16,248
	rjmp L23
L37:
	.dbline 63
	ldi R24,164
	out 0x36,R24
	.dbline 63
L39:
	.dbline 63
L40:
	.dbline 63
; 	   //I2C重新启动
; 	   Start();                      Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L39
	.dbline 63
	.dbline 63
	.dbline 64
; 	   if (TestAck()!=RE_START)     {Read_Succsee_Flag  = false;Stop();return TestAck();}
	in R24,0x1
	andi R24,248
	cpi R24,16
	breq L42
	.dbline 64
	.dbline 64
	clr R2
	sts _Read_Succsee_Flag,R2
	.dbline 64
	ldi R24,148
	out 0x36,R24
	.dbline 64
	in R16,0x1
	andi R16,248
	rjmp L23
L42:
	.dbline 66
	.dbline 66
	mov R24,R16
	subi R24,255    ; addi 1
	out 0x3,R24
	.dbline 66
	ldi R24,132
	out 0x36,R24
	.dbline 66
	.dbline 66
	.dbline 66
L44:
	.dbline 66
L45:
	.dbline 66
; 	   //写I2C从器件地址和读方式
; 	   Write8Bit(device_adr+1);    	 Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L44
	.dbline 66
	.dbline 66
	.dbline 67
; 	   if(TestAck()!=MR_SLA_ACK)  	 {Read_Succsee_Flag  = false;Stop();return TestAck();}//ACK
	in R24,0x1
	andi R24,248
	cpi R24,64
	breq L47
	.dbline 67
	.dbline 67
	clr R2
	sts _Read_Succsee_Flag,R2
	.dbline 67
	ldi R24,148
	out 0x36,R24
	.dbline 67
	in R16,0x1
	andi R16,248
	rjmp L23
L47:
	.dbline 69
	ldi R24,196
	out 0x36,R24
	.dbline 69
L49:
	.dbline 69
L50:
	.dbline 69
; 	   //启动主I2C读方式,且设为准备响应
; 	   Twi();                        Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L49
	.dbline 69
	.dbline 69
	.dbline 70
; 	   if(TestAck()!=MR_DATA_ACK)   {Read_Succsee_Flag  = false;Stop();return TestAck();}//ACK	
	in R24,0x1
	andi R24,248
	cpi R24,80
	breq L52
	.dbline 70
	.dbline 70
	clr R2
	sts _Read_Succsee_Flag,R2
	.dbline 70
	ldi R24,148
	out 0x36,R24
	.dbline 70
	in R16,0x1
	andi R16,248
	rjmp L23
L52:
	.dbline 72
; 	   //读取I2C接收数据
; 	   temp=TWDR;
	in R20,0x3
	.dbline 73
; 	   Read_Succsee_Flag  = true;
	ldi R24,1
	sts _Read_Succsee_Flag,R24
	.dbline 75
;        //I2C停止
; 	   Stop();
	ldi R24,148
	out 0x36,R24
	.dbline 76
; 	   return temp;
	mov R16,R20
	.dbline -2
L23:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r RamAddress 18 c
	.dbsym r device_adr 16 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile H:\程序库\twi_master_polling.c
_Read_Succsee_Flag::
	.blkb 1
	.dbsym e Read_Succsee_Flag _Read_Succsee_Flag c
_Write_Succsee_Flag::
	.blkb 1
	.dbsym e Write_Succsee_Flag _Write_Succsee_Flag c

⌨️ 快捷键说明

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