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

📄 buzzer.lst

📁 AVR microcontrol ,the program is a buzze speaker
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0113) #define I2C_WaitAck()	I2CWaitAck()
(0114) 
(0115) /* I2C Config */
(0116) #define I2C_ERR			0
(0117) #define I2C_CRR			1
(0118) 
(0119) /*--------------------------------------------------------------------
(0120) 函数名称:I2C Start
(0121) 函数功能:
(0122) 注意事项:
(0123) 提示说明:
(0124) 输    入:
(0125) 返    回:
(0126) --------------------------------------------------------------------*/
(0127) bool I2C_Start()					
(0128) {
(0129) 	I2CStart();						
_I2C_Start:
    00AA EA84      LDI	R24,0xA4
    00AB BF86      OUT	0x36,R24
(0130) 	I2CWaitAck();
    00AC B626      IN	R2,0x36
    00AD FE27      SBRS	R2,7
    00AE CFFD      RJMP	0x00AC
(0131) 	if( I2CChkAck()!=I2C_START ) 
    00AF B181      IN	R24,0x01
    00B0 7F88      ANDI	R24,0xF8
    00B1 3088      CPI	R24,0x8
    00B2 F011      BEQ	0x00B5
(0132) 		return I2C_ERR;
    00B3 2700      CLR	R16
    00B4 C001      RJMP	0x00B6
(0133) 	return I2C_CRR;
    00B5 E001      LDI	R16,1
    00B6 9508      RET
(0134) }
(0135) /*--------------------------------------------------------------------
(0136) 函数名称:I2C ReStart
(0137) 函数功能:
(0138) 注意事项:
(0139) 提示说明:
(0140) 输    入:
(0141) 返    回:
(0142) --------------------------------------------------------------------*/
(0143) bool I2C_Restart()					
(0144) {
(0145) 	I2CStart();						
_I2C_Restart:
    00B7 EA84      LDI	R24,0xA4
    00B8 BF86      OUT	0x36,R24
(0146) 	I2CWaitAck();
    00B9 B626      IN	R2,0x36
    00BA FE27      SBRS	R2,7
    00BB CFFD      RJMP	0x00B9
(0147) 	if( I2CChkAck()!=I2C_RESTART ) 
    00BC B181      IN	R24,0x01
    00BD 7F88      ANDI	R24,0xF8
    00BE 3180      CPI	R24,0x10
    00BF F011      BEQ	0x00C2
(0148) 		return I2C_ERR;
    00C0 2700      CLR	R16
    00C1 C001      RJMP	0x00C3
(0149) 	return I2C_CRR;
    00C2 E001      LDI	R16,1
    00C3 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
    00C4 B903      OUT	0x03,R16
    00C5 E884      LDI	R24,0x84
    00C6 BF86      OUT	0x36,R24
(0162) 	I2CWaitAck();
    00C7 B626      IN	R2,0x36
    00C8 FE27      SBRS	R2,7
    00C9 CFFD      RJMP	0x00C7
(0163) 	if( I2CChkAck()!=I2C_MT_SLA_ACK )  
    00CA B181      IN	R24,0x01
    00CB 7F88      ANDI	R24,0xF8
    00CC 3188      CPI	R24,0x18
    00CD F011      BEQ	0x00D0
(0164) 		return I2C_ERR;
    00CE 2700      CLR	R16
    00CF C001      RJMP	0x00D1
(0165) 	return I2C_CRR;		
    00D0 E001      LDI	R16,1
    00D1 9508      RET
_I2C_SendWrDAdr_:
  wrDAdr               --> R20
    00D2 940E02BA  CALL	push_gset1
    00D4 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位 器件地址
    00D5 FF40      SBRS	R20,0
    00D6 C00B      RJMP	0x00E2
(0178) 		if( I2C_SendWrDAdr( (uint8)wrDAdr>>8 )==I2C_ERR )	//设置 (高位)器件写地址
    00D7 2F04      MOV	R16,R20
    00D8 2711      CLR	R17
    00D9 2F01      MOV	R16,R17
    00DA 2711      CLR	R17
    00DB FD07      SBRC	R16,7
    00DC 9510      COM	R17
    00DD DFE6      RCALL	_I2C_SendWrDAdr
    00DE 2300      TST	R16
    00DF F411      BNE	0x00E2
(0179) 			return I2C_ERR;
    00E0 2700      CLR	R16
    00E1 C007      RJMP	0x00E9
(0180) 	if( I2C_SendWrDAdr( (uint8)wrDAdr )==I2C_ERR )	//设置 (低位)器件写地址
    00E2 2F04      MOV	R16,R20
    00E3 DFE0      RCALL	_I2C_SendWrDAdr
    00E4 2300      TST	R16
    00E5 F411      BNE	0x00E8
(0181) 		return I2C_ERR;
    00E6 2700      CLR	R16
    00E7 C001      RJMP	0x00E9
(0182) 	return I2C_CRR;
    00E8 E001      LDI	R16,1
    00E9 940E02BD  CALL	pop_gset1
    00EB 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
    00EC B903      OUT	0x03,R16
    00ED E884      LDI	R24,0x84
    00EE BF86      OUT	0x36,R24
(0195) 	I2CWaitAck();
    00EF B626      IN	R2,0x36
    00F0 FE27      SBRS	R2,7
    00F1 CFFD      RJMP	0x00EF
(0196) 	if( I2CChkAck()!=I2C_MR_SLA_ACK )  
    00F2 B181      IN	R24,0x01
    00F3 7F88      ANDI	R24,0xF8
    00F4 3480      CPI	R24,0x40
    00F5 F011      BEQ	0x00F8
(0197) 		return I2C_ERR;
    00F6 2700      CLR	R16
    00F7 C001      RJMP	0x00F9
(0198) 	return I2C_CRR;	
    00F8 E001      LDI	R16,1
    00F9 9508      RET
_I2C_SendRdDAdr_:
  rdDAdr               --> R20
    00FA 940E02BA  CALL	push_gset1
    00FC 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位 器件地址
    00FD FF40      SBRS	R20,0
    00FE C00B      RJMP	0x010A
(0211) 		if( I2C_SendWrDAdr( (uint8)rdDAdr>>8 )==I2C_ERR )	//设置 (高位)器件读地址
    00FF 2F04      MOV	R16,R20
    0100 2711      CLR	R17
    0101 2F01      MOV	R16,R17
    0102 2711      CLR	R17
    0103 FD07      SBRC	R16,7
    0104 9510      COM	R17
    0105 DFBE      RCALL	_I2C_SendWrDAdr
    0106 2300      TST	R16
    0107 F411      BNE	0x010A
(0212) 			return I2C_ERR;
    0108 2700      CLR	R16
    0109 C007      RJMP	0x0111
(0213) 	if( I2C_SendWrDAdr( (uint8)rdDAdr )==I2C_ERR )	//设置 (低位)器件读地址
    010A 2F04      MOV	R16,R20
    010B DFB8      RCALL	_I2C_SendWrDAdr
    010C 2300      TST	R16
    010D F411      BNE	0x0110
(0214) 		return I2C_ERR;
    010E 2700      CLR	R16
    010F C001      RJMP	0x0111
(0215) 	return I2C_CRR;
    0110 E001      LDI	R16,1
    0111 940E02BD  CALL	pop_gset1
    0113 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
    0114 B903      OUT	0x03,R16
    0115 E884      LDI	R24,0x84
    0116 BF86      OUT	0x36,R24
(0228) 	I2CWaitAck();
    0117 B626      IN	R2,0x36
    0118 FE27      SBRS	R2,7
    0119 CFFD      RJMP	0x0117
(0229) 	if( I2CChkAck()!=I2C_MT_DATA_ACK ) 
    011A B181      IN	R24,0x01
    011B 7F88      ANDI	R24,0xF8
    011C 3288      CPI	R24,0x28
    011D F011      BEQ	0x0120
(0230) 		return I2C_ERR;
    011E 2700      CLR	R16
    011F C001      RJMP	0x0121
(0231) 	return I2C_CRR;	
    0120 E001      LDI	R16,1
    0121 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
    0122 E884      LDI	R24,0x84
    0123 BF86      OUT	0x36,R24
(0244) 	I2CWaitAck();
    0124 B626      IN	R2,0x36
    0125 FE27      SBRS	R2,7
    0126 CFFD      RJMP	0x0124
(0245) 	if( I2CChkAck()!=I2C_MR_DATA_NACK )
    0127 B181      IN	R24,0x01
    0128 7F88      ANDI	R24,0xF8
    0129 3588      CPI	R24,0x58
    012A F011      BEQ	0x012D
(0246) 		return I2C_ERR;
    012B 2700      CLR	R16
    012C C004      RJMP	0x0131
(0247) 	*pRdDat=TWDR;
    012D B023      IN	R2,0x03
    012E 01F8      MOVW	R30,R16
    012F 8220      STD	Z+0,R2
(0248) 	return I2C_CRR;
    0130 E001      LDI	R16,1
    0131 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
    0132 EC84      LDI	R24,0xC4
    0133 BF86      OUT	0x36,R24
(0261) 	I2CWaitAck();
    0134 B626      IN	R2,0x36
    0135 FE27      SBRS	R2,7
    0136 CFFD      RJMP	0x0134
(0262) 	if( I2CChkAck()!=I2C_MR_DATA_ACK )
    0137 B181      IN	R24,0x01
    0138 7F88      ANDI	R24,0xF8
    0139 3580      CPI	R24,0x50
    013A F011      BEQ	0x013D
(0263) 		return I2C_ERR;
    013B 2700      CLR	R16
    013C C004      RJMP	0x0141
(0264) 	*pRdDat=TWDR;
    013D B023      IN	R2,0x03
    013E 01F8      MOVW	R30,R16
    013F 8220      STD	Z+0,R2
(0265) 	return I2C_CRR;
    0140 E001      LDI	R16,1
    0141 9508      RET
_I2C_Write:
  dat                  --> Y+4
  wordAdr              --> R20
  wrDAdr               --> R22
    0142 940E02B8  CALL	push_gset2
    0144 2F42      MOV	R20,R18
    0145 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 )
    0146 DF63      RCALL	_I2C_Start
    0147 2300      TST	R16
    0148 F411      BNE	0x014B
(0280) 		return I2C_ERR;
    0149 2700      CLR	R16
    014A C015      RJMP	0x0160
(0281) 
(0282) 	if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
    014B 018B      MOVW	R16,R22
    014C DF85      RCALL	_I2C_SendWrDAdr_
    014D 2300      TST	R16
    014E F411      BNE	0x0151
(0283) 		return I2C_ERR;
    014F 2700      CLR	R16
    0150 C00F      RJMP	0x0160
(0284) 
(0285) 	if( I2C_SendDat(wordAdr)==I2C_ERR )
    0151 2F04      MOV	R16,R20
    0152 DFC1      RCALL	_I2C_SendDat
    0153 2300      TST	R16
    0154 F411      BNE	0x0157
(0286) 		return I2C_ERR;
    0155 2700      CLR	R16
    0156 C009      RJMP	0x0160
(0287) 
(0288) 	if( I2C_SendDat(dat)==I2C_ERR )
    0157 810C      LDD	R16,Y+4
    0158 DFBB      RCALL	_I2C_SendDat
    0159 2300      TST	R16

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -