📄 ps2simplesoft.lst
字号:
(0157) bool I2C_SendWrDAdr(uint8 wrDAdr)
(0158) {
(0159) I2CSendByte(wrDAdr); //设置 器件写地址
_I2C_SendWrDAdr:
wrDAdr --> R16
013C B903 OUT 0x03,R16
013D E884 LDI R24,0x84
013E BF86 OUT 0x36,R24
(0160) I2CWaitAck();
013F B626 IN R2,0x36
0140 FE27 SBRS R2,7
0141 CFFD RJMP 0x013F
(0161) if( I2CChkAck()!=I2C_MT_SLA_ACK )
0142 B181 IN R24,0x01
0143 7F88 ANDI R24,0xF8
0144 3188 CPI R24,0x18
0145 F011 BEQ 0x0148
(0162) return I2C_ERR;
0146 2700 CLR R16
0147 C001 RJMP 0x0149
(0163) return I2C_CRR;
0148 E001 LDI R16,1
0149 9508 RET
_I2C_SendWrDAdr_:
wrDAdr --> R20
014A 940E03E6 CALL push_gset1
014C 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位 器件地址
014D FF40 SBRS R20,0
014E C00B RJMP 0x015A
(0176) if( I2C_SendWrDAdr( (uint8)wrDAdr>>8 )==I2C_ERR ) //设置 (高位)器件写地址
014F 2F04 MOV R16,R20
0150 2711 CLR R17
0151 2F01 MOV R16,R17
0152 2711 CLR R17
0153 FD07 SBRC R16,7
0154 9510 COM R17
0155 DFE6 RCALL _I2C_SendWrDAdr
0156 2300 TST R16
0157 F411 BNE 0x015A
(0177) return I2C_ERR;
0158 2700 CLR R16
0159 C007 RJMP 0x0161
(0178) if( I2C_SendWrDAdr( (uint8)wrDAdr )==I2C_ERR ) //设置 (低位)器件写地址
015A 2F04 MOV R16,R20
015B DFE0 RCALL _I2C_SendWrDAdr
015C 2300 TST R16
015D F411 BNE 0x0160
(0179) return I2C_ERR;
015E 2700 CLR R16
015F C001 RJMP 0x0161
(0180) return I2C_CRR;
0160 E001 LDI R16,1
0161 940E03E9 CALL pop_gset1
0163 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
0164 B903 OUT 0x03,R16
0165 E884 LDI R24,0x84
0166 BF86 OUT 0x36,R24
(0193) I2CWaitAck();
0167 B626 IN R2,0x36
0168 FE27 SBRS R2,7
0169 CFFD RJMP 0x0167
(0194) if( I2CChkAck()!=I2C_MR_SLA_ACK )
016A B181 IN R24,0x01
016B 7F88 ANDI R24,0xF8
016C 3480 CPI R24,0x40
016D F011 BEQ 0x0170
(0195) return I2C_ERR;
016E 2700 CLR R16
016F C001 RJMP 0x0171
(0196) return I2C_CRR;
0170 E001 LDI R16,1
0171 9508 RET
_I2C_SendRdDAdr_:
rdDAdr --> R20
0172 940E03E6 CALL push_gset1
0174 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位 器件地址
0175 FF40 SBRS R20,0
0176 C00B RJMP 0x0182
(0209) if( I2C_SendWrDAdr( (uint8)rdDAdr>>8 )==I2C_ERR ) //设置 (高位)器件读地址
0177 2F04 MOV R16,R20
0178 2711 CLR R17
0179 2F01 MOV R16,R17
017A 2711 CLR R17
017B FD07 SBRC R16,7
017C 9510 COM R17
017D DFBE RCALL _I2C_SendWrDAdr
017E 2300 TST R16
017F F411 BNE 0x0182
(0210) return I2C_ERR;
0180 2700 CLR R16
0181 C007 RJMP 0x0189
(0211) if( I2C_SendWrDAdr( (uint8)rdDAdr )==I2C_ERR ) //设置 (低位)器件读地址
0182 2F04 MOV R16,R20
0183 DFB8 RCALL _I2C_SendWrDAdr
0184 2300 TST R16
0185 F411 BNE 0x0188
(0212) return I2C_ERR;
0186 2700 CLR R16
0187 C001 RJMP 0x0189
(0213) return I2C_CRR;
0188 E001 LDI R16,1
0189 940E03E9 CALL pop_gset1
018B 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
018C B903 OUT 0x03,R16
018D E884 LDI R24,0x84
018E BF86 OUT 0x36,R24
(0226) I2CWaitAck();
018F B626 IN R2,0x36
0190 FE27 SBRS R2,7
0191 CFFD RJMP 0x018F
(0227) if( I2CChkAck()!=I2C_MT_DATA_ACK )
0192 B181 IN R24,0x01
0193 7F88 ANDI R24,0xF8
0194 3288 CPI R24,0x28
0195 F011 BEQ 0x0198
(0228) return I2C_ERR;
0196 2700 CLR R16
0197 C001 RJMP 0x0199
(0229) return I2C_CRR;
0198 E001 LDI R16,1
0199 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
019A E884 LDI R24,0x84
019B BF86 OUT 0x36,R24
(0242) I2CWaitAck();
019C B626 IN R2,0x36
019D FE27 SBRS R2,7
019E CFFD RJMP 0x019C
(0243) if( I2CChkAck()!=I2C_MR_DATA_NACK )
019F B181 IN R24,0x01
01A0 7F88 ANDI R24,0xF8
01A1 3588 CPI R24,0x58
01A2 F011 BEQ 0x01A5
(0244) return I2C_ERR;
01A3 2700 CLR R16
01A4 C004 RJMP 0x01A9
(0245) *pRdDat=TWDR;
01A5 B023 IN R2,0x03
01A6 01F8 MOVW R30,R16
01A7 8220 STD Z+0,R2
(0246) return I2C_CRR;
01A8 E001 LDI R16,1
01A9 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
01AA EC84 LDI R24,0xC4
01AB BF86 OUT 0x36,R24
(0259) I2CWaitAck();
01AC B626 IN R2,0x36
01AD FE27 SBRS R2,7
01AE CFFD RJMP 0x01AC
(0260) if( I2CChkAck()!=I2C_MR_DATA_ACK )
01AF B181 IN R24,0x01
01B0 7F88 ANDI R24,0xF8
01B1 3580 CPI R24,0x50
01B2 F011 BEQ 0x01B5
(0261) return I2C_ERR;
01B3 2700 CLR R16
01B4 C004 RJMP 0x01B9
(0262) *pRdDat=TWDR;
01B5 B023 IN R2,0x03
01B6 01F8 MOVW R30,R16
01B7 8220 STD Z+0,R2
(0263) return I2C_CRR;
01B8 E001 LDI R16,1
01B9 9508 RET
_I2C_Write:
dat --> Y+4
wordAdr --> R20
wrDAdr --> R22
01BA 940E03FD CALL push_gset2
01BC 2F42 MOV R20,R18
01BD 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 )
01BE DF63 RCALL _I2C_Start
01BF 2300 TST R16
01C0 F411 BNE 0x01C3
(0278) return I2C_ERR;
01C1 2700 CLR R16
01C2 C015 RJMP 0x01D8
(0279)
(0280) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
01C3 018B MOVW R16,R22
01C4 DF85 RCALL _I2C_SendWrDAdr_
01C5 2300 TST R16
01C6 F411 BNE 0x01C9
(0281) return I2C_ERR;
01C7 2700 CLR R16
01C8 C00F RJMP 0x01D8
(0282)
(0283) if( I2C_SendDat(wordAdr)==I2C_ERR )
01C9 2F04 MOV R16,R20
01CA DFC1 RCALL _I2C_SendDat
01CB 2300 TST R16
01CC F411 BNE 0x01CF
(0284) return I2C_ERR;
01CD 2700 CLR R16
01CE C009 RJMP 0x01D8
(0285)
(0286) if( I2C_SendDat(dat)==I2C_ERR )
01CF 810C LDD R16,Y+4
01D0 DFBB RCALL _I2C_SendDat
01D1 2300 TST R16
01D2 F411 BNE 0x01D5
(0287) return I2C_ERR;
01D3 2700 CLR R16
01D4 C003 RJMP 0x01D8
(0288)
(0289) I2C_Stop();
01D5 E984 LDI R24,0x94
01D6 BF86 OUT 0x36,R24
(0290)
(0291) return I2C_CRR;
01D7 E001 LDI R16,1
01D8 940E03E0 CALL pop_gset2
01DA 9508 RET
_I2C_Read:
pRdDat --> Y+6
rdDAdr --> Y+4
wordAdr --> R20
wrDAdr --> R22
01DB 940E03FD CALL push_gset2
01DD 2F42 MOV R20,R18
01DE 01B8 MOVW R22,R16
(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,
(0305) // uint8 *pWrDat,uint8 num)
(0306) //{
(0307) //
(0308) //}
(0309) /*--------------------------------------------------------------------
(0310) 函数名称:I2C读器件,读一个数据
(0311) 函数功能:
(0312) 注意事项:
(0313) 提示说明:
(0314) 输 入:wrDAdr: write device-address 写器件地址
(0315) wordAdr: word address 字地址
(0316) rdDAdr: read device-address 读器件地址
(0317) *pRdDat: p->read data 读取数据指针
(0318) 返 回:
(0319) --------------------------------------------------------------------*/
(0320) bool I2C_Read(uint16 wrDAdr,uint8 wordAdr,
(0321) uint8 rdDAdr,uint8 *pRdDat)
(0322) {
(0323) if( I2C_Start()==I2C_ERR )
01DF DF42 RCALL _I2C_Start
01E0 2300 TST R16
01E1 F411 BNE 0x01E4
(0324) return I2C_ERR;
01E2 2700 CLR R16
01E3 C021 RJMP 0x0205
(0325)
(0326) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
01E4 018B MOVW R16,R22
01E5 DF64 RCALL _I2C_SendWrDAdr_
01E6 2300 TST R16
01E7 F411 BNE 0x01EA
(0327) return I2C_ERR;
01E8 2700 CLR R16
01E9 C01B RJMP 0x0205
(0328)
(0329) if( I2C_SendDat(wordAdr)==I2C_ERR )
01EA 2F04 MOV R16,R20
01EB DFA0 RCALL _I2C_SendDat
01EC 2300 TST R16
01ED F411 BNE 0x01F0
(0330) return I2C_ERR;
01EE 2700 CLR R16
01EF C015 RJMP 0x0205
(0331)
(0332) if( I2C_Restart()==I2C_ERR )
01F0 DF3E RCALL _I2C_Restart
01F1 2300 TST R16
01F2 F411 BNE 0x01F5
(0333) return I2C_ERR;
01F3 2700 CLR R16
01F4 C010 RJMP 0x0205
(0334)
(0335) if( I2C_SendRdDAdr(rdDAdr)==I2C_ERR )
01F5 810C LDD R16,Y+4
01F6 DF6D RCALL _I2C_SendRdDAdr
01F7 2300 TST R16
01F8 F411 BNE 0x01FB
(0336) return I2C_ERR;
01F9 2700 CLR R16
01FA C00A RJMP 0x0205
(0337)
(0338) if( I2C_RcvNAckDat(pRdDat)==I2C_ERR )
01FB 810E LDD R16,Y+6
01FC 811F LDD R17,Y+7
01FD DF9C RCALL _I2C_RcvNAckDat
01FE 2300 TST R16
01FF F411 BNE 0x0202
(0339) return I2C_ERR;
0200 2700 CLR R16
0201 C003 RJMP 0x0205
(0340)
(0341) I2C_Stop();
0202 E984 LDI R24,0x94
0203 BF86 OUT 0x36,R24
(0342)
(0343) return I2C_CRR;
0204 E001 LDI R16,1
0205 940E03E0 CALL pop_gset2
0207 9508 RET
_I2C_Read_:
i --> R20
num --> R22
pRdDat --> R10
rdDAdr --> Y+8
wordAdr --> R20
wrDAdr --> R12
0208 940E0405 CALL push_gset4
020A 2F42 MOV R20,R18
020B 0168 MOVW R12,R16
020C 84AA LDD R10,Y+10
020D 84BB LDD R11,Y+11
020E 856C LDD R22,Y+12
(0344) }
(0345) /*--------------------------------------------------------------------
(0346) 函数名称:I2C读器件,读N个数据
(0347) 函数功能:
(0348) 注意事项:
(0349) 提示说明:
(0350) 输 入:wrDAdr: write device-address 写器件地址
(0351) wordAdr: word address 字地址
(0352) rdDAdr: read device-address 读器件地址
(0353) *pRdDat: p->read data 读取数据指针
(0354) num: number 读取数据个数
(0355) 返 回:
(0356) --------------------------------------------------------------------*/
(0357) bool I2C_Read_(uint16 wrDAdr,uint8 wordAdr,
(0358) uint8 rdDAdr,uint8 *pRdDat,uint8 num)
(0359) {
(0360) uint8 i;
(0361)
(0362) if( I2C_Start()==I2C_ERR )
020F DF12 RCALL _I2C_Start
0210 2300 TST R16
0211 F411 BNE 0x0214
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -