📄 24c01a.lst
字号:
01BD F411 BNE 0x01C0
(0390) return I2C_ERR;
01BE 2700 CLR R16
01BF C029 RJMP 0x01E9
(0391)
(0392) if( I2C_Restart()==I2C_ERR )//重启动
01C0 DEBB RCALL _I2C_Restart
01C1 2300 TST R16
01C2 F411 BNE 0x01C5
(0393) return I2C_ERR;
01C3 2700 CLR R16
01C4 C024 RJMP 0x01E9
(0394)
(0395) //rdDAdr &=0xfffe;
(0396) if( I2C_SendRdDAdr((rdDAdr&0xfffe)|I2C_READ)==I2C_ERR )//保证读控制位正确
01C5 2F04 MOV R16,R20
01C6 7F0E ANDI R16,0xFE
01C7 6001 ORI R16,1
01C8 DEF0 RCALL _I2C_SendRdDAdr
01C9 2300 TST R16
01CA F411 BNE 0x01CD
(0397) return I2C_ERR;
01CB 2700 CLR R16
01CC C01C RJMP 0x01E9
(0398)
(0399) for(i=0;i<num-1;i++) //接收数据
01CD 2744 CLR R20
01CE C00A RJMP 0x01D9
(0400) if( I2C_RcvAckDat(pRdDat+i)==I2C_ERR )
01CF 2F04 MOV R16,R20
01D0 2711 CLR R17
01D1 0D0A ADD R16,R10
01D2 1D1B ADC R17,R11
01D3 DF3E RCALL _I2C_RcvAckDat
01D4 2300 TST R16
01D5 F411 BNE 0x01D8
(0401) return I2C_ERR;
01D6 2700 CLR R16
01D7 C011 RJMP 0x01E9
01D8 9543 INC R20
01D9 2F86 MOV R24,R22
01DA 5081 SUBI R24,1
01DB 1748 CP R20,R24
01DC F390 BCS 0x01CF
(0402)
(0403) if( I2C_RcvNAckDat(pRdDat+i)==I2C_ERR )
01DD 2F04 MOV R16,R20
01DE 2711 CLR R17
01DF 0D0A ADD R16,R10
01E0 1D1B ADC R17,R11
01E1 DF19 RCALL _I2C_RcvNAckDat
01E2 2300 TST R16
01E3 F411 BNE 0x01E6
(0404) return I2C_ERR;
01E4 2700 CLR R16
01E5 C003 RJMP 0x01E9
(0405)
(0406) I2CStop();
01E6 E984 LDI R24,0x94
01E7 BF86 OUT 0x36,R24
(0407)
(0408) return I2C_CRR;
01E8 E001 LDI R16,1
01E9 940E0295 CALL pop_gset4
01EB 9508 RET
_I2C_Write_direct:
dat --> R20
wrDAdr --> R22
01EC 940E029E CALL push_gset2
01EE 2F42 MOV R20,R18
01EF 01B8 MOVW R22,R16
(0409) }
(0410) /*--------------------------------------------------------------------
(0411) 函数名称:I2C_Write_direct
(0412) 函数功能:I2C写无从地址器件,写一个字节
(0413) 注意事项:
(0414) 提示说明:
(0415) 输 入:wrDAdr : write device-address 写器件地址
(0416) dat: data 数据
(0417) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0418) --------------------------------------------------------------------*/
(0419) unsigned char I2C_Write_direct(unsigned int wrDAdr,unsigned char dat)
(0420) {
(0421) if( I2C_Start()==I2C_ERR )
01F0 DE7C RCALL _I2C_Start
01F1 2300 TST R16
01F2 F411 BNE 0x01F5
(0422) return I2C_ERR;
01F3 2700 CLR R16
01F4 C010 RJMP 0x0205
(0423) //wrDAdr &=0xfffe;
(0424) if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
01F5 018B MOVW R16,R22
01F6 7F0E ANDI R16,0xFE
01F7 DEA7 RCALL _I2C_SendWrDAdr_
01F8 2300 TST R16
01F9 F411 BNE 0x01FC
(0425) return I2C_ERR;
01FA 2700 CLR R16
01FB C009 RJMP 0x0205
(0426)
(0427) if( I2C_SendDat(dat)==I2C_ERR )//直接写数据
01FC 2F04 MOV R16,R20
01FD DEE9 RCALL _I2C_SendDat
01FE 2300 TST R16
01FF F411 BNE 0x0202
(0428) return I2C_ERR;
0200 2700 CLR R16
0201 C003 RJMP 0x0205
(0429)
(0430) I2CStop();
0202 E984 LDI R24,0x94
0203 BF86 OUT 0x36,R24
(0431)
(0432) return I2C_CRR;
0204 E001 LDI R16,1
0205 940E0292 CALL pop_gset2
0207 9508 RET
_I2C_Read_direct:
pRdDat --> Y+4
wordAdr --> R22
rdDAdr --> R20
0208 940E029E CALL push_gset2
020A 2F62 MOV R22,R18
020B 01A8 MOVW R20,R16
(0433) }
(0434) /*--------------------------------------------------------------------
(0435) 函数名称:I2C_Read_direct
(0436) 函数功能:I2C读无从地址器件,读一个数据
(0437) 注意事项:
(0438) 提示说明:
(0439) 输 入:rdDAdr : read device-address 读器件地址
(0440) *pRdDat: p->read data 读取数据指针
(0441) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0442) --------------------------------------------------------------------*/
(0443) unsigned char I2C_Read_direct(unsigned int rdDAdr,unsigned char wordAdr,unsigned char *pRdDat)
(0444) {
(0445) if( I2C_Start()==I2C_ERR )
020C DE60 RCALL _I2C_Start
020D 2300 TST R16
020E F411 BNE 0x0211
(0446) return I2C_ERR;
020F 2700 CLR R16
0210 C011 RJMP 0x0222
(0447)
(0448) //rdDAdr &=0xfffe;
(0449) if( I2C_SendWrDAdr_((rdDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )
0211 018A MOVW R16,R20
0212 7F0E ANDI R16,0xFE
0213 DE8B RCALL _I2C_SendWrDAdr_
0214 2300 TST R16
0215 F411 BNE 0x0218
(0450) return I2C_ERR;
0216 2700 CLR R16
0217 C00A RJMP 0x0222
(0451)
(0452) if( I2C_RcvNAckDat(pRdDat)==I2C_ERR )//直接读数据
0218 810C LDD R16,Y+4
0219 811D LDD R17,Y+5
021A DEE0 RCALL _I2C_RcvNAckDat
021B 2300 TST R16
021C F411 BNE 0x021F
(0453) return I2C_ERR;
021D 2700 CLR R16
021E C003 RJMP 0x0222
(0454)
(0455) I2CStop();
021F E984 LDI R24,0x94
0220 BF86 OUT 0x36,R24
(0456)
(0457) return I2C_CRR;
0221 E001 LDI R16,1
0222 940E0292 CALL pop_gset2
0224 9508 RET
FILE: D:\24C01A\24C01A.c
(0001)
(0002) #include <iom16v.h>
(0003) #include <macros.h>
(0004) #include "I2C.h"
(0005)
(0006) void delay_1ms(void) //1ms延时函数
(0007) {
(0008) unsigned int i;
(0009) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
0225 2700 CLR R16
0226 2711 CLR R17
0227 C002 RJMP 0x022A
0228 5F0F SUBI R16,0xFF
0229 4F1F SBCI R17,0xFF
022A 3704 CPI R16,0x74
022B E0E4 LDI R30,4
022C 071E CPC R17,R30
022D F3D0 BCS 0x0228
022E 9508 RET
_main:
temp3 --> Y+19
temp2 --> Y+11
p --> R22
temp1 --> Y+3
i --> R20
022F 9769 SBIW R28,0x19
(0010) }
(0011)
(0012) void main()
(0013) {
(0014) unsigned char temp1[8]={18,17,16,15,14,13,12,11};
0230 E584 LDI R24,0x54
0231 E090 LDI R25,0
0232 01FE MOVW R30,R28
0233 9633 ADIW R30,3
0234 E008 LDI R16,0x8
0235 E010 LDI R17,0
0236 93FA ST R31,-Y
0237 93EA ST R30,-Y
0238 939A ST R25,-Y
0239 938A ST R24,-Y
023A 940E02B7 CALL asgncblk
(0015) unsigned char temp2[8]={0};
023C E58C LDI R24,0x5C
023D E090 LDI R25,0
023E 01FE MOVW R30,R28
023F 963B ADIW R30,0xB
0240 E008 LDI R16,0x8
0241 E010 LDI R17,0
0242 93FA ST R31,-Y
0243 93EA ST R30,-Y
0244 939A ST R25,-Y
0245 938A ST R24,-Y
0246 940E02B7 CALL asgncblk
(0016) unsigned char temp3[6]={0};
0248 E684 LDI R24,0x64
0249 E090 LDI R25,0
024A 01FE MOVW R30,R28
024B 9673 ADIW R30,0x13
024C E006 LDI R16,6
024D E010 LDI R17,0
024E 93FA ST R31,-Y
024F 93EA ST R30,-Y
0250 939A ST R25,-Y
0251 938A ST R24,-Y
0252 940E02B7 CALL asgncblk
(0017) unsigned char i=0,*p;
0254 2744 CLR R20
(0018)
(0019) I2C_Init();
0255 DE00 RCALL _I2C_Init
(0020)
(0021) I2C_Write_(0xa0,0,temp1,8);//一次写入8个字节
0256 E088 LDI R24,0x8
0257 838A STD Y+2,R24
0258 01CE MOVW R24,R28
0259 9603 ADIW R24,3
025A 8399 STD Y+1,R25
025B 8388 STD Y+0,R24
025C 2722 CLR R18
025D EA00 LDI R16,0xA0
025E E010 LDI R17,0
025F DEEB RCALL _I2C_Write_
(0022) delay_1ms();
0260 DFC4 RCALL _delay_1ms
(0023) delay_1ms();
0261 DFC3 RCALL _delay_1ms
(0024)
(0025) I2C_Read_(0xa0,0,temp2,8);//一次读取8个字节
0262 E088 LDI R24,0x8
0263 838A STD Y+2,R24
0264 01CE MOVW R24,R28
0265 960B ADIW R24,0xB
0266 8399 STD Y+1,R25
0267 8388 STD Y+0,R24
0268 2722 CLR R18
0269 EA00 LDI R16,0xA0
026A E010 LDI R17,0
026B DF3B RCALL _I2C_Read_
(0026)
(0027) for(i=10;i<16;i++) //循环6次,写入6个字节
026C E04A LDI R20,0xA
026D C00E RJMP 0x027C
(0028) {
(0029) I2C_Write(0xa0,i,temp1[i-10]);
026E 01CE MOVW R24,R28
026F 9707 SBIW R24,7
0270 2FE4 MOV R30,R20
0271 27FF CLR R31
0272 0FE8 ADD R30,R24
0273 1FF9 ADC R31,R25
0274 8020 LDD R2,Z+0
0275 8228 STD Y+0,R2
0276 2F24 MOV R18,R20
0277 EA00 LDI R16,0xA0
0278 E010 LDI R17,0
0279 DEAF RCALL _I2C_Write
(0030) delay_1ms(); //延时不可缺少
027A DFAA RCALL _delay_1ms
027B 9543 INC R20
027C 3140 CPI R20,0x10
027D F380 BCS 0x026E
(0031) //delay_1ms();
(0032) }
(0033)
(0034) p=temp3;
027E 01BE MOVW R22,R28
027F 5E6D SUBI R22,0xED
0280 4F7F SBCI R23,0xFF
(0035) for(i=10;i<16;i++) //循环6次,读取6个字节至temp3
0281 E04A LDI R20,0xA
0282 C00A RJMP 0x028D
(0036) {I2C_Read(0xa0,i,p++);
0283 011B MOVW R2,R22
0284 5F6F SUBI R22,0xFF
0285 4F7F SBCI R23,0xFF
0286 8239 STD Y+1,R3
0287 8228 STD Y+0,R2
0288 2F24 MOV R18,R20
0289 EA00 LDI R16,0xA0
028A E010 LDI R17,0
028B DEEB RCALL _I2C_Read
028C 9543 INC R20
028D 3140 CPI R20,0x10
028E F3A0 BCS 0x0283
(0037) //delay_1ms();
(0038) //delay_1ms();
(0039) }
(0040)
(0041) while(1);
FILE: <library>
028F CFFF RJMP 0x028F
0290 9669 ADIW R28,0x19
0291 9508 RET
pop_gset2:
0292 E0E2 LDI R30,2
0293 940C02A4 JMP pop
pop_gset4:
0295 E0E8 LDI R30,0x8
0296 940C02A4 JMP pop
push_gset5:
0298 92FA ST R15,-Y
0299 92EA ST R14,-Y
push_gset4:
029A 92DA ST R13,-Y
029B 92CA ST R12,-Y
push_gset3:
029C 92BA ST R11,-Y
029D 92AA ST R10,-Y
push_gset2:
029E 937A ST R23,-Y
029F 936A ST R22,-Y
push_gset1:
02A0 935A ST R21,-Y
02A1 934A ST R20,-Y
02A2 9508 RET
pop_gset1:
02A3 E0E1 LDI R30,1
pop:
02A4 9149 LD R20,Y+
02A5 9159 LD R21,Y+
02A6 FDE0 SBRC R30,0
02A7 9508 RET
02A8 9169 LD R22,Y+
02A9 9179 LD R23,Y+
02AA FDE1 SBRC R30,1
02AB 9508 RET
02AC 90A9 LD R10,Y+
02AD 90B9 LD R11,Y+
02AE FDE2 SBRC R30,2
02AF 9508 RET
02B0 90C9 LD R12,Y+
02B1 90D9 LD R13,Y+
02B2 FDE3 SBRC R30,3
02B3 9508 RET
02B4 90E9 LD R14,Y+
02B5 90F9 LD R15,Y+
02B6 9508 RET
asgncblk:
02B7 93AA ST R26,-Y
02B8 93BA ST R27,-Y
02B9 93EA ST R30,-Y
02BA 93FA ST R31,-Y
02BB 920A ST R0,-Y
02BC 81AF LDD R26,Y+7
02BD 85B8 LDD R27,Y+8
02BE 81ED LDD R30,Y+5
02BF 81FE LDD R31,Y+6
02C0 3000 CPI R16,0
02C1 0701 CPC R16,R17
02C2 F031 BEQ 0x02C9
02C3 95C8 LPM
02C4 920D ST R0,X+
02C5 9631 ADIW R30,1
02C6 5001 SUBI R16,1
02C7 4010 SBCI R17,0
02C8 CFF7 RJMP 0x02C0
02C9 9009 LD R0,Y+
02CA 91F9 LD R31,Y+
02CB 91E9 LD R30,Y+
02CC 91B9 LD R27,Y+
02CD 91A9 LD R26,Y+
02CE 9624 ADIW R28,4
02CF 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -