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

📄 ps2simplesoft.lst

📁 ATmega16应用例子
💻 LST
📖 第 1 页 / 共 4 页
字号:
(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 + -