📄 buzzer.lst
字号:
(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 + -