📄 uart_to_twi.lst
字号:
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 + -