📄 24c02.lst
字号:
0109 98A8 CBI 0x15,0
010A E604 LDI R16,0x64
010B E010 LDI R17,0
010C DF47 RCALL _Delay_us
(0209) SDA_0;
010D 98A9 CBI 0x15,1
010E E604 LDI R16,0x64
010F E010 LDI R17,0
0110 DF43 RCALL _Delay_us
(0210) SCL_1;
0111 9AA8 SBI 0x15,0
0112 E604 LDI R16,0x64
0113 E010 LDI R17,0
0114 DF3F RCALL _Delay_us
(0211)
(0212) i2c_ddr&=~(1<<SDA); //设置SDA为输入
0115 98A1 CBI 0x14,1
(0213) i2c_port|=1<<SDA; //上拉
0116 9AA9 SBI 0x15,1
(0214) ack=(i2c_pin & (1<<SDA)); //读SDA应答位
0117 B343 IN R20,0x13
0118 7042 ANDI R20,2
(0215) i2c_ddr|=(1<<SDA); //恢复为输出
0119 9AA1 SBI 0x14,1
(0216)
(0217) SCL_0;
011A 98A8 CBI 0x15,0
011B E604 LDI R16,0x64
011C E010 LDI R17,0
011D DF36 RCALL _Delay_us
(0218) return(ack);
011E 2F04 MOV R16,R20
011F 940E01DE CALL pop_gset1
0121 9508 RET
_IICReceiveByte:
i --> R20
receivebyte --> R22
0122 940E01D9 CALL push_gset2
(0219) }
(0220) //=======================================================================
(0221) //从IIC总线上读数据。
(0222) unsigned char IICReceiveByte(void)
(0223) {
(0224) uint8 receivebyte=0,i=8;
0124 2766 CLR R22
0125 E048 LDI R20,0x8
(0225)
(0226) i2c_ddr&=~(1<<SDA); //设置SDA为输入
0126 98A1 CBI 0x14,1
(0227) i2c_port|=1<<SDA; //上拉
0127 9AA9 SBI 0x15,1
(0228) i2c_port&=~(1<<SCL);
0128 98A8 CBI 0x15,0
0129 C00C RJMP 0x0136
(0229)
(0230) while(i--)
(0231) {
(0232) SCL_1;
012A 9AA8 SBI 0x15,0
012B E604 LDI R16,0x64
012C E010 LDI R17,0
012D DF26 RCALL _Delay_us
(0233) receivebyte <<= 1;
012E 0F66 LSL R22
(0234) if(i2c_pin & (1<<SDA)) receivebyte |= 1;
012F 9B99 SBIS 0x13,1
0130 C001 RJMP 0x0132
0131 6061 ORI R22,1
(0235) SCL_0;
0132 98A8 CBI 0x15,0
0133 E604 LDI R16,0x64
0134 E010 LDI R17,0
0135 DF1E RCALL _Delay_us
0136 2E24 MOV R2,R20
0137 2433 CLR R3
0138 5041 SUBI R20,1
0139 2022 TST R2
013A F779 BNE 0x012A
(0236) }
(0237)
(0238) i2c_ddr|=(1<<SDA); //恢复SDA为输出
013B 9AA1 SBI 0x14,1
(0239) return(receivebyte);
013C 2F06 MOV R16,R22
013D 940E01CD CALL pop_gset2
013F 9508 RET
(0240) }
(0241)
(0242)
(0243) //=======================================================================
(0244) //对IIC总线产生应答。读I2C设备时,如果下一步还要读则产生0应答。
(0245) void IICACK(void)
(0246) {
(0247) SDA_0;
_IICACK:
0140 98A9 CBI 0x15,1
0141 E604 LDI R16,0x64
0142 E010 LDI R17,0
0143 DF10 RCALL _Delay_us
(0248) SCL_1;
0144 9AA8 SBI 0x15,0
0145 E604 LDI R16,0x64
0146 E010 LDI R17,0
0147 DF0C RCALL _Delay_us
(0249) SCL_0;
0148 98A8 CBI 0x15,0
0149 E604 LDI R16,0x64
014A E010 LDI R17,0
014B DF08 RCALL _Delay_us
(0250)
(0251) SDA_1;
014C 9AA9 SBI 0x15,1
014D E604 LDI R16,0x64
014E E010 LDI R17,0
014F DF04 RCALL _Delay_us
0150 9508 RET
(0252) }
(0253) //=======================================================================
(0254) //不对IIC总线产生应答。读I2C设备时,如果下一步不需要读则产生1应答(即不应答)。
(0255) void IICNoAck(void)
(0256) {
(0257) SDA_1;
_IICNoAck:
0151 9AA9 SBI 0x15,1
0152 E604 LDI R16,0x64
0153 E010 LDI R17,0
0154 DEFF RCALL _Delay_us
(0258) SCL_1;
0155 9AA8 SBI 0x15,0
0156 E604 LDI R16,0x64
0157 E010 LDI R17,0
0158 DEFB RCALL _Delay_us
(0259) SCL_0;
0159 98A8 CBI 0x15,0
015A E604 LDI R16,0x64
015B E010 LDI R17,0
015C DEF7 RCALL _Delay_us
015D 9508 RET
_IICSendByte:
j --> R20
sendbyte --> R22
015E 940E01D9 CALL push_gset2
0160 2F60 MOV R22,R16
(0260) }
(0261) //=======================================================================
(0262) //向IIC总线写数据。SCL=0时SDA的数据可改变,SCL=1时需保持SDA数据稳定。
(0263) void IICSendByte(unsigned char sendbyte)
(0264) {
(0265) uint8 j=8;
0161 E048 LDI R20,0x8
(0266) for(;j>0;j--)
0162 C015 RJMP 0x0178
(0267) {
(0268) SCL_0;
0163 98A8 CBI 0x15,0
0164 E604 LDI R16,0x64
0165 E010 LDI R17,0
0166 DEED RCALL _Delay_us
(0269)
(0270) if(sendbyte&0x80) SDA_1 //SCL=0时写数据到SDA
0167 FF67 SBRS R22,7
0168 C005 RJMP 0x016E
0169 9AA9 SBI 0x15,1
016A E604 LDI R16,0x64
016B E010 LDI R17,0
016C DEE7 RCALL _Delay_us
016D C004 RJMP 0x0172
(0271) else SDA_0
016E 98A9 CBI 0x15,1
016F E604 LDI R16,0x64
0170 E010 LDI R17,0
0171 DEE2 RCALL _Delay_us
(0272)
(0273) sendbyte<<=1;
0172 0F66 LSL R22
(0274)
(0275) SCL_1;
0173 9AA8 SBI 0x15,0
0174 E604 LDI R16,0x64
0175 E010 LDI R17,0
0176 DEDD RCALL _Delay_us
0177 954A DEC R20
0178 2422 CLR R2
0179 1624 CP R2,R20
017A F340 BCS 0x0163
(0276) }
(0277) SCL_0;
017B 98A8 CBI 0x15,0
017C E604 LDI R16,0x64
017D E010 LDI R17,0
017E DED5 RCALL _Delay_us
017F 940E01CD CALL pop_gset2
0181 9508 RET
_i2c_Read:
ErrorCount --> R22
data --> R20
device --> R10
subAddr --> R12
0182 940E01D5 CALL push_gset4
0184 2EA2 MOV R10,R18
0185 2EC0 MOV R12,R16
(0278) }
(0279)
(0280) //=======================================================================
(0281) //通过I2C读STA013
(0282) unsigned char i2c_Read(unsigned char subAddr,uint8 device)
(0283) {
(0284) uint8 data=0;
0186 2744 CLR R20
(0285) uint8 ErrorCount=10;
0187 E06A LDI R22,0xA
0188 C019 RJMP 0x01A2
(0286) //Delay_us(1200);
(0287)
(0288) while(ErrorCount--)
(0289) {
(0290) IICStart();
0189 DF57 RCALL _IICStart
(0291) IICSendByte(device);
018A 2D0A MOV R16,R10
018B DFD2 RCALL _IICSendByte
(0292)
(0293) if(IICRecAck()) continue; //如果为非0应答,重复写
018C DF7A RCALL _IICRecAck
018D 2300 TST R16
018E F009 BEQ 0x0190
018F C012 RJMP 0x01A2
(0294)
(0295) IICSendByte(subAddr);
0190 2D0C MOV R16,R12
0191 DFCC RCALL _IICSendByte
(0296) if(IICRecAck()) continue; //如果为非0应答,重复写
0192 DF74 RCALL _IICRecAck
0193 2300 TST R16
0194 F009 BEQ 0x0196
0195 C00C RJMP 0x01A2
(0297) IICStart();
0196 DF4A RCALL _IICStart
(0298) IICSendByte(device | 0x01);
0197 2D0A MOV R16,R10
0198 6001 ORI R16,1
0199 DFC4 RCALL _IICSendByte
(0299) if(IICRecAck()) continue;
019A DF6C RCALL _IICRecAck
019B 2300 TST R16
019C F009 BEQ 0x019E
019D C004 RJMP 0x01A2
(0300)
(0301)
(0302) data=IICReceiveByte(); //读数据,并发出1应答,表示不再读。
019E DF83 RCALL _IICReceiveByte
019F 2F40 MOV R20,R16
(0303) IICNoAck();
01A0 DFB0 RCALL _IICNoAck
(0304) break;
01A1 C005 RJMP 0x01A7
01A2 2E26 MOV R2,R22
01A3 2433 CLR R3
01A4 5061 SUBI R22,1
01A5 2022 TST R2
01A6 F711 BNE 0x0189
(0305) }
(0306) IICStop();
01A7 DF4E RCALL _IICStop
(0307) return data;
01A8 2F04 MOV R16,R20
01A9 940E01D0 CALL pop_gset4
01AB 9508 RET
_i2c_Write:
ErrorCount --> R20
data --> R22
device --> R10
subAddr --> R12
01AC 940E01D5 CALL push_gset4
01AE 2EA2 MOV R10,R18
01AF 2EC0 MOV R12,R16
01B0 8568 LDD R22,Y+8
(0308) }
(0309)
(0310) //=======================================================================
(0311) void i2c_Write(unsigned char subAddr,unsigned char device,unsigned char data)
(0312) {
(0313) uint8 ErrorCount=10;
01B1 E04A LDI R20,0xA
01B2 C011 RJMP 0x01C4
(0314)
(0315) while(ErrorCount--)
(0316) {
(0317) IICStart();
01B3 DF2D RCALL _IICStart
(0318) IICSendByte(device);
01B4 2D0A MOV R16,R10
01B5 DFA8 RCALL _IICSendByte
(0319) if(IICRecAck()) continue; //如果为非0应答,重复写
01B6 DF50 RCALL _IICRecAck
01B7 2300 TST R16
01B8 F009 BEQ 0x01BA
01B9 C00A RJMP 0x01C4
(0320) IICSendByte(subAddr);
01BA 2D0C MOV R16,R12
01BB DFA2 RCALL _IICSendByte
(0321) if(IICRecAck()) continue; //如果为非0应答,重复写
01BC DF4A RCALL _IICRecAck
01BD 2300 TST R16
01BE F009 BEQ 0x01C0
01BF C004 RJMP 0x01C4
(0322)
(0323) IICSendByte(data);
01C0 2F06 MOV R16,R22
01C1 DF9C RCALL _IICSendByte
(0324) IICACK();
01C2 DF7D RCALL _IICACK
(0325)
(0326) break;
01C3 C005 RJMP 0x01C9
01C4 2E24 MOV R2,R20
01C5 2433 CLR R3
01C6 5041 SUBI R20,1
01C7 2022 TST R2
01C8 F751 BNE 0x01B3
(0327) }
(0328)
(0329) IICStop();
FILE: <library>
01C9 DF2C RCALL _IICStop
01CA 940E01D0 CALL pop_gset4
01CC 9508 RET
pop_gset2:
01CD E0E2 LDI R30,2
01CE 940C01DF JMP pop
pop_gset4:
01D0 E0E8 LDI R30,0x8
01D1 940C01DF JMP pop
push_gset5:
01D3 92FA ST R15,-Y
01D4 92EA ST R14,-Y
push_gset4:
01D5 92DA ST R13,-Y
01D6 92CA ST R12,-Y
push_gset3:
01D7 92BA ST R11,-Y
01D8 92AA ST R10,-Y
push_gset2:
01D9 937A ST R23,-Y
01DA 936A ST R22,-Y
push_gset1:
01DB 935A ST R21,-Y
01DC 934A ST R20,-Y
01DD 9508 RET
pop_gset1:
01DE E0E1 LDI R30,1
pop:
01DF 9149 LD R20,Y+
01E0 9159 LD R21,Y+
01E1 FDE0 SBRC R30,0
01E2 9508 RET
01E3 9169 LD R22,Y+
01E4 9179 LD R23,Y+
01E5 FDE1 SBRC R30,1
01E6 9508 RET
01E7 90A9 LD R10,Y+
01E8 90B9 LD R11,Y+
01E9 FDE2 SBRC R30,2
01EA 9508 RET
01EB 90C9 LD R12,Y+
01EC 90D9 LD R13,Y+
01ED FDE3 SBRC R30,3
01EE 9508 RET
01EF 90E9 LD R14,Y+
01F0 90F9 LD R15,Y+
01F1 9508 RET
push_lset:
01F2 93FA ST R31,-Y
01F3 93EA ST R30,-Y
01F4 93BA ST R27,-Y
01F5 93AA ST R26,-Y
01F6 939A ST R25,-Y
01F7 938A ST R24,-Y
01F8 933A ST R19,-Y
01F9 932A ST R18,-Y
01FA 931A ST R17,-Y
01FB 930A ST R16,-Y
01FC 929A ST R9,-Y
01FD 928A ST R8,-Y
01FE 927A ST R7,-Y
01FF 926A ST R6,-Y
0200 925A ST R5,-Y
0201 924A ST R4,-Y
0202 923A ST R3,-Y
0203 922A ST R2,-Y
0204 921A ST R1,-Y
0205 920A ST R0,-Y
0206 B60F IN R0,0x3F
0207 920A ST R0,-Y
0208 9508 RET
pop_lset:
0209 9009 LD R0,Y+
020A BE0F OUT 0x3F,R0
020B 9009 LD R0,Y+
020C 9019 LD R1,Y+
020D 9029 LD R2,Y+
020E 9039 LD R3,Y+
020F 9049 LD R4,Y+
0210 9059 LD R5,Y+
0211 9069 LD R6,Y+
0212 9079 LD R7,Y+
0213 9089 LD R8,Y+
0214 9099 LD R9,Y+
0215 9109 LD R16,Y+
0216 9119 LD R17,Y+
0217 9129 LD R18,Y+
0218 9139 LD R19,Y+
0219 9189 LD R24,Y+
021A 9199 LD R25,Y+
021B 91A9 LD R26,Y+
021C 91B9 LD R27,Y+
021D 91E9 LD R30,Y+
021E 91F9 LD R31,Y+
021F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -