📄 m16i2c.lst
字号:
(0147) return I2C_CRR;
0090 E001 LDI R16,1
0091 9508 RET
(0148) }
(0149) /*--------------------------------------------------------------------
(0150) 函数名称:发送 7位 器件写地址: XXXX XXX0
(0151) 函数功能:
(0152) 注意事项:
(0153) 提示说明:
(0154) 输 入:
(0155) 返 回:
(0156) --------------------------------------------------------------------*/
(0157) bool I2C_SendWrDAdr(uint8 wrDAdr)
(0158) {
(0159) I2CSendByte(wrDAdr); //设置 器件写地址
_I2C_SendWrDAdr:
wrDAdr --> R16
0092 B903 OUT 0x03,R16
0093 E884 LDI R24,0x84
0094 BF86 OUT 0x36,R24
(0160) I2CWaitAck();
0095 B626 IN R2,0x36
0096 FE27 SBRS R2,7
0097 CFFD RJMP 0x0095
(0161) if( I2CChkAck()!=I2C_MT_SLA_ACK )
0098 B181 IN R24,0x01
0099 7F88 ANDI R24,0xF8
009A 3188 CPI R24,0x18
009B F011 BEQ 0x009E
(0162) return I2C_ERR;
009C 2700 CLR R16
009D C001 RJMP 0x009F
(0163) return I2C_CRR;
009E E001 LDI R16,1
009F 9508 RET
_I2C_SendWrDAdr_:
wrDAdr --> R20
00A0 940E0253 CALL push_gset1
00A2 01A8 MOVW R20,R16
(0164) }
(0165) /*--------------------------------------------------------------------
(0166) 函数名称:发送 10位 器件写地址: 1111 0XX0, XXXX XXXX
(0167) 函数功能:
(0168) 注意事项:
(0169) 提示说明:兼容 发送 7位 器件写地址: XXXX XXX0
(0170) 输 入:
(0171) 返 回:
(0172) --------------------------------------------------------------------*/
(0173) bool I2C_SendWrDAdr_(uint16 wrDAdr)
(0174) {
(0175) if( wrDAdr&0xF000 == 0xF000 ) //判断是否为 10位 器件地址
00A3 FF40 SBRS R20,0
00A4 C00B RJMP 0x00B0
(0176) if( I2C_SendWrDAdr( (uint8)wrDAdr>>8 )==I2C_ERR ) //设置 (高位)器件写地址
00A5 2F04 MOV R16,R20
00A6 2711 CLR R17
00A7 2F01 MOV R16,R17
00A8 2711 CLR R17
00A9 FD07 SBRC R16,7
00AA 9510 COM R17
00AB DFE6 RCALL _I2C_SendWrDAdr
00AC 2300 TST R16
00AD F411 BNE 0x00B0
(0177) return I2C_ERR;
00AE 2700 CLR R16
00AF C007 RJMP 0x00B7
(0178) if( I2C_SendWrDAdr( (uint8)wrDAdr )==I2C_ERR ) //设置 (低位)器件写地址
00B0 2F04 MOV R16,R20
00B1 DFE0 RCALL _I2C_SendWrDAdr
00B2 2300 TST R16
00B3 F411 BNE 0x00B6
(0179) return I2C_ERR;
00B4 2700 CLR R16
00B5 C001 RJMP 0x00B7
(0180) return I2C_CRR;
00B6 E001 LDI R16,1
00B7 940E0256 CALL pop_gset1
00B9 9508 RET
(0181) }
(0182) /*--------------------------------------------------------------------
(0183) 函数名称:发送 7位 器件读地址: XXXX XXX1
(0184) 函数功能:
(0185) 注意事项:
(0186) 提示说明:
(0187) 输 入:
(0188) 返 回:
(0189) --------------------------------------------------------------------*/
(0190) bool I2C_SendRdDAdr(uint8 rdDAdr)
(0191) {
(0192) I2CSendByte(rdDAdr); //设置 器件读地址
_I2C_SendRdDAdr:
rdDAdr --> R16
00BA B903 OUT 0x03,R16
00BB E884 LDI R24,0x84
00BC BF86 OUT 0x36,R24
(0193) I2CWaitAck();
00BD B626 IN R2,0x36
00BE FE27 SBRS R2,7
00BF CFFD RJMP 0x00BD
(0194) if( I2CChkAck()!=I2C_MR_SLA_ACK )
00C0 B181 IN R24,0x01
00C1 7F88 ANDI R24,0xF8
00C2 3480 CPI R24,0x40
00C3 F011 BEQ 0x00C6
(0195) return I2C_ERR;
00C4 2700 CLR R16
00C5 C001 RJMP 0x00C7
(0196) return I2C_CRR;
00C6 E001 LDI R16,1
00C7 9508 RET
_I2C_SendRdDAdr_:
rdDAdr --> R20
00C8 940E0253 CALL push_gset1
00CA 2F40 MOV R20,R16
(0197) }
(0198) /*--------------------------------------------------------------------
(0199) 函数名称:发送 10位 器件读地址: 1111 0XX0, XXXX XXXX
(0200) 函数功能:
(0201) 注意事项:
(0202) 提示说明:
(0203) 输 入:
(0204) 返 回:
(0205) --------------------------------------------------------------------*/
(0206) bool I2C_SendRdDAdr_(uint8 rdDAdr)
(0207) {
(0208) if( rdDAdr&0xF000 == 0xF000 ) //判断是否为 10位 器件地址
00CB FF40 SBRS R20,0
00CC C00B RJMP 0x00D8
(0209) if( I2C_SendWrDAdr( (uint8)rdDAdr>>8 )==I2C_ERR ) //设置 (高位)器件读地址
00CD 2F04 MOV R16,R20
00CE 2711 CLR R17
00CF 2F01 MOV R16,R17
00D0 2711 CLR R17
00D1 FD07 SBRC R16,7
00D2 9510 COM R17
00D3 DFBE RCALL _I2C_SendWrDAdr
00D4 2300 TST R16
00D5 F411 BNE 0x00D8
(0210) return I2C_ERR;
00D6 2700 CLR R16
00D7 C007 RJMP 0x00DF
(0211) if( I2C_SendWrDAdr( (uint8)rdDAdr )==I2C_ERR ) //设置 (低位)器件读地址
00D8 2F04 MOV R16,R20
00D9 DFB8 RCALL _I2C_SendWrDAdr
00DA 2300 TST R16
00DB F411 BNE 0x00DE
(0212) return I2C_ERR;
00DC 2700 CLR R16
00DD C001 RJMP 0x00DF
(0213) return I2C_CRR;
00DE E001 LDI R16,1
00DF 940E0256 CALL pop_gset1
00E1 9508 RET
(0214) }
(0215) /*--------------------------------------------------------------------
(0216) 函数名称:I2C发送数据
(0217) 函数功能:
(0218) 注意事项:
(0219) 提示说明:
(0220) 输 入:
(0221) 返 回:
(0222) --------------------------------------------------------------------*/
(0223) bool I2C_SendDat(uint8 configDat)
(0224) {
(0225) I2CSendByte(configDat);
_I2C_SendDat:
configDat --> R16
00E2 B903 OUT 0x03,R16
00E3 E884 LDI R24,0x84
00E4 BF86 OUT 0x36,R24
(0226) I2CWaitAck();
00E5 B626 IN R2,0x36
00E6 FE27 SBRS R2,7
00E7 CFFD RJMP 0x00E5
(0227) if( I2CChkAck()!=I2C_MT_DATA_ACK )
00E8 B181 IN R24,0x01
00E9 7F88 ANDI R24,0xF8
00EA 3288 CPI R24,0x28
00EB F011 BEQ 0x00EE
(0228) return I2C_ERR;
00EC 2700 CLR R16
00ED C001 RJMP 0x00EF
(0229) return I2C_CRR;
00EE E001 LDI R16,1
00EF 9508 RET
(0230) }
(0231) /*--------------------------------------------------------------------
(0232) 函数名称:I2C接收数据且不产生应答
(0233) 函数功能:
(0234) 注意事项:
(0235) 提示说明:
(0236) 输 入:
(0237) 返 回:
(0238) --------------------------------------------------------------------*/
(0239) bool I2C_RcvNAckDat(uint8 *pRdDat)
(0240) {
(0241) I2CRcvNckByte();
_I2C_RcvNAckDat:
pRdDat --> R16
00F0 E884 LDI R24,0x84
00F1 BF86 OUT 0x36,R24
(0242) I2CWaitAck();
00F2 B626 IN R2,0x36
00F3 FE27 SBRS R2,7
00F4 CFFD RJMP 0x00F2
(0243) if( I2CChkAck()!=I2C_MR_DATA_NACK )
00F5 B181 IN R24,0x01
00F6 7F88 ANDI R24,0xF8
00F7 3588 CPI R24,0x58
00F8 F011 BEQ 0x00FB
(0244) return I2C_ERR;
00F9 2700 CLR R16
00FA C004 RJMP 0x00FF
(0245) *pRdDat=TWDR;
00FB B023 IN R2,0x03
00FC 01F8 MOVW R30,R16
00FD 8220 STD Z+0,R2
(0246) return I2C_CRR;
00FE E001 LDI R16,1
00FF 9508 RET
(0247) }
(0248) /*--------------------------------------------------------------------
(0249) 函数名称:I2C接收数据且产生应答
(0250) 函数功能:
(0251) 注意事项:
(0252) 提示说明:
(0253) 输 入:
(0254) 返 回:
(0255) --------------------------------------------------------------------*/
(0256) bool I2C_RcvAckDat(uint8 *pRdDat)
(0257) {
(0258) I2CRcvAckByte();
_I2C_RcvAckDat:
pRdDat --> R16
0100 EC84 LDI R24,0xC4
0101 BF86 OUT 0x36,R24
(0259) I2CWaitAck();
0102 B626 IN R2,0x36
0103 FE27 SBRS R2,7
0104 CFFD RJMP 0x0102
(0260) if( I2CChkAck()!=I2C_MR_DATA_ACK )
0105 B181 IN R24,0x01
0106 7F88 ANDI R24,0xF8
0107 3580 CPI R24,0x50
0108 F011 BEQ 0x010B
(0261) return I2C_ERR;
0109 2700 CLR R16
010A C004 RJMP 0x010F
(0262) *pRdDat=TWDR;
010B B023 IN R2,0x03
010C 01F8 MOVW R30,R16
010D 8220 STD Z+0,R2
(0263) return I2C_CRR;
010E E001 LDI R16,1
010F 9508 RET
_I2C_Write:
dat --> Y+4
wordAdr --> R20
wrDAdr --> R22
0110 940E0251 CALL push_gset2
0112 2F42 MOV R20,R18
0113 01B8 MOVW R22,R16
(0264) }
(0265) /*--------------------------------------------------------------------
(0266) 函数名称:I2C写器件,写一个数据
(0267) 函数功能:
(0268) 注意事项:
(0269) 提示说明:
(0270) 输 入:wrDAdr: write device-address 写器件地址
(0271) wordAdr: word address 字地址
(0272) dat: data 数据
(0273) 返 回:
(0274) --------------------------------------------------------------------*/
(0275) bool I2C_Write(uint16 wrDAdr,uint8 wordAdr,uint8 dat)
(0276) {
(0277) if( I2C_Start()==I2C_ERR )
0114 DF63 RCALL _I2C_Start
0115 2300 TST R16
0116 F411 BNE 0x0119
(0278) return I2C_ERR;
0117 2700 CLR R16
0118 C015 RJMP 0x012E
(0279)
(0280) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
0119 018B MOVW R16,R22
011A DF85 RCALL _I2C_SendWrDAdr_
011B 2300 TST R16
011C F411 BNE 0x011F
(0281) return I2C_ERR;
011D 2700 CLR R16
011E C00F RJMP 0x012E
(0282)
(0283) if( I2C_SendDat(wordAdr)==I2C_ERR )
011F 2F04 MOV R16,R20
0120 DFC1 RCALL _I2C_SendDat
0121 2300 TST R16
0122 F411 BNE 0x0125
(0284) return I2C_ERR;
0123 2700 CLR R16
0124 C009 RJMP 0x012E
(0285)
(0286) if( I2C_SendDat(dat)==I2C_ERR )
0125 810C LDD R16,Y+4
0126 DFBB RCALL _I2C_SendDat
0127 2300 TST R16
0128 F411 BNE 0x012B
(0287) return I2C_ERR;
0129 2700 CLR R16
012A C003 RJMP 0x012E
(0288)
(0289) I2C_Stop();
012B E984 LDI R24,0x94
012C BF86 OUT 0x36,R24
(0290)
(0291) return I2C_CRR;
012D E001 LDI R16,1
012E 940E0245 CALL pop_gset2
0130 9508 RET
_I2C_Write_:
i --> R20
num --> R22
pWrDat --> R10
wordAdr --> R20
wrDAdr --> R12
0131 940E024D CALL push_gset4
0133 2F42 MOV R20,R18
0134 0168 MOVW R12,R16
0135 84A8 LDD R10,Y+8
0136 84B9 LDD R11,Y+9
0137 856A LDD R22,Y+10
(0292) }
(0293) /*--------------------------------------------------------------------
(0294) 函数名称:I2C写器件,写N个数据
(0295) 函数功能:
(0296) 注意事项:
(0297) 提示说明:
(0298) 输 入:wrDAdr: write device-address 写器件地址
(0299) wordAdr: word address 字地址
(0300) *pWrDat: p->write data 写入数据指针
(0301) num: number 写入数据个数
(0302) 返 回:
(0303) --------------------------------------------------------------------*/
(0304) bool I2C_Write_(uint16 wrDAdr,uint8 wordAdr,uint8 *pWrDat,uint8 num)
(0305) {
(0306) uchar i;
(0307)
(0308) if( I2C_Start()==I2C_ERR )
0138 DF3F RCALL _I2C_Start
0139 2300 TST R16
013A F411 BNE 0x013D
(0309) return I2C_ERR;
013B 2700 CLR R16
013C C01E RJMP 0x015B
(0310)
(0311) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
013D 0186 MOVW R16,R12
013E DF61 RCALL _I2C_SendWrDAdr_
013F 2300 TST R16
0140 F411 BNE 0x0143
(0312) return I2C_ERR;
0141 2700 CLR R16
0142 C018 RJMP 0x015B
(0313)
(0314) if( I2C_SendDat(wordAdr)==I2C_ERR )
0143 2F04 MOV R16,R20
0144 DF9D RCALL _I2C_SendDat
0145 2300 TST R16
0146 F411 BNE 0x0149
(0315) return I2C_ERR;
0147 2700 CLR R16
0148 C012 RJMP 0x015B
(0316) for( i = 0; i < num; i++)
0149 2744 CLR R20
014A C00B RJMP 0x0156
(0317) {
(0318) if( I2C_SendDat(pWrDat[i])==I2C_ERR )
014B 2FE4 MOV R30,R20
014C 27FF CLR R31
014D 0DEA ADD R30,R10
014E 1DFB ADC R31,R11
014F 8100 LDD R16,Z+0
0150 DF91 RCALL _I2C_SendDat
0151 2300 TST R16
0152 F411 BNE 0x0155
(0319) return I2C_ERR;
0153 2700 CLR R16
0154 C006 RJMP 0x015B
0155 9543 INC R20
0156 1746 CP R20,R22
0157 F398 BCS 0x014B
(0320) }
(0321)
(0322) I2C_Stop();
0158 E984 LDI R24,0x94
0159 BF86 OUT 0x36,R24
(0323)
(0324) return I2C_CRR;
015A E001 LDI R16,1
015B 940E0248 CALL pop_gset4
015D 9508 RET
_I2C_Read:
pRdDat --> Y+6
rdDAdr --> Y+4
wordAdr --> R20
wrDAdr --> R22
015E 940E0251 CALL push_gset2
0160 2F42 MOV R20,R18
0161 01B8 MOVW R22,R16
(0325) }
(0326) /*--------------------------------------------------------------------
(0327) 函数名称:I2C读器件,读一个数据
(0328) 函数功能:
(0329) 注意事项:
(0330) 提示说明:
(0331) 输 入:wrDAdr: write device-address 写器件地址
(0332) wordAdr: word address 字地址
(0333) rdDAdr: read device-address 读器件地址
(0334) *pRdDat: p->read data 读取数据指针
(0335) 返 回:
(0336) --------------------------------------------------------------------*/
(0337) bool I2C_Read(uint16 wrDAdr,uint8 wordAdr,
(0338) uint8 rdDAdr,uint8 *pRdDat)
(0339) {
(0340) if( I2C_Start()==I2C_ERR )
0162 DF15 RCALL _I2C_Start
0163 2300 TST R16
0164 F411 BNE 0x0167
(0341) return I2C_ERR;
0165 2700 CLR R16
0166 C021 RJMP 0x0188
(0342)
(0343) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
0167 018B MOVW R16,R22
0168 DF37 RCALL _I2C_SendWrDAdr_
0169 2300 TST R16
016A F411 BNE 0x016D
(0344) return I2C_ERR;
016B 2700 CLR R16
016C C01B RJMP 0x0188
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -