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

📄 uart_to_twi.lst

📁 AVR单片机的T_TO_TWI通讯方式
💻 LST
📖 第 1 页 / 共 3 页
字号:
    023C BD80      OUT	0x20,R24
    023D E787      LDI	R24,0x77
    023E B989      OUT	0x09,R24
    023F BC20      OUT	0x20,R2
    0240 E988      LDI	R24,0x98
    0241 B98A      OUT	0x0A,R24
    0242 9508      RET
_UART_Receive:
    0243 9180008D  LDS	R24,Rx_Flag
    0245 3081      CPI	R24,1
    0246 F471      BNE	0x0255
    0247 2422      CLR	R2
    0248 9220008D  STS	Rx_Flag,R2
    024A 918000AE  LDS	R24,UART_RX_buff
    024C 3588      CPI	R24,0x58
    024D F439      BNE	0x0255
    024E 918000B6  LDS	R24,0xB6
    0250 3588      CPI	R24,0x58
    0251 F419      BNE	0x0255
    0252 E081      LDI	R24,1
    0253 938000CE  STS	Rx_Over_Pack_Flag,R24
    0255 9508      RET
_USART_Transmit:
  s                    --> R20
    0256 D116      RCALL	push_gset1
    0257 01A8      MOVW	R20,R16
    0258 C005      RJMP	0x025E
    0259 01FA      MOVW	R30,R20
    025A 8100      LDD	R16,Z+0
    025B D00A      RCALL	_USART_TransmitByte
    025C 5F4F      SUBI	R20,0xFF
    025D 4F5F      SBCI	R21,0xFF
    025E 01FA      MOVW	R30,R20
    025F 8020      LDD	R2,Z+0
    0260 2022      TST	R2
    0261 F7B9      BNE	0x0259
    0262 E00A      LDI	R16,0xA
    0263 D002      RCALL	_USART_TransmitByte
    0264 D10B      RCALL	pop_gset1
    0265 9508      RET
_USART_TransmitByte:
  data                 --> R16
    0266 C001      RJMP	0x0268
    0267 95A8      WDR
    0268 9B5D      SBIS	0x0B,5
    0269 CFFD      RJMP	0x0267
    026A B90C      OUT	0x0C,R16
    026B 9508      RET
FILE: F:\UART_TO_TWI\delay.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) 
(0004) void delay(unsigned int d)			              	//延时
(0005) {
_delay:
  d                    --> R16
    026C C001      RJMP	0x026E
(0006) 	while (d--)
(0007) 		WDR();																			//喂狗
    026D 95A8      WDR
    026E 0118      MOVW	R2,R16
    026F 5001      SUBI	R16,1
    0270 4010      SBCI	R17,0
    0271 2022      TST	R2
    0272 F7D1      BNE	0x026D
    0273 2033      TST	R3
    0274 F7C1      BNE	0x026D
    0275 9508      RET
(0008) }
(0009) /*				微秒级延时程序	  		*/
(0010) void delay_us(int time)
(0011) 	 {     
(0012)   	  do
(0013) 	  	{
(0014) 		 time--;
_delay_us:
  time                 --> R16
    0276 5001      SUBI	R16,1
    0277 4010      SBCI	R17,0
(0015) 		}	
(0016)   	  while (time>1)WDR();
    0278 E081      LDI	R24,1
    0279 E090      LDI	R25,0
    027A 1780      CP	R24,R16
    027B 0791      CPC	R25,R17
    027C F3CC      BLT	0x0276
    027D 95A8      WDR
    027E 9508      RET
_delay_ms:
  time                 --> R20
    027F D0ED      RCALL	push_gset1
    0280 01A8      MOVW	R20,R16
(0017) 	 }	  
(0018) /*	  		    毫秒级延时程序			*/	 
(0019) void delay_ms(unsigned int time)
(0020) 	 {
    0281 C005      RJMP	0x0287
(0021) 	  while(time!=0)
(0022) 	  	  {		
(0023) 		   delay_us(1000);
    0282 EE08      LDI	R16,0xE8
    0283 E013      LDI	R17,3
    0284 DFF1      RCALL	_delay_us
(0024) 		   time--;
    0285 5041      SUBI	R20,1
    0286 4050      SBCI	R21,0
    0287 3040      CPI	R20,0
    0288 0745      CPC	R20,R21
    0289 F7C1      BNE	0x0282
    028A D0E5      RCALL	pop_gset1
    028B 9508      RET
FILE: F:\UART_TO_TWI\twi_master_polling.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "delay.h"
(0004) #include "twi_master_polling.h"
(0005) 
(0006) unsigned char Write_Succsee_Flag;
(0007) unsigned char Read_Succsee_Flag;
(0008) 
(0009) void twi_init(void)
(0010) {
(0011)  Write_Succsee_Flag = false;
_twi_init:
    028C 2422      CLR	R2
    028D 922000D1  STS	Write_Succsee_Flag,R2
(0012)  Read_Succsee_Flag  = false;
    028F 922000D0  STS	Read_Succsee_Flag,R2
(0013)  
(0014)  TWCR= 0X00; //disable twi
    0291 BE26      OUT	0x36,R2
(0015)  TWBR= 0x20; //set bit rate
    0292 E280      LDI	R24,0x20
    0293 B980      OUT	0x00,R24
(0016)  TWSR= 0x00; //set prescale
    0294 B821      OUT	0x01,R2
(0017)  //TWAR= DEVICE_ADR; //set slave address 本身作为主控
(0018)  TWCR= 0x44; //enable twi 置位TWEA,TWEN TWIE
    0295 E484      LDI	R24,0x44
    0296 BF86      OUT	0x36,R24
    0297 9508      RET
_twi_write_byte:
  Wdata                --> Y+4
  RamAddress           --> R20
  device_adr           --> R22
    0298 D0D2      RCALL	push_gset2
    0299 2F42      MOV	R20,R18
    029A 2F60      MOV	R22,R16
(0019) }
(0020) /******************************************
(0021)                 I2C总线写一个字节
(0022) 			    返回0:       写成功
(0023) 				返回错误状态字:写失败
(0024) *******************************************/
(0025) unsigned char twi_write_byte(unsigned char device_adr,unsigned char RamAddress,unsigned char Wdata) 
(0026) {
(0027) 	  //I2C启动
(0028) 	  Start();                      Wait(); //等TWINT置位
    029B EA84      LDI	R24,0xA4
    029C BF86      OUT	0x36,R24
    029D B626      IN	R2,0x36
    029E FE27      SBRS	R2,7
    029F CFFD      RJMP	0x029D
(0029) 	  if(TestAck()!=START)         {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
    02A0 B181      IN	R24,0x01
    02A1 7F88      ANDI	R24,0xF8
    02A2 3088      CPI	R24,0x8
    02A3 F041      BEQ	0x02AC
    02A4 2422      CLR	R2
    02A5 922000D1  STS	Write_Succsee_Flag,R2
    02A7 E984      LDI	R24,0x94
    02A8 BF86      OUT	0x36,R24
    02A9 B101      IN	R16,0x01
    02AA 7F08      ANDI	R16,0xF8
    02AB C040      RJMP	0x02EC
(0030) 	  //写I2C从器件地址和写方式
(0031) 	  Write8Bit(device_adr);        Wait();
    02AC B963      OUT	0x03,R22
    02AD E884      LDI	R24,0x84
    02AE BF86      OUT	0x36,R24
    02AF B626      IN	R2,0x36
    02B0 FE27      SBRS	R2,7
    02B1 CFFD      RJMP	0x02AF
(0032) 	  if(TestAck()!=MT_SLA_ACK)    {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
    02B2 B181      IN	R24,0x01
    02B3 7F88      ANDI	R24,0xF8
    02B4 3188      CPI	R24,0x18
    02B5 F041      BEQ	0x02BE
    02B6 2422      CLR	R2
    02B7 922000D1  STS	Write_Succsee_Flag,R2
    02B9 E984      LDI	R24,0x94
    02BA BF86      OUT	0x36,R24
    02BB B101      IN	R16,0x01
    02BC 7F08      ANDI	R16,0xF8
    02BD C02E      RJMP	0x02EC
(0033) 	  //写RAM地址
(0034) 	  Write8Bit(RamAddress);        Wait();
    02BE B943      OUT	0x03,R20
    02BF E884      LDI	R24,0x84
    02C0 BF86      OUT	0x36,R24
    02C1 B626      IN	R2,0x36
    02C2 FE27      SBRS	R2,7
    02C3 CFFD      RJMP	0x02C1
(0035) 	  if(TestAck()!=MT_DATA_ACK)   {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
    02C4 B181      IN	R24,0x01
    02C5 7F88      ANDI	R24,0xF8
    02C6 3288      CPI	R24,0x28
    02C7 F041      BEQ	0x02D0
    02C8 2422      CLR	R2
    02C9 922000D1  STS	Write_Succsee_Flag,R2
    02CB E984      LDI	R24,0x94
    02CC BF86      OUT	0x36,R24
    02CD B101      IN	R16,0x01
    02CE 7F08      ANDI	R16,0xF8
    02CF C01C      RJMP	0x02EC
(0036) 	  //写数据
(0037) 	  Write8Bit(Wdata);             Wait();
    02D0 800C      LDD	R0,Y+4
    02D1 B803      OUT	0x03,R0
    02D2 E884      LDI	R24,0x84
    02D3 BF86      OUT	0x36,R24
    02D4 B626      IN	R2,0x36
    02D5 FE27      SBRS	R2,7
    02D6 CFFD      RJMP	0x02D4
(0038) 	  if(TestAck()!=MT_DATA_ACK)   {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK	
    02D7 B181      IN	R24,0x01
    02D8 7F88      ANDI	R24,0xF8
    02D9 3288      CPI	R24,0x28
    02DA F041      BEQ	0x02E3
    02DB 2422      CLR	R2
    02DC 922000D1  STS	Write_Succsee_Flag,R2
    02DE E984      LDI	R24,0x94
    02DF BF86      OUT	0x36,R24
    02E0 B101      IN	R16,0x01
    02E1 7F08      ANDI	R16,0xF8
    02E2 C009      RJMP	0x02EC
(0039) 	  //I2C停止
(0040) 	  Stop();
    02E3 E984      LDI	R24,0x94
    02E4 BF86      OUT	0x36,R24
(0041)  	  delay_ms(10);//延时等写完
    02E5 E00A      LDI	R16,0xA
    02E6 E010      LDI	R17,0
    02E7 DF97      RCALL	_delay_ms
(0042) 	  Write_Succsee_Flag = true;
    02E8 E081      LDI	R24,1
    02E9 938000D1  STS	Write_Succsee_Flag,R24
(0043) 	  return Write_Succsee_Flag;
    02EB 2F08      MOV	R16,R24
    02EC D076      RCALL	pop_gset2
    02ED 9508      RET
_twi_read_byte:
  temp                 --> R20
  RamAddress           --> R18
  device_adr           --> R16
    02EE D07E      RCALL	push_gset1
(0044) }
(0045) /******************************************
(0046)                I2C总线读一个字节
(0047) 			   如果读失败也返回0
(0048) *******************************************/
(0049) unsigned char twi_read_byte(unsigned char device_adr,unsigned char RamAddress) 
(0050)       {
(0051) 	   unsigned char temp;
(0052) 	   
(0053) 	   //I2C启动
(0054) 	   Start();                      Wait();
    02EF EA84      LDI	R24,0xA4
    02F0 BF86      OUT	0x36,R24
    02F1 B626      IN	R2,0x36
    02F2 FE27      SBRS	R2,7
    02F3 CFFD      RJMP	0x02F1
(0055) 	   if (TestAck()!=START)        {Read_Succsee_Flag  = false;Stop();return TestAck();}//ACK	   
    02F4 B181      IN	R24,0x01
    02F5 7F88      ANDI	R24,0xF8
    02F6 3088      CPI	R24,0x8
    02F7 F041      BEQ	0x0300
    02F8 2422      CLR	R2
    02F9 922000D0  STS	Read_Succsee_Flag,R2
    02FB E984      LDI	R24,0x94
    02FC BF86      OUT	0x36,R24
    02FD B101      IN	R16,0x01
    02FE 7F08      ANDI	R16,0xF8
    02FF C061      RJMP	0x0361
(0056) 	   //写I2C从器件地址和写方式
(0057) 	   Write8Bit(device_adr);        Wait(); 
    0300 B903      OUT	0x03,R16
    0301 E884      LDI	R24,0x84
    0302 BF86      OUT	0x36,R24
    0303 B626      IN	R2,0x36
    0304 FE27      SBRS	R2,7
    0305 CFFD      RJMP	0x0303
(0058) 	   if (TestAck()!=MT_SLA_ACK)   {Read_Succsee_Flag  = false;Stop();return TestAck();}//ACK
    0306 B181      IN	R24,0x01
    0307 7F88      ANDI	R24,0xF8
    0308 3188      CPI	R24,0x18
    0309 F041      BEQ	0x0312
    030A 2422      CLR	R2
    030B 922000D0  STS	Read_Succsee_Flag,R2
    030D E984      LDI	R24,0x94
    030E BF86      OUT	0x36,R24
    030F B101      IN	R16,0x01
    0310 7F08      ANDI	R16,0xF8
    0311 C04F      RJMP	0x0361
(0059) 	   //写RAM地址
(0060) 	   Write8Bit(RamAddress);        Wait();
    0312 B923      OUT	0x03,R18
    0313 E884      LDI	R24,0x84
    0314 BF86      OUT	0x36,R24
    0315 B626      IN	R2,0x36
    0316 FE27      SBRS	R2,7
    0317 CFFD      RJMP	0x0315
(0061) 	   if (TestAck()!=MT_DATA_ACK)  {Read_Succsee_Flag  = false;Stop();return TestAck();}
    0318 B181      IN	R24,0x01
    0319 7F88      ANDI	R24,0xF8
    031A 3288      CPI	R24,0x28
    031B F041      BEQ	0x0324
    031C 2422      CLR	R2
    031D 922000D0  STS	Read_Succsee_Flag,R2
    031F E984      LDI	R24,0x94
    0320 BF86      OUT	0x36,R24
    0321 B101      IN	R16,0x01
    0322 7F08      ANDI	R16,0xF8
    0323 C03D      RJMP	0x0361
(0062) 	   //I2C重新启动
(0063) 	   Start();                      Wait();
    0324 EA84      LDI	R24,0xA4
    0325 BF86      OUT	0x36,R24
    0326 B626      IN	R2,0x36
    0327 FE27      SBRS	R2,7
    0328 CFFD      RJMP	0x0326
(0064) 	   if (TestAck()!=RE_START)     {Read_Succsee_Flag  = false;Stop();return TestAck();}
    0329 B181      IN	R24,0x01
    032A 7F88      ANDI	R24,0xF8
    032B 3180      CPI	R24,0x10
    032C F041      BEQ	0x0335
    032D 2422      CLR	R2
    032E 922000D0  STS	Read_Succsee_Flag,R2
    0330 E984      LDI	R24,0x94
    0331 BF86      OUT	0x36,R24
    0332 B101      IN	R16,0x01
    0333 7F08      ANDI	R16,0xF8
    0334 C02C      RJMP	0x0361
(0065) 	   //写I2C从器件地址和读方式
(0066) 	   Write8Bit(device_adr+1);    	 Wait();
    0335 2F80      MOV	R24,R16
    0336 5F8F      SUBI	R24,0xFF
    0337 B983      OUT	0x03,R24
    0338 E884      LDI	R24,0x84
    0339 BF86      OUT	0x36,R24
    033A B626      IN	R2,0x36
    033B FE27      SBRS	R2,7
    033C CFFD      RJMP	0x033A
(0067) 	   if(TestAck()!=MR_SLA_ACK)  	 {Read_Succsee_Flag  = false;Stop();return TestAck();}//ACK
    033D B181      IN	R24,0x01
    033E 7F88      ANDI	R24,0xF8
    033F 3480      CPI	R24,0x40
    0340 F041      BEQ	0x0349
    0341 2422      CLR	R2
    0342 922000D0  STS	Read_Succsee_Flag,R2
    0344 E984      LDI	R24,0x94
    0345 BF86      OUT	0x36,R24
    0346 B101      IN	R16,0x01
    0347 7F08      ANDI	R16,0xF8
    0348 C018      RJMP	0x0361
(0068) 	   //启动主I2C读方式,且设为准备响应
(0069) 	   Twi();                        Wait();
    0349 EC84      LDI	R24,0xC4
    034A BF86      OUT	0x36,R24
    034B B626      IN	R2,0x36
    034C FE27      SBRS	R2,7
    034D CFFD      RJMP	0x034B
(0070) 	   if(TestAck()!=MR_DATA_ACK)   {Read_Succsee_Flag  = false;Stop();return TestAck();}//ACK	
    034E B181      IN	R24,0x01
    034F 7F88      ANDI	R24,0xF8
    0350 3580      CPI	R24,0x50
    0351 F041      BEQ	0x035A
    0352 2422      CLR	R2
    0353 922000D0  STS	Read_Succsee_Flag,R2
    0355 E984      LDI	R24,0x94
    0356 BF86      OUT	0x36,R24
    0357 B101      IN	R16,0x01
    0358 7F08      ANDI	R16,0xF8
    0359 C007      RJMP	0x0361
(0071) 	   //读取I2C接收数据
(0072) 	   temp=TWDR;
    035A B143      IN	R20,0x03
(0073) 	   Read_Succsee_Flag  = true;
    035B E081      LDI	R24,1
    035C 938000D0  STS	Read_Succsee_Flag,R24
(0074)        //I2C停止
(0075) 	   Stop();
    035E E984      LDI	R24,0x94
    035F BF86      OUT	0x36,R24
(0076) 	   return temp;
FILE: <library>
    0360 2F04      MOV	R16,R20
    0361 D00E      RCALL	pop_gset1
    0362 9508      RET
pop_gset2:
    0363 E0E2      LDI	R30,2
    0364 C00C      RJMP	pop
push_gset5:
    0365 92FA      ST	R15,-Y
    0366 92EA      ST	R14,-Y
push_gset4:
    0367 92DA      ST	R13,-Y
    0368 92CA      ST	R12,-Y
push_gset3:
    0369 92BA      ST	R11,-Y
    036A 92AA      ST	R10,-Y
push_gset2:
    036B 937A      ST	R23,-Y
    036C 936A      ST	R22,-Y
push_gset1:
    036D 935A      ST	R21,-Y
    036E 934A      ST	R20,-Y
    036F 9508      RET
pop_gset1:
    0370 E0E1      LDI	R30,1
pop:
    0371 9149      LD	R20,Y+
    0372 9159      LD	R21,Y+
    0373 FDE0      SBRC	R30,0
    0374 9508      RET
    0375 9169      LD	R22,Y+
    0376 9179      LD	R23,Y+
    0377 FDE1      SBRC	R30,1
    0378 9508      RET
    0379 90A9      LD	R10,Y+
    037A 90B9      LD	R11,Y+
    037B FDE2      SBRC	R30,2
    037C 9508      RET
    037D 90C9      LD	R12,Y+
    037E 90D9      LD	R13,Y+
    037F FDE3      SBRC	R30,3
    0380 9508      RET
    0381 90E9      LD	R14,Y+
    0382 90F9      LD	R15,Y+
    0383 9508      RET

⌨️ 快捷键说明

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