📄 24c02.lis
字号:
0156 04E6 ldi R16,100
0158 10E0 ldi R17,0
015A 52DF xcall _Delay_us
015C .dbline 196
015C .dbline 196
015C .dbline 197
015C ; SDA_1;
015C .dbline 197
015C A99A sbi 0x15,1
015E .dbline 197
015E 04E6 ldi R16,100
0160 10E0 ldi R17,0
0162 4EDF xcall _Delay_us
0164 .dbline 197
0164 .dbline 197
0164 .dbline -2
0164 L29:
0164 .dbline 0 ; func end
0164 0895 ret
0166 .dbend
0166 .dbfunc e IICRecAck _IICRecAck fc
0166 ; ack -> R20
.even
0166 _IICRecAck::
0166 0E940000 xcall push_gset1
016A .dbline -1
016A .dbline 205
016A ; //SCL_0;
016A ; }
016A ; //=======================================================================
016A ; //检查应答位,向I2C写数据时,I2C设备(EEPROM)正常接受到数据后在第9周期发出0应答,
016A ; //如果不正常接受到数据,则不以0应答而进入待命状态。
016A ; //写数据后需检查I2C设备是否有0应答。
016A ; unsigned char IICRecAck(void)
016A ; {
016A .dbline 208
016A ; uint8 ack;
016A ;
016A ; SCL_0;
016A .dbline 208
016A A898 cbi 0x15,0
016C .dbline 208
016C 04E6 ldi R16,100
016E 10E0 ldi R17,0
0170 47DF xcall _Delay_us
0172 .dbline 208
0172 .dbline 208
0172 .dbline 209
0172 ; SDA_0;
0172 .dbline 209
0172 A998 cbi 0x15,1
0174 .dbline 209
0174 04E6 ldi R16,100
0176 10E0 ldi R17,0
0178 43DF xcall _Delay_us
017A .dbline 209
017A .dbline 209
017A .dbline 210
017A ; SCL_1;
017A .dbline 210
017A A89A sbi 0x15,0
017C .dbline 210
017C 04E6 ldi R16,100
017E 10E0 ldi R17,0
0180 3FDF xcall _Delay_us
0182 .dbline 210
0182 .dbline 210
0182 .dbline 212
0182 ;
0182 ; i2c_ddr&=~(1<<SDA); //设置SDA为输入
0182 A198 cbi 0x14,1
0184 .dbline 213
0184 ; i2c_port|=1<<SDA; //上拉
0184 A99A sbi 0x15,1
0186 .dbline 214
0186 ; ack=(i2c_pin & (1<<SDA)); //读SDA应答位
0186 43B3 in R20,0x13
0188 4270 andi R20,2
018A .dbline 215
018A ; i2c_ddr|=(1<<SDA); //恢复为输出
018A A19A sbi 0x14,1
018C .dbline 217
018C ;
018C ; SCL_0;
018C .dbline 217
018C A898 cbi 0x15,0
018E .dbline 217
018E 04E6 ldi R16,100
0190 10E0 ldi R17,0
0192 36DF xcall _Delay_us
0194 .dbline 217
0194 .dbline 217
0194 .dbline 218
0194 ; return(ack);
0194 042F mov R16,R20
0196 .dbline -2
0196 L30:
0196 0E940000 xcall pop_gset1
019A .dbline 0 ; func end
019A 0895 ret
019C .dbsym r ack 20 c
019C .dbend
019C .dbfunc e IICReceiveByte _IICReceiveByte fc
019C ; i -> R20
019C ; receivebyte -> R22
.even
019C _IICReceiveByte::
019C 0E940000 xcall push_gset2
01A0 .dbline -1
01A0 .dbline 223
01A0 ; }
01A0 ; //=======================================================================
01A0 ; //从IIC总线上读数据。
01A0 ; unsigned char IICReceiveByte(void)
01A0 ; {
01A0 .dbline 224
01A0 ; uint8 receivebyte=0,i=8;
01A0 6627 clr R22
01A2 .dbline 224
01A2 48E0 ldi R20,8
01A4 .dbline 226
01A4 ;
01A4 ; i2c_ddr&=~(1<<SDA); //设置SDA为输入
01A4 A198 cbi 0x14,1
01A6 .dbline 227
01A6 ; i2c_port|=1<<SDA; //上拉
01A6 A99A sbi 0x15,1
01A8 .dbline 228
01A8 ; i2c_port&=~(1<<SCL);
01A8 A898 cbi 0x15,0
01AA 0CC0 xjmp L33
01AC L32:
01AC .dbline 231
01AC ;
01AC ; while(i--)
01AC ; {
01AC .dbline 232
01AC ; SCL_1;
01AC .dbline 232
01AC A89A sbi 0x15,0
01AE .dbline 232
01AE 04E6 ldi R16,100
01B0 10E0 ldi R17,0
01B2 26DF xcall _Delay_us
01B4 .dbline 232
01B4 .dbline 232
01B4 .dbline 233
01B4 ; receivebyte <<= 1;
01B4 660F lsl R22
01B6 .dbline 234
01B6 ; if(i2c_pin & (1<<SDA)) receivebyte |= 1;
01B6 999B sbis 0x13,1
01B8 01C0 rjmp L35
01BA .dbline 234
01BA 6160 ori R22,1
01BC L35:
01BC .dbline 235
01BC .dbline 235
01BC A898 cbi 0x15,0
01BE .dbline 235
01BE 04E6 ldi R16,100
01C0 10E0 ldi R17,0
01C2 1EDF xcall _Delay_us
01C4 .dbline 235
01C4 .dbline 235
01C4 .dbline 236
01C4 L33:
01C4 .dbline 230
01C4 242E mov R2,R20
01C6 3324 clr R3
01C8 4150 subi R20,1
01CA 2220 tst R2
01CC 79F7 brne L32
01CE .dbline 238
01CE ; SCL_0;
01CE ; }
01CE ;
01CE ; i2c_ddr|=(1<<SDA); //恢复SDA为输出
01CE A19A sbi 0x14,1
01D0 .dbline 239
01D0 ; return(receivebyte);
01D0 062F mov R16,R22
01D2 .dbline -2
01D2 L31:
01D2 0E940000 xcall pop_gset2
01D6 .dbline 0 ; func end
01D6 0895 ret
01D8 .dbsym r i 20 c
01D8 .dbsym r receivebyte 22 c
01D8 .dbend
01D8 .dbfunc e IICACK _IICACK fV
.even
01D8 _IICACK::
01D8 .dbline -1
01D8 .dbline 246
01D8 ; }
01D8 ;
01D8 ;
01D8 ; //=======================================================================
01D8 ; //对IIC总线产生应答。读I2C设备时,如果下一步还要读则产生0应答。
01D8 ; void IICACK(void)
01D8 ; {
01D8 .dbline 247
01D8 ; SDA_0;
01D8 .dbline 247
01D8 A998 cbi 0x15,1
01DA .dbline 247
01DA 04E6 ldi R16,100
01DC 10E0 ldi R17,0
01DE 10DF xcall _Delay_us
01E0 .dbline 247
01E0 .dbline 247
01E0 .dbline 248
01E0 ; SCL_1;
01E0 .dbline 248
01E0 A89A sbi 0x15,0
01E2 .dbline 248
01E2 04E6 ldi R16,100
01E4 10E0 ldi R17,0
01E6 0CDF xcall _Delay_us
01E8 .dbline 248
01E8 .dbline 248
01E8 .dbline 249
01E8 ; SCL_0;
01E8 .dbline 249
01E8 A898 cbi 0x15,0
01EA .dbline 249
01EA 04E6 ldi R16,100
01EC 10E0 ldi R17,0
01EE 08DF xcall _Delay_us
01F0 .dbline 249
01F0 .dbline 249
01F0 .dbline 251
01F0 ;
01F0 ; SDA_1;
01F0 .dbline 251
01F0 A99A sbi 0x15,1
01F2 .dbline 251
01F2 04E6 ldi R16,100
01F4 10E0 ldi R17,0
01F6 04DF xcall _Delay_us
01F8 .dbline 251
01F8 .dbline 251
01F8 .dbline -2
01F8 L37:
01F8 .dbline 0 ; func end
01F8 0895 ret
01FA .dbend
01FA .dbfunc e IICNoAck _IICNoAck fV
.even
01FA _IICNoAck::
01FA .dbline -1
01FA .dbline 256
01FA ; }
01FA ; //=======================================================================
01FA ; //不对IIC总线产生应答。读I2C设备时,如果下一步不需要读则产生1应答(即不应答)。
01FA ; void IICNoAck(void)
01FA ; {
01FA .dbline 257
01FA ; SDA_1;
01FA .dbline 257
01FA A99A sbi 0x15,1
01FC .dbline 257
01FC 04E6 ldi R16,100
01FE 10E0 ldi R17,0
0200 FFDE xcall _Delay_us
0202 .dbline 257
0202 .dbline 257
0202 .dbline 258
0202 ; SCL_1;
0202 .dbline 258
0202 A89A sbi 0x15,0
0204 .dbline 258
0204 04E6 ldi R16,100
0206 10E0 ldi R17,0
0208 FBDE xcall _Delay_us
020A .dbline 258
020A .dbline 258
020A .dbline 259
020A ; SCL_0;
020A .dbline 259
020A A898 cbi 0x15,0
020C .dbline 259
020C 04E6 ldi R16,100
020E 10E0 ldi R17,0
0210 F7DE xcall _Delay_us
0212 .dbline 259
0212 .dbline 259
0212 .dbline -2
0212 L38:
0212 .dbline 0 ; func end
0212 0895 ret
0214 .dbend
0214 .dbfunc e IICSendByte _IICSendByte fV
0214 ; j -> R20
0214 ; sendbyte -> R22
.even
0214 _IICSendByte::
0214 0E940000 xcall push_gset2
0218 602F mov R22,R16
021A .dbline -1
021A .dbline 264
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -