📄 i2c-master.lst
字号:
0263 6081 ORI R24,1
0264 938000BC STS 0xBC,R24
(0270) Twi_set_start();
0266 918000BC LDS R24,0xBC
0268 6280 ORI R24,0x20
0269 938000BC STS 0xBC,R24
(0271) return twi_err;
026B 91000101 LDS R16,twi_err
026D C006 RJMP 0x0274
(0272) }
(0273) Twi_set_stop();
026E 918000BC LDS R24,0xBC
0270 6180 ORI R24,0x10
0271 938000BC STS 0xBC,R24
(0274) return TWI_NOT_FREE;
0273 E007 LDI R16,7
0274 9508 RET
_twi_interrupt:
0275 940E030C CALL push_lset
(0275) }
(0276)
(0277) /*****************************************************************************
(0278) 函数介绍:TWI中断例程
(0279) 输入参数:
(0280) 输出参数:
(0281) 返回值:无
(0282) *****************************************************************************/
(0283) //#pragma vector = TWI_vect
(0284) //__interrupt void twi_interrupt()
(0285) #pragma interrupt_handler twi_interrupt:36
(0286) void twi_interrupt()
(0287) {
(0288) twi_decode_status();
0277 DDFF RCALL _twi_decode_status
0278 940E0323 CALL pop_lset
027A 9518 RETI
_TWI_MW:
info --> Y,+8
nbbytes --> R22
slave_addr --> R20
027B 940E02F3 CALL push_gset2
027D 2F62 MOV R22,R18
027E 2F40 MOV R20,R16
027F 9724 SBIW R28,4
(0289) // Twi_clear_si(); //REMOVE FROM MAIN LOOP, ADDED IN ALL NECESARY CASE (See JSB /RLE)
(0290) }
(0291)
(0292) /*****************************************************************************
(0293) 函数介绍:主机发送模式
(0294) 输入参数: slave_addr:从机地址
(0295) nbbytes:最大字节数
(0296) *info:数据缓存地址
(0297) 输出参数:
(0298) 返回值:无
(0299) *****************************************************************************/
(0300) void TWI_MW(uchar slave_addr,uchar nbbytes,uchar *info) //用户程序
(0301) {
(0302) //twi_send_message_polling(slave_addr, TWI_WRITE, nbbytes, info); //查询方式
(0303) twi_send_message_interrupt(slave_addr, TWI_WRITE, nbbytes, info); //中断方式
0280 8408 LDD R0,Y+8
0281 8419 LDD R1,Y+9
0282 821B STD Y+3,R1
0283 820A STD Y+2,R0
0284 8368 STD Y+0,R22
0285 2722 CLR R18
0286 2F04 MOV R16,R20
0287 DFBA RCALL _twi_send_message_interrupt
0288 9624 ADIW R28,4
0289 940E02EA CALL pop_gset2
028B 9508 RET
_TWI_MR:
info --> Y,+8
nbbytes --> R22
slave_addr --> R20
028C 940E02F3 CALL push_gset2
028E 2F62 MOV R22,R18
028F 2F40 MOV R20,R16
0290 9724 SBIW R28,4
(0304) }
(0305)
(0306) /*****************************************************************************
(0307) 函数介绍:主机接收模式
(0308) 输入参数: slave_addr:从机地址
(0309) nbbytes:最大字节数
(0310) *info:数据缓存地址
(0311) 输出参数:
(0312) 返回值:无
(0313) *****************************************************************************/
(0314) void TWI_MR(uchar slave_addr,uchar nbbytes,uchar *info)
(0315) {
(0316) //twi_send_message_polling(slave_addr, TWI_READ, nbbytes, info); //查询方式
(0317) twi_send_message_interrupt(slave_addr, TWI_READ, nbbytes, info); //中断方式
0291 8408 LDD R0,Y+8
0292 8419 LDD R1,Y+9
0293 821B STD Y+3,R1
0294 820A STD Y+2,R0
0295 8368 STD Y+0,R22
0296 E021 LDI R18,1
0297 2F04 MOV R16,R20
0298 DFA9 RCALL _twi_send_message_interrupt
0299 9624 ADIW R28,4
029A 940E02EA CALL pop_gset2
029C 9508 RET
_main:
Mkeybuf --> Y,+5
Mdisbuf --> Y,+2
i --> R20
029D 9729 SBIW R28,0x9
(0318) }
(0319)
(0320)
(0321)
(0322) void main(void)
(0323) {
(0324) int i;
(0325)
(0326) uchar Mdisbuf[3]={0x90,0x55,0x55};
029E E984 LDI R24,0x94
029F E090 LDI R25,0
02A0 01FE MOVW R30,R28
02A1 9632 ADIW R30,2
02A2 E003 LDI R16,3
02A3 E010 LDI R17,0
02A4 93FA ST R31,-Y
02A5 93EA ST R30,-Y
02A6 939A ST R25,-Y
02A7 938A ST R24,-Y
02A8 940E033A CALL asgncblk
(0327) uchar Mkeybuf[4];
(0328)
(0329) twi_busy = 0;
02AA 2422 CLR R2
02AB 92200102 STS twi_busy,R2
(0330)
(0331) CLI();
02AD 94F8 BCLR 7
(0332) twi_lib_init();
02AE DDBE RCALL _twi_lib_init
(0333) SEI();
02AF 9478 BSET 7
02B0 C035 RJMP 0x02E6
(0334)
(0335)
(0336) /*while(1)
(0337) if(!twi_busy)
(0338) TWI_MR(0x4F, 2, Mkeybuf); //向从机温度传感器0x4F读取2个数据
(0339) */
(0340) while(1)
(0341) {
(0342) if(!twi_busy)
02B1 90200102 LDS R2,twi_busy
02B3 2022 TST R2
02B4 F439 BNE 0x02BC
(0343) TWI_MR(0x21, 4, Mkeybuf);
02B5 01CE MOVW R24,R28
02B6 9605 ADIW R24,5
02B7 8399 STD Y+1,R25
02B8 8388 STD Y+0,R24
02B9 E024 LDI R18,4
02BA E201 LDI R16,0x21
02BB DFD0 RCALL _TWI_MR
(0344)
(0345) if(!twi_busy){
02BC 90200102 LDS R2,twi_busy
02BE 2022 TST R2
02BF F449 BNE 0x02C9
(0346) Mdisbuf[2]=0x09;//点亮
02C0 E089 LDI R24,0x9
02C1 838C STD Y+4,R24
(0347) TWI_MW(0x21, 3, Mdisbuf); //向从机0x21写入3个数据
02C2 01CE MOVW R24,R28
02C3 9602 ADIW R24,2
02C4 8399 STD Y+1,R25
02C5 8388 STD Y+0,R24
02C6 E023 LDI R18,3
02C7 E201 LDI R16,0x21
02C8 DFB2 RCALL _TWI_MW
(0348) }
(0349) for(i=0;i<2000;i++);
02C9 2744 CLR R20
02CA 2755 CLR R21
02CB 5F4F SUBI R20,0xFF
02CC 4F5F SBCI R21,0xFF
02CD 3D40 CPI R20,0xD0
02CE E0E7 LDI R30,7
02CF 075E CPC R21,R30
02D0 F3D4 BLT 0x02CB
(0350) if(!twi_busy){
02D1 90200102 LDS R2,twi_busy
02D3 2022 TST R2
02D4 F449 BNE 0x02DE
(0351) Mdisbuf[2]=0x89;//灭
02D5 E889 LDI R24,0x89
02D6 838C STD Y+4,R24
(0352) TWI_MW(0x21, 3, Mdisbuf); //向从机0x21写入3个数据
02D7 01CE MOVW R24,R28
02D8 9602 ADIW R24,2
02D9 8399 STD Y+1,R25
02DA 8388 STD Y+0,R24
02DB E023 LDI R18,3
02DC E201 LDI R16,0x21
02DD DF9D RCALL _TWI_MW
(0353) }
(0354) for(i=0;i<2000;i++);
02DE 2744 CLR R20
02DF 2755 CLR R21
02E0 5F4F SUBI R20,0xFF
02E1 4F5F SBCI R21,0xFF
02E2 3D40 CPI R20,0xD0
02E3 E0E7 LDI R30,7
02E4 075E CPC R21,R30
02E5 F3D4 BLT 0x02E0
02E6 CFCA RJMP 0x02B1
(0355) }
(0356) /*
(0357) while(1)
(0358) if(!twi_busy)
(0359) TWI_MR(0x21, 4, Mkeybuf); //向从机0x21读取4个数据,中断方式
(0360) */
(0361) while(1);
FILE: <library>
02E7 CFFF RJMP 0x02E7
02E8 9629 ADIW R28,0x9
02E9 9508 RET
pop_gset2:
02EA E0E2 LDI R30,2
02EB 940C02F9 JMP pop
push_gset5:
02ED 92FA ST R15,-Y
02EE 92EA ST R14,-Y
push_gset4:
02EF 92DA ST R13,-Y
02F0 92CA ST R12,-Y
push_gset3:
02F1 92BA ST R11,-Y
02F2 92AA ST R10,-Y
push_gset2:
02F3 937A ST R23,-Y
02F4 936A ST R22,-Y
push_gset1:
02F5 935A ST R21,-Y
02F6 934A ST R20,-Y
02F7 9508 RET
pop_gset1:
02F8 E0E1 LDI R30,1
pop:
02F9 9149 LD R20,Y+
02FA 9159 LD R21,Y+
02FB FDE0 SBRC R30,0
02FC 9508 RET
02FD 9169 LD R22,Y+
02FE 9179 LD R23,Y+
02FF FDE1 SBRC R30,1
0300 9508 RET
0301 90A9 LD R10,Y+
0302 90B9 LD R11,Y+
0303 FDE2 SBRC R30,2
0304 9508 RET
0305 90C9 LD R12,Y+
0306 90D9 LD R13,Y+
0307 FDE3 SBRC R30,3
0308 9508 RET
0309 90E9 LD R14,Y+
030A 90F9 LD R15,Y+
030B 9508 RET
push_lset:
030C 93FA ST R31,-Y
030D 93EA ST R30,-Y
030E 93BA ST R27,-Y
030F 93AA ST R26,-Y
0310 939A ST R25,-Y
0311 938A ST R24,-Y
0312 933A ST R19,-Y
0313 932A ST R18,-Y
0314 931A ST R17,-Y
0315 930A ST R16,-Y
0316 929A ST R9,-Y
0317 928A ST R8,-Y
0318 927A ST R7,-Y
0319 926A ST R6,-Y
031A 925A ST R5,-Y
031B 924A ST R4,-Y
031C 923A ST R3,-Y
031D 922A ST R2,-Y
031E 921A ST R1,-Y
031F 920A ST R0,-Y
0320 B60F IN R0,0x3F
0321 920A ST R0,-Y
0322 9508 RET
pop_lset:
0323 9009 LD R0,Y+
0324 BE0F OUT 0x3F,R0
0325 9009 LD R0,Y+
0326 9019 LD R1,Y+
0327 9029 LD R2,Y+
0328 9039 LD R3,Y+
0329 9049 LD R4,Y+
032A 9059 LD R5,Y+
032B 9069 LD R6,Y+
032C 9079 LD R7,Y+
032D 9089 LD R8,Y+
032E 9099 LD R9,Y+
032F 9109 LD R16,Y+
0330 9119 LD R17,Y+
0331 9129 LD R18,Y+
0332 9139 LD R19,Y+
0333 9189 LD R24,Y+
0334 9199 LD R25,Y+
0335 91A9 LD R26,Y+
0336 91B9 LD R27,Y+
0337 91E9 LD R30,Y+
0338 91F9 LD R31,Y+
0339 9508 RET
asgncblk:
033A 93AA ST R26,-Y
033B 93BA ST R27,-Y
033C 93EA ST R30,-Y
033D 93FA ST R31,-Y
033E 920A ST R0,-Y
033F 81AF LDD R26,Y+7
0340 85B8 LDD R27,Y+8
0341 81ED LDD R30,Y+5
0342 81FE LDD R31,Y+6
0343 3000 CPI R16,0
0344 0701 CPC R16,R17
0345 F031 BEQ 0x034C
0346 95C8 LPM
0347 920D ST R0,X+
0348 9631 ADIW R30,1
0349 5001 SUBI R16,1
034A 4010 SBCI R17,0
034B CFF7 RJMP 0x0343
034C 9009 LD R0,Y+
034D 91F9 LD R31,Y+
034E 91E9 LD R30,Y+
034F 91B9 LD R27,Y+
0350 91A9 LD R26,Y+
0351 9624 ADIW R28,4
0352 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -