📄 24c01a.lst
字号:
data --> R20
00E7 940E02A0 CALL push_gset1
00E9 2F40 MOV R20,R16
(0214) }
(0215) /*--------------------------------------------------------------------
(0216) 函数名称:I2C_SendDat
(0217) 函数功能:I2C发送数据
(0218) 注意事项:
(0219) 提示说明:
(0220) 输 入:待发送的字节数据
(0221) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0222) --------------------------------------------------------------------*/
(0223) unsigned char I2C_SendDat(unsigned char data)
(0224) {
(0225) I2C_SendByte(data);
00EA 2F04 MOV R16,R20
00EB DF7D RCALL _I2C_SendByte
(0226) if(!I2C_WaitINT()) return I2C_ERR;
00EC DF6C RCALL _I2C_WaitINT
00ED 2300 TST R16
00EE F411 BNE 0x00F1
00EF 2700 CLR R16
00F0 C007 RJMP 0x00F8
(0227) if( I2C_STATUS!=I2C_MT_DATA_ACK )
00F1 B181 IN R24,0x01
00F2 7F88 ANDI R24,0xF8
00F3 3288 CPI R24,0x28
00F4 F011 BEQ 0x00F7
(0228) return I2C_ERR;
00F5 2700 CLR R16
00F6 C001 RJMP 0x00F8
(0229) return I2C_CRR;
00F7 E001 LDI R16,1
00F8 940E02A3 CALL pop_gset1
00FA 9508 RET
_I2C_RcvNAckDat:
pRdDat --> R20
00FB 940E02A0 CALL push_gset1
00FD 01A8 MOVW R20,R16
(0230) }
(0231) /*--------------------------------------------------------------------
(0232) 函数名称:I2C_RcvNAckDat
(0233) 函数功能:I2C接收数据且不产生应答
(0234) 注意事项:
(0235) 提示说明:
(0236) 输 入:接收数据存储空间指针
(0237) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0238) --------------------------------------------------------------------*/
(0239) unsigned char I2C_RcvNAckDat(unsigned char *pRdDat)
(0240) {
(0241) I2CRcvNckByte();
00FE E884 LDI R24,0x84
00FF BF86 OUT 0x36,R24
(0242) if(!I2C_WaitINT()) return I2C_ERR;
0100 DF58 RCALL _I2C_WaitINT
0101 2300 TST R16
0102 F411 BNE 0x0105
0103 2700 CLR R16
0104 C00A RJMP 0x010F
(0243) if( I2C_STATUS!=I2C_MR_DATA_NACK )
0105 B181 IN R24,0x01
0106 7F88 ANDI R24,0xF8
0107 3588 CPI R24,0x58
0108 F011 BEQ 0x010B
(0244) return I2C_ERR;
0109 2700 CLR R16
010A C004 RJMP 0x010F
(0245) *pRdDat=TWDR;
010B B023 IN R2,0x03
010C 01FA MOVW R30,R20
010D 8220 STD Z+0,R2
(0246) return I2C_CRR;
010E E001 LDI R16,1
010F 940E02A3 CALL pop_gset1
0111 9508 RET
_I2C_RcvAckDat:
pRdDat --> R20
0112 940E02A0 CALL push_gset1
0114 01A8 MOVW R20,R16
(0247) }
(0248) /*--------------------------------------------------------------------
(0249) 函数名称:I2C_RcvAckDat
(0250) 函数功能:I2C接收数据且产生应答
(0251) 注意事项:
(0252) 提示说明:
(0253) 输 入:接收数据存储空间指针
(0254) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0255) --------------------------------------------------------------------*/
(0256) unsigned char I2C_RcvAckDat(unsigned char *pRdDat)
(0257) {
(0258) I2CRcvAckByte();
0115 EC84 LDI R24,0xC4
0116 BF86 OUT 0x36,R24
(0259) if(!I2C_WaitINT()) return I2C_ERR;
0117 DF41 RCALL _I2C_WaitINT
0118 2300 TST R16
0119 F411 BNE 0x011C
011A 2700 CLR R16
011B C00A RJMP 0x0126
(0260) if( I2C_STATUS!=I2C_MR_DATA_ACK )
011C B181 IN R24,0x01
011D 7F88 ANDI R24,0xF8
011E 3580 CPI R24,0x50
011F F011 BEQ 0x0122
(0261) return I2C_ERR;
0120 2700 CLR R16
0121 C004 RJMP 0x0126
(0262) *pRdDat=TWDR;
0122 B023 IN R2,0x03
0123 01FA MOVW R30,R20
0124 8220 STD Z+0,R2
(0263) return I2C_CRR;
0125 E001 LDI R16,1
0126 940E02A3 CALL pop_gset1
0128 9508 RET
_I2C_Write:
dat --> Y+4
wordAdr --> R20
wrDAdr --> R22
0129 940E029E CALL push_gset2
012B 2F42 MOV R20,R18
012C 01B8 MOVW R22,R16
(0264) }
(0265)
(0266)
(0267) /*以下是API函数*/
(0268)
(0269) /*--------------------------------------------------------------------
(0270) 函数名称:I2C_Write
(0271) 函数功能:I2C写器件,写一个字节
(0272) 注意事项:
(0273) 提示说明:
(0274) 输 入:wrDAdr : write device-address 写器件地址
(0275) wordAdr: word address 从地址
(0276) dat: data 数据
(0277) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0278) --------------------------------------------------------------------*/
(0279) unsigned char I2C_Write(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat)
(0280) {
(0281) if( I2C_Start()==I2C_ERR )
012D DF3F RCALL _I2C_Start
012E 2300 TST R16
012F F411 BNE 0x0132
(0282) return I2C_ERR;
0130 2700 CLR R16
0131 C016 RJMP 0x0148
(0283) //wrDAdr &=0xfffe;
(0284) if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
0132 018B MOVW R16,R22
0133 7F0E ANDI R16,0xFE
0134 DF6A RCALL _I2C_SendWrDAdr_
0135 2300 TST R16
0136 F411 BNE 0x0139
(0285) return I2C_ERR;
0137 2700 CLR R16
0138 C00F RJMP 0x0148
(0286)
(0287) if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送
0139 2F04 MOV R16,R20
013A DFAC RCALL _I2C_SendDat
013B 2300 TST R16
013C F411 BNE 0x013F
(0288) return I2C_ERR;
013D 2700 CLR R16
013E C009 RJMP 0x0148
(0289)
(0290) if( I2C_SendDat(dat)==I2C_ERR )
013F 810C LDD R16,Y+4
0140 DFA6 RCALL _I2C_SendDat
0141 2300 TST R16
0142 F411 BNE 0x0145
(0291) return I2C_ERR;
0143 2700 CLR R16
0144 C003 RJMP 0x0148
(0292)
(0293) I2CStop();
0145 E984 LDI R24,0x94
0146 BF86 OUT 0x36,R24
(0294)
(0295) return I2C_CRR;
0147 E001 LDI R16,1
0148 940E0292 CALL pop_gset2
014A 9508 RET
_I2C_Write_:
i --> R20
num --> R22
pWrDat --> R10
wordAdr --> R20
wrDAdr --> R12
014B 940E029A CALL push_gset4
014D 2F42 MOV R20,R18
014E 0168 MOVW R12,R16
014F 84A8 LDD R10,Y+8
0150 84B9 LDD R11,Y+9
0151 856A LDD R22,Y+10
(0296) }
(0297) /*--------------------------------------------------------------------
(0298) 函数名称:I2C_Write_
(0299) 函数功能:I2C写器件,写N个数据
(0300) 注意事项:
(0301) 提示说明:
(0302) 输 入:wrDAdr : write device-address 写器件地址
(0303) wordAdr: word address 从地址
(0304) *pWrDat: p->write data 写入数据的指针
(0305) num : number 写入数据个数
(0306) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0307) --------------------------------------------------------------------*/
(0308) unsigned char I2C_Write_(unsigned int wrDAdr,unsigned char wordAdr,
(0309) unsigned char *pWrDat,unsigned char num)
(0310) {
(0311) unsigned char i;
(0312)
(0313) if( I2C_Start()==I2C_ERR )
0152 DF1A RCALL _I2C_Start
0153 2300 TST R16
0154 F411 BNE 0x0157
(0314) return I2C_ERR;
0155 2700 CLR R16
0156 C01D RJMP 0x0174
(0315)
(0316) //wrDAdr &=0xfffe;
(0317) if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
0157 0186 MOVW R16,R12
0158 7F0E ANDI R16,0xFE
0159 DF45 RCALL _I2C_SendWrDAdr_
015A 2300 TST R16
015B F411 BNE 0x015E
(0318) return I2C_ERR;
015C 2700 CLR R16
015D C016 RJMP 0x0174
(0319)
(0320) if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送
015E 2F04 MOV R16,R20
015F DF87 RCALL _I2C_SendDat
0160 2300 TST R16
0161 F411 BNE 0x0164
(0321) return I2C_ERR;
0162 2700 CLR R16
0163 C010 RJMP 0x0174
(0322)
(0323) for(i=0;i<num;i++)
0164 2744 CLR R20
0165 C009 RJMP 0x016F
(0324) if( I2C_SendDat(*(pWrDat++))==I2C_ERR )
0166 01F5 MOVW R30,R10
0167 9101 LD R16,Z+
0168 015F MOVW R10,R30
0169 DF7D RCALL _I2C_SendDat
016A 2300 TST R16
016B F411 BNE 0x016E
(0325) return I2C_ERR;
016C 2700 CLR R16
016D C006 RJMP 0x0174
016E 9543 INC R20
016F 1746 CP R20,R22
0170 F3A8 BCS 0x0166
(0326)
(0327) I2CStop();
0171 E984 LDI R24,0x94
0172 BF86 OUT 0x36,R24
(0328)
(0329) return I2C_CRR;
0173 E001 LDI R16,1
0174 940E0295 CALL pop_gset4
0176 9508 RET
_I2C_Read:
pRdDat --> Y+4
wordAdr --> R22
rdDAdr --> R20
0177 940E029E CALL push_gset2
0179 2F62 MOV R22,R18
017A 01A8 MOVW R20,R16
(0330) }
(0331) /*--------------------------------------------------------------------
(0332) 函数名称:I2C_Read
(0333) 函数功能:I2C读器件,读一个数据
(0334) 注意事项:
(0335) 提示说明:
(0336) 输 入:rdDAdr : read device-address 读器件地址
(0337) wordAdr: word address 从地址
(0338) *pRdDat: p->read data 读取数据指针
(0339) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0340) --------------------------------------------------------------------*/
(0341) unsigned char I2C_Read(unsigned int rdDAdr,unsigned char wordAdr,unsigned char *pRdDat)
(0342) {
(0343) if( I2C_Start()==I2C_ERR )
017B DEF1 RCALL _I2C_Start
017C 2300 TST R16
017D F411 BNE 0x0180
(0344) return I2C_ERR;
017E 2700 CLR R16
017F C024 RJMP 0x01A4
(0345)
(0346) //rdDAdr &=0xfffe;
(0347) if( I2C_SendWrDAdr_((rdDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
0180 018A MOVW R16,R20
0181 7F0E ANDI R16,0xFE
0182 DF1C RCALL _I2C_SendWrDAdr_
0183 2300 TST R16
0184 F411 BNE 0x0187
(0348) return I2C_ERR;
0185 2700 CLR R16
0186 C01D RJMP 0x01A4
(0349)
(0350) if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送。
0187 2F06 MOV R16,R22
0188 DF5E RCALL _I2C_SendDat
0189 2300 TST R16
018A F411 BNE 0x018D
(0351) return I2C_ERR;
018B 2700 CLR R16
018C C017 RJMP 0x01A4
(0352)
(0353) if( I2C_Restart()==I2C_ERR )//重启动
018D DEEE RCALL _I2C_Restart
018E 2300 TST R16
018F F411 BNE 0x0192
(0354) return I2C_ERR;
0190 2700 CLR R16
0191 C012 RJMP 0x01A4
(0355)
(0356) //rdDAdr &=0xfffe;
(0357) if( I2C_SendRdDAdr((rdDAdr&0xfffe)|I2C_READ)==I2C_ERR )//保证读控制位正确
0192 2F04 MOV R16,R20
0193 7F0E ANDI R16,0xFE
0194 6001 ORI R16,1
0195 DF23 RCALL _I2C_SendRdDAdr
0196 2300 TST R16
0197 F411 BNE 0x019A
(0358) return I2C_ERR;
0198 2700 CLR R16
0199 C00A RJMP 0x01A4
(0359)
(0360) if( I2C_RcvNAckDat(pRdDat)==I2C_ERR )//接收数据
019A 810C LDD R16,Y+4
019B 811D LDD R17,Y+5
019C DF5E RCALL _I2C_RcvNAckDat
019D 2300 TST R16
019E F411 BNE 0x01A1
(0361) return I2C_ERR;
019F 2700 CLR R16
01A0 C003 RJMP 0x01A4
(0362)
(0363) I2CStop();
01A1 E984 LDI R24,0x94
01A2 BF86 OUT 0x36,R24
(0364)
(0365) return I2C_CRR;
01A3 E001 LDI R16,1
01A4 940E0292 CALL pop_gset2
01A6 9508 RET
_I2C_Read_:
i --> R20
num --> R22
pRdDat --> R10
wordAdr --> R12
rdDAdr --> R20
01A7 940E029A CALL push_gset4
01A9 2EC2 MOV R12,R18
01AA 01A8 MOVW R20,R16
01AB 84A8 LDD R10,Y+8
01AC 84B9 LDD R11,Y+9
01AD 856A LDD R22,Y+10
(0366) }
(0367) /*--------------------------------------------------------------------
(0368) 函数名称:I2C_Read_
(0369) 函数功能:I2C读器件,读N个数据
(0370) 注意事项:
(0371) 提示说明:
(0372) 输 入:rdDAdr : read device-address 读器件地址
(0373) wordAdr: word address 字地址
(0374) *pRdDat: p->read data 读取数据指针
(0375) num : number 读取数据个数
(0376) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0377) --------------------------------------------------------------------*/
(0378) unsigned char I2C_Read_(unsigned int rdDAdr,unsigned char wordAdr,
(0379) unsigned char *pRdDat,unsigned char num)
(0380) {
(0381) unsigned char i;
(0382)
(0383) if( I2C_Start()==I2C_ERR )
01AE DEBE RCALL _I2C_Start
01AF 2300 TST R16
01B0 F411 BNE 0x01B3
(0384) return I2C_ERR;
01B1 2700 CLR R16
01B2 C036 RJMP 0x01E9
(0385) //rdDAdr &=0xfffe;
(0386) if( I2C_SendWrDAdr_((rdDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
01B3 018A MOVW R16,R20
01B4 7F0E ANDI R16,0xFE
01B5 DEE9 RCALL _I2C_SendWrDAdr_
01B6 2300 TST R16
01B7 F411 BNE 0x01BA
(0387) return I2C_ERR;
01B8 2700 CLR R16
01B9 C02F RJMP 0x01E9
(0388)
(0389) if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送。
01BA 2D0C MOV R16,R12
01BB DF2B RCALL _I2C_SendDat
01BC 2300 TST R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -