cycle.lst
来自「ATmega16应用例子」· LST 代码 · 共 2,013 行 · 第 1/5 页
LST
2,013 行
(0135) 函数功能:
(0136) 注意事项:
(0137) 提示说明:
(0138) 输 入:
(0139) 返 回:
(0140) --------------------------------------------------------------------*/
(0141) bool I2C_Restart()
(0142) {
(0143) I2CStart();
_I2C_Restart:
010E EA84 LDI R24,0xA4
010F BF86 OUT 0x36,R24
(0144) I2CWaitAck();
0110 B626 IN R2,0x36
0111 FE27 SBRS R2,7
0112 CFFD RJMP 0x0110
(0145) if( I2CChkAck()!=I2C_RESTART )
0113 B181 IN R24,0x01
0114 7F88 ANDI R24,0xF8
0115 3180 CPI R24,0x10
0116 F011 BEQ 0x0119
(0146) return I2C_ERR;
0117 2700 CLR R16
0118 C001 RJMP 0x011A
(0147) return I2C_CRR;
0119 E001 LDI R16,1
011A 9508 RET
(0148) }
(0149) /*--------------------------------------------------------------------
(0150) 函数名称:发送 7位 器件写地址: XXXX XXX0
(0151) 函数功能:
(0152) 注意事项:
(0153) 提示说明:
(0154) 输 入:
(0155) 返 回:
(0156) --------------------------------------------------------------------*/
(0157) bool I2C_SendWrDAdr(uint8 wrDAdr)
(0158) {
(0159) I2CSendByte(wrDAdr); //设置 器件写地址
_I2C_SendWrDAdr:
wrDAdr --> R16
011B B903 OUT 0x03,R16
011C E884 LDI R24,0x84
011D BF86 OUT 0x36,R24
(0160) I2CWaitAck();
011E B626 IN R2,0x36
011F FE27 SBRS R2,7
0120 CFFD RJMP 0x011E
(0161) if( I2CChkAck()!=I2C_MT_SLA_ACK )
0121 B181 IN R24,0x01
0122 7F88 ANDI R24,0xF8
0123 3188 CPI R24,0x18
0124 F011 BEQ 0x0127
(0162) return I2C_ERR;
0125 2700 CLR R16
0126 C001 RJMP 0x0128
(0163) return I2C_CRR;
0127 E001 LDI R16,1
0128 9508 RET
_I2C_SendWrDAdr_:
wrDAdr --> R20
0129 940E07D9 CALL push_gset1
012B 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位 器件地址
012C FF40 SBRS R20,0
012D C00B RJMP 0x0139
(0176) if( I2C_SendWrDAdr( (uint8)wrDAdr>>8 )==I2C_ERR ) //设置 (高位)器件写地址
012E 2F04 MOV R16,R20
012F 2711 CLR R17
0130 2F01 MOV R16,R17
0131 2711 CLR R17
0132 FD07 SBRC R16,7
0133 9510 COM R17
0134 DFE6 RCALL _I2C_SendWrDAdr
0135 2300 TST R16
0136 F411 BNE 0x0139
(0177) return I2C_ERR;
0137 2700 CLR R16
0138 C007 RJMP 0x0140
(0178) if( I2C_SendWrDAdr( (uint8)wrDAdr )==I2C_ERR ) //设置 (低位)器件写地址
0139 2F04 MOV R16,R20
013A DFE0 RCALL _I2C_SendWrDAdr
013B 2300 TST R16
013C F411 BNE 0x013F
(0179) return I2C_ERR;
013D 2700 CLR R16
013E C001 RJMP 0x0140
(0180) return I2C_CRR;
013F E001 LDI R16,1
0140 940E07DC CALL pop_gset1
0142 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
0143 B903 OUT 0x03,R16
0144 E884 LDI R24,0x84
0145 BF86 OUT 0x36,R24
(0193) I2CWaitAck();
0146 B626 IN R2,0x36
0147 FE27 SBRS R2,7
0148 CFFD RJMP 0x0146
(0194) if( I2CChkAck()!=I2C_MR_SLA_ACK )
0149 B181 IN R24,0x01
014A 7F88 ANDI R24,0xF8
014B 3480 CPI R24,0x40
014C F011 BEQ 0x014F
(0195) return I2C_ERR;
014D 2700 CLR R16
014E C001 RJMP 0x0150
(0196) return I2C_CRR;
014F E001 LDI R16,1
0150 9508 RET
_I2C_SendRdDAdr_:
rdDAdr --> R20
0151 940E07D9 CALL push_gset1
0153 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位 器件地址
0154 FF40 SBRS R20,0
0155 C00B RJMP 0x0161
(0209) if( I2C_SendWrDAdr( (uint8)rdDAdr>>8 )==I2C_ERR ) //设置 (高位)器件读地址
0156 2F04 MOV R16,R20
0157 2711 CLR R17
0158 2F01 MOV R16,R17
0159 2711 CLR R17
015A FD07 SBRC R16,7
015B 9510 COM R17
015C DFBE RCALL _I2C_SendWrDAdr
015D 2300 TST R16
015E F411 BNE 0x0161
(0210) return I2C_ERR;
015F 2700 CLR R16
0160 C007 RJMP 0x0168
(0211) if( I2C_SendWrDAdr( (uint8)rdDAdr )==I2C_ERR ) //设置 (低位)器件读地址
0161 2F04 MOV R16,R20
0162 DFB8 RCALL _I2C_SendWrDAdr
0163 2300 TST R16
0164 F411 BNE 0x0167
(0212) return I2C_ERR;
0165 2700 CLR R16
0166 C001 RJMP 0x0168
(0213) return I2C_CRR;
0167 E001 LDI R16,1
0168 940E07DC CALL pop_gset1
016A 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
016B B903 OUT 0x03,R16
016C E884 LDI R24,0x84
016D BF86 OUT 0x36,R24
(0226) I2CWaitAck();
016E B626 IN R2,0x36
016F FE27 SBRS R2,7
0170 CFFD RJMP 0x016E
(0227) if( I2CChkAck()!=I2C_MT_DATA_ACK )
0171 B181 IN R24,0x01
0172 7F88 ANDI R24,0xF8
0173 3288 CPI R24,0x28
0174 F011 BEQ 0x0177
(0228) return I2C_ERR;
0175 2700 CLR R16
0176 C001 RJMP 0x0178
(0229) return I2C_CRR;
0177 E001 LDI R16,1
0178 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
0179 E884 LDI R24,0x84
017A BF86 OUT 0x36,R24
(0242) I2CWaitAck();
017B B626 IN R2,0x36
017C FE27 SBRS R2,7
017D CFFD RJMP 0x017B
(0243) if( I2CChkAck()!=I2C_MR_DATA_NACK )
017E B181 IN R24,0x01
017F 7F88 ANDI R24,0xF8
0180 3588 CPI R24,0x58
0181 F011 BEQ 0x0184
(0244) return I2C_ERR;
0182 2700 CLR R16
0183 C004 RJMP 0x0188
(0245) *pRdDat=TWDR;
0184 B023 IN R2,0x03
0185 01F8 MOVW R30,R16
0186 8220 STD Z+0,R2
(0246) return I2C_CRR;
0187 E001 LDI R16,1
0188 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
0189 EC84 LDI R24,0xC4
018A BF86 OUT 0x36,R24
(0259) I2CWaitAck();
018B B626 IN R2,0x36
018C FE27 SBRS R2,7
018D CFFD RJMP 0x018B
(0260) if( I2CChkAck()!=I2C_MR_DATA_ACK )
018E B181 IN R24,0x01
018F 7F88 ANDI R24,0xF8
0190 3580 CPI R24,0x50
0191 F011 BEQ 0x0194
(0261) return I2C_ERR;
0192 2700 CLR R16
0193 C004 RJMP 0x0198
(0262) *pRdDat=TWDR;
0194 B023 IN R2,0x03
0195 01F8 MOVW R30,R16
0196 8220 STD Z+0,R2
(0263) return I2C_CRR;
0197 E001 LDI R16,1
0198 9508 RET
_I2C_Write:
dat --> Y+4
wordAdr --> R20
wrDAdr --> R22
0199 940E07D7 CALL push_gset2
019B 2F42 MOV R20,R18
019C 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 )
019D DF63 RCALL _I2C_Start
019E 2300 TST R16
019F F411 BNE 0x01A2
(0278) return I2C_ERR;
01A0 2700 CLR R16
01A1 C015 RJMP 0x01B7
(0279)
(0280) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
01A2 018B MOVW R16,R22
01A3 DF85 RCALL _I2C_SendWrDAdr_
01A4 2300 TST R16
01A5 F411 BNE 0x01A8
(0281) return I2C_ERR;
01A6 2700 CLR R16
01A7 C00F RJMP 0x01B7
(0282)
(0283) if( I2C_SendDat(wordAdr)==I2C_ERR )
01A8 2F04 MOV R16,R20
01A9 DFC1 RCALL _I2C_SendDat
01AA 2300 TST R16
01AB F411 BNE 0x01AE
(0284) return I2C_ERR;
01AC 2700 CLR R16
01AD C009 RJMP 0x01B7
(0285)
(0286) if( I2C_SendDat(dat)==I2C_ERR )
01AE 810C LDD R16,Y+4
01AF DFBB RCALL _I2C_SendDat
01B0 2300 TST R16
01B1 F411 BNE 0x01B4
(0287) return I2C_ERR;
01B2 2700 CLR R16
01B3 C003 RJMP 0x01B7
(0288)
(0289) I2C_Stop();
01B4 E984 LDI R24,0x94
01B5 BF86 OUT 0x36,R24
(0290)
(0291) return I2C_CRR;
01B6 E001 LDI R16,1
01B7 940E07C8 CALL pop_gset2
01B9 9508 RET
_I2C_Read:
pRdDat --> Y+6
rdDAdr --> Y+4
wordAdr --> R20
wrDAdr --> R22
01BA 940E07D7 CALL push_gset2
01BC 2F42 MOV R20,R18
01BD 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 )
01BE DF42 RCALL _I2C_Start
01BF 2300 TST R16
01C0 F411 BNE 0x01C3
(0324) return I2C_ERR;
01C1 2700 CLR R16
01C2 C021 RJMP 0x01E4
(0325)
(0326) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
01C3 018B MOVW R16,R22
01C4 DF64 RCALL _I2C_SendWrDAdr_
01C5 2300 TST R16
01C6 F411 BNE 0x01C9
(0327) return I2C_ERR;
01C7 2700 CLR R16
01C8 C01B RJMP 0x01E4
(0328)
(0329) if( I2C_SendDat(wordAdr)==I2C_ERR )
01C9 2F04 MOV R16,R20
01CA DFA0 RCALL _I2C_SendDat
01CB 2300 TST R16
01CC F411 BNE 0x01CF
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?