📄 rfidsys.lst
字号:
014A E001 LDI R16,1
014B 9508 RET
(0134) }
(0135) /*--------------------------------------------------------------------
(0136) 函数名称:I2C ReStart
(0137) 函数功能:
(0138) 注意事项:
(0139) 提示说明:
(0140) 输 入:
(0141) 返 回:
(0142) --------------------------------------------------------------------*/
(0143) bool I2C_Restart()
(0144) {
(0145) I2CStart();
_I2C_Restart:
014C EA84 LDI R24,0xA4
014D BF86 OUT 0x36,R24
(0146) I2CWaitAck();
014E B626 IN R2,0x36
014F FE27 SBRS R2,7
0150 CFFD RJMP 0x014E
(0147) if( I2CChkAck()!=I2C_RESTART )
0151 B181 IN R24,0x01
0152 7F88 ANDI R24,0xF8
0153 3180 CPI R24,0x10
0154 F011 BEQ 0x0157
(0148) return I2C_ERR;
0155 2700 CLR R16
0156 C001 RJMP 0x0158
(0149) return I2C_CRR;
0157 E001 LDI R16,1
0158 9508 RET
(0150) }
(0151) /*--------------------------------------------------------------------
(0152) 函数名称:发送 7位 器件写地址: XXXX XXX0
(0153) 函数功能:
(0154) 注意事项:
(0155) 提示说明:
(0156) 输 入:
(0157) 返 回:
(0158) --------------------------------------------------------------------*/
(0159) bool I2C_SendWrDAdr(uint8 wrDAdr)
(0160) {
(0161) I2CSendByte(wrDAdr); //设置 器件写地址
_I2C_SendWrDAdr:
wrDAdr --> R16
0159 B903 OUT 0x03,R16
015A E884 LDI R24,0x84
015B BF86 OUT 0x36,R24
(0162) I2CWaitAck();
015C B626 IN R2,0x36
015D FE27 SBRS R2,7
015E CFFD RJMP 0x015C
(0163) if( I2CChkAck()!=I2C_MT_SLA_ACK )
015F B181 IN R24,0x01
0160 7F88 ANDI R24,0xF8
0161 3188 CPI R24,0x18
0162 F011 BEQ 0x0165
(0164) return I2C_ERR;
0163 2700 CLR R16
0164 C001 RJMP 0x0166
(0165) return I2C_CRR;
0165 E001 LDI R16,1
0166 9508 RET
_I2C_SendWrDAdr_:
wrDAdr --> R20
0167 940E065E CALL push_gset1
0169 01A8 MOVW R20,R16
(0166) }
(0167) /*--------------------------------------------------------------------
(0168) 函数名称:发送 10位 器件写地址: 1111 0XX0, XXXX XXXX
(0169) 函数功能:
(0170) 注意事项:
(0171) 提示说明:兼容 发送 7位 器件写地址: XXXX XXX0
(0172) 输 入:
(0173) 返 回:
(0174) --------------------------------------------------------------------*/
(0175) bool I2C_SendWrDAdr_(uint16 wrDAdr)
(0176) {
(0177) if( wrDAdr&0xF000 == 0xF000 ) //判断是否为 10位 器件地址
016A FF40 SBRS R20,0
016B C00B RJMP 0x0177
(0178) if( I2C_SendWrDAdr( (uint8)wrDAdr>>8 )==I2C_ERR ) //设置 (高位)器件写地址
016C 2F04 MOV R16,R20
016D 2711 CLR R17
016E 2F01 MOV R16,R17
016F 2711 CLR R17
0170 FD07 SBRC R16,7
0171 9510 COM R17
0172 DFE6 RCALL _I2C_SendWrDAdr
0173 2300 TST R16
0174 F411 BNE 0x0177
(0179) return I2C_ERR;
0175 2700 CLR R16
0176 C007 RJMP 0x017E
(0180) if( I2C_SendWrDAdr( (uint8)wrDAdr )==I2C_ERR ) //设置 (低位)器件写地址
0177 2F04 MOV R16,R20
0178 DFE0 RCALL _I2C_SendWrDAdr
0179 2300 TST R16
017A F411 BNE 0x017D
(0181) return I2C_ERR;
017B 2700 CLR R16
017C C001 RJMP 0x017E
(0182) return I2C_CRR;
017D E001 LDI R16,1
017E 940E0661 CALL pop_gset1
0180 9508 RET
(0183) }
(0184) /*--------------------------------------------------------------------
(0185) 函数名称:发送 7位 器件读地址: XXXX XXX1
(0186) 函数功能:
(0187) 注意事项:
(0188) 提示说明:
(0189) 输 入:
(0190) 返 回:
(0191) --------------------------------------------------------------------*/
(0192) bool I2C_SendRdDAdr(uint8 rdDAdr)
(0193) {
(0194) I2CSendByte(rdDAdr); //设置 器件读地址
_I2C_SendRdDAdr:
rdDAdr --> R16
0181 B903 OUT 0x03,R16
0182 E884 LDI R24,0x84
0183 BF86 OUT 0x36,R24
(0195) I2CWaitAck();
0184 B626 IN R2,0x36
0185 FE27 SBRS R2,7
0186 CFFD RJMP 0x0184
(0196) if( I2CChkAck()!=I2C_MR_SLA_ACK )
0187 B181 IN R24,0x01
0188 7F88 ANDI R24,0xF8
0189 3480 CPI R24,0x40
018A F011 BEQ 0x018D
(0197) return I2C_ERR;
018B 2700 CLR R16
018C C001 RJMP 0x018E
(0198) return I2C_CRR;
018D E001 LDI R16,1
018E 9508 RET
_I2C_SendRdDAdr_:
rdDAdr --> R20
018F 940E065E CALL push_gset1
0191 2F40 MOV R20,R16
(0199) }
(0200) /*--------------------------------------------------------------------
(0201) 函数名称:发送 10位 器件读地址: 1111 0XX0, XXXX XXXX
(0202) 函数功能:
(0203) 注意事项:
(0204) 提示说明:
(0205) 输 入:
(0206) 返 回:
(0207) --------------------------------------------------------------------*/
(0208) bool I2C_SendRdDAdr_(uint8 rdDAdr)
(0209) {
(0210) if( rdDAdr&0xF000 == 0xF000 ) //判断是否为 10位 器件地址
0192 FF40 SBRS R20,0
0193 C00B RJMP 0x019F
(0211) if( I2C_SendWrDAdr( (uint8)rdDAdr>>8 )==I2C_ERR ) //设置 (高位)器件读地址
0194 2F04 MOV R16,R20
0195 2711 CLR R17
0196 2F01 MOV R16,R17
0197 2711 CLR R17
0198 FD07 SBRC R16,7
0199 9510 COM R17
019A DFBE RCALL _I2C_SendWrDAdr
019B 2300 TST R16
019C F411 BNE 0x019F
(0212) return I2C_ERR;
019D 2700 CLR R16
019E C007 RJMP 0x01A6
(0213) if( I2C_SendWrDAdr( (uint8)rdDAdr )==I2C_ERR ) //设置 (低位)器件读地址
019F 2F04 MOV R16,R20
01A0 DFB8 RCALL _I2C_SendWrDAdr
01A1 2300 TST R16
01A2 F411 BNE 0x01A5
(0214) return I2C_ERR;
01A3 2700 CLR R16
01A4 C001 RJMP 0x01A6
(0215) return I2C_CRR;
01A5 E001 LDI R16,1
01A6 940E0661 CALL pop_gset1
01A8 9508 RET
(0216) }
(0217) /*--------------------------------------------------------------------
(0218) 函数名称:I2C发送数据
(0219) 函数功能:
(0220) 注意事项:
(0221) 提示说明:
(0222) 输 入:
(0223) 返 回:
(0224) --------------------------------------------------------------------*/
(0225) bool I2C_SendDat(uint8 configDat)
(0226) {
(0227) I2CSendByte(configDat);
_I2C_SendDat:
configDat --> R16
01A9 B903 OUT 0x03,R16
01AA E884 LDI R24,0x84
01AB BF86 OUT 0x36,R24
(0228) I2CWaitAck();
01AC B626 IN R2,0x36
01AD FE27 SBRS R2,7
01AE CFFD RJMP 0x01AC
(0229) if( I2CChkAck()!=I2C_MT_DATA_ACK )
01AF B181 IN R24,0x01
01B0 7F88 ANDI R24,0xF8
01B1 3288 CPI R24,0x28
01B2 F011 BEQ 0x01B5
(0230) return I2C_ERR;
01B3 2700 CLR R16
01B4 C001 RJMP 0x01B6
(0231) return I2C_CRR;
01B5 E001 LDI R16,1
01B6 9508 RET
(0232) }
(0233) /*--------------------------------------------------------------------
(0234) 函数名称:I2C接收数据且不产生应答
(0235) 函数功能:
(0236) 注意事项:
(0237) 提示说明:
(0238) 输 入:
(0239) 返 回:
(0240) --------------------------------------------------------------------*/
(0241) bool I2C_RcvNAckDat(uint8 *pRdDat)
(0242) {
(0243) I2CRcvNckByte();
_I2C_RcvNAckDat:
pRdDat --> R16
01B7 E884 LDI R24,0x84
01B8 BF86 OUT 0x36,R24
(0244) I2CWaitAck();
01B9 B626 IN R2,0x36
01BA FE27 SBRS R2,7
01BB CFFD RJMP 0x01B9
(0245) if( I2CChkAck()!=I2C_MR_DATA_NACK )
01BC B181 IN R24,0x01
01BD 7F88 ANDI R24,0xF8
01BE 3588 CPI R24,0x58
01BF F011 BEQ 0x01C2
(0246) return I2C_ERR;
01C0 2700 CLR R16
01C1 C004 RJMP 0x01C6
(0247) *pRdDat=TWDR;
01C2 B023 IN R2,0x03
01C3 01F8 MOVW R30,R16
01C4 8220 STD Z+0,R2
(0248) return I2C_CRR;
01C5 E001 LDI R16,1
01C6 9508 RET
(0249) }
(0250) /*--------------------------------------------------------------------
(0251) 函数名称:I2C接收数据且产生应答
(0252) 函数功能:
(0253) 注意事项:
(0254) 提示说明:
(0255) 输 入:
(0256) 返 回:
(0257) --------------------------------------------------------------------*/
(0258) bool I2C_RcvAckDat(uint8 *pRdDat)
(0259) {
(0260) I2CRcvAckByte();
_I2C_RcvAckDat:
pRdDat --> R16
01C7 EC84 LDI R24,0xC4
01C8 BF86 OUT 0x36,R24
(0261) I2CWaitAck();
01C9 B626 IN R2,0x36
01CA FE27 SBRS R2,7
01CB CFFD RJMP 0x01C9
(0262) if( I2CChkAck()!=I2C_MR_DATA_ACK )
01CC B181 IN R24,0x01
01CD 7F88 ANDI R24,0xF8
01CE 3580 CPI R24,0x50
01CF F011 BEQ 0x01D2
(0263) return I2C_ERR;
01D0 2700 CLR R16
01D1 C004 RJMP 0x01D6
(0264) *pRdDat=TWDR;
01D2 B023 IN R2,0x03
01D3 01F8 MOVW R30,R16
01D4 8220 STD Z+0,R2
(0265) return I2C_CRR;
01D5 E001 LDI R16,1
01D6 9508 RET
_I2C_Write:
dat --> Y+4
wordAdr --> R20
wrDAdr --> R22
01D7 940E065C CALL push_gset2
01D9 2F42 MOV R20,R18
01DA 01B8 MOVW R22,R16
(0266) }
(0267) /*--------------------------------------------------------------------
(0268) 函数名称:I2C写器件,写一个数据
(0269) 函数功能:
(0270) 注意事项:
(0271) 提示说明:
(0272) 输 入:wrDAdr: write device-address 写器件地址
(0273) wordAdr: word address 字地址
(0274) dat: data 数据
(0275) 返 回:
(0276) --------------------------------------------------------------------*/
(0277) bool I2C_Write(uint16 wrDAdr,uint8 wordAdr,uint8 dat)
(0278) {
(0279) if( I2C_Start()==I2C_ERR )
01DB DF63 RCALL _I2C_Start
01DC 2300 TST R16
01DD F411 BNE 0x01E0
(0280) return I2C_ERR;
01DE 2700 CLR R16
01DF C015 RJMP 0x01F5
(0281)
(0282) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
01E0 018B MOVW R16,R22
01E1 DF85 RCALL _I2C_SendWrDAdr_
01E2 2300 TST R16
01E3 F411 BNE 0x01E6
(0283) return I2C_ERR;
01E4 2700 CLR R16
01E5 C00F RJMP 0x01F5
(0284)
(0285) if( I2C_SendDat(wordAdr)==I2C_ERR )
01E6 2F04 MOV R16,R20
01E7 DFC1 RCALL _I2C_SendDat
01E8 2300 TST R16
01E9 F411 BNE 0x01EC
(0286) return I2C_ERR;
01EA 2700 CLR R16
01EB C009 RJMP 0x01F5
(0287)
(0288) if( I2C_SendDat(dat)==I2C_ERR )
01EC 810C LDD R16,Y+4
01ED DFBB RCALL _I2C_SendDat
01EE 2300 TST R16
01EF F411 BNE 0x01F2
(0289) return I2C_ERR;
01F0 2700 CLR R16
01F1 C003 RJMP 0x01F5
(0290)
(0291) I2C_Stop();
01F2 E984 LDI R24,0x94
01F3 BF86 OUT 0x36,R24
(0292)
(0293) return I2C_CRR;
01F4 E001 LDI R16,1
01F5 940E064A CALL pop_gset2
01F7 9508 RET
_I2C_Read:
pRdDat --> Y+6
rdDAdr --> Y+4
wordAdr --> R20
wrDAdr --> R22
01F8 940E065C CALL push_gset2
01FA 2F42 MOV R20,R18
01FB 01B8 MOVW R22,R16
(0294) }
(0295) /*--------------------------------------------------------------------
(0296) 函数名称:I2C写器件,写N个数据
(0297) 函数功能:
(0298) 注意事项:
(0299) 提示说明:
(0300) 输 入:wrDAdr: write device-address 写器件地址
(0301) wordAdr: word address 字地址
(0302) *pWrDat: p->write data 写入数据指针
(0303) num: number 写入数据个数
(0304) 返 回:
(0305) --------------------------------------------------------------------*/
(0306) //bool I2C_Write_(uint16 wrDAdr,uint8 wordAdr,
(0307) // uint8 *pWrDat,uint8 num)
(0308) //{
(0309) //
(0310) //}
(0311) /*--------------------------------------------------------------------
(0312) 函数名称:I2C读器件,读一个数据
(0313) 函数功能:
(0314) 注意事项:
(0315) 提示说明:
(0316) 输 入:wrDAdr: write device-address 写器件地址
(0317) wordAdr: word address 字地址
(0318) rdDAdr: read device-address 读器件地址
(0319) *pRdDat: p->read data 读取数据指针
(0320) 返 回:
(0321) --------------------------------------------------------------------*/
(0322) bool I2C_Read(uint16 wrDAdr,uint8 wordAdr,
(0323) uint8 rdDAdr,uint8 *pRdDat)
(0324) {
(0325) if( I2C_Start()==I2C_ERR )
01FC DF42 RCALL _I2C_Start
01FD 2300 TST R16
01FE F411 BNE 0x0201
(0326) return I2C_ERR;
01FF 2700 CLR R16
0200 C021 RJMP 0x0222
(0327)
(0328) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
0201 018B MOVW R16,R22
0202 DF64 RCALL _I2C_SendWrDAdr_
0203 2300 TST R16
0204 F411 BNE 0x0207
(0329) return I2C_ERR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -