⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfidsys.lst

📁 读写器与射频卡通信的设计采用RC522射频读写芯片与射频卡进行通信
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -