📄 24c02.lis
字号:
021A ; }
021A ; //=======================================================================
021A ; //向IIC总线写数据。SCL=0时SDA的数据可改变,SCL=1时需保持SDA数据稳定。
021A ; void IICSendByte(unsigned char sendbyte)
021A ; {
021A .dbline 265
021A ; uint8 j=8;
021A 48E0 ldi R20,8
021C .dbline 266
021C ; for(;j>0;j--)
021C 15C0 xjmp L43
021E L40:
021E .dbline 267
021E ; {
021E .dbline 268
021E ; SCL_0;
021E .dbline 268
021E A898 cbi 0x15,0
0220 .dbline 268
0220 04E6 ldi R16,100
0222 10E0 ldi R17,0
0224 EDDE xcall _Delay_us
0226 .dbline 268
0226 .dbline 268
0226 .dbline 270
0226 ;
0226 ; if(sendbyte&0x80) SDA_1 //SCL=0时写数据到SDA
0226 67FF sbrs R22,7
0228 05C0 rjmp L44
022A .dbline 270
022A .dbline 270
022A A99A sbi 0x15,1
022C .dbline 270
022C 04E6 ldi R16,100
022E 10E0 ldi R17,0
0230 E7DE xcall _Delay_us
0232 .dbline 270
0232 04C0 xjmp L45
0234 L44:
0234 .dbline 271
0234 ; else SDA_0
0234 .dbline 271
0234 A998 cbi 0x15,1
0236 .dbline 271
0236 04E6 ldi R16,100
0238 10E0 ldi R17,0
023A E2DE xcall _Delay_us
023C .dbline 271
023C L45:
023C .dbline 273
023C 660F lsl R22
023E .dbline 275
023E .dbline 275
023E A89A sbi 0x15,0
0240 .dbline 275
0240 04E6 ldi R16,100
0242 10E0 ldi R17,0
0244 DDDE xcall _Delay_us
0246 .dbline 275
0246 .dbline 275
0246 .dbline 276
0246 L41:
0246 .dbline 266
0246 4A95 dec R20
0248 L43:
0248 .dbline 266
0248 2224 clr R2
024A 2416 cp R2,R20
024C 40F3 brlo L40
024E .dbline 277
024E ;
024E ; sendbyte<<=1;
024E ;
024E ; SCL_1;
024E ; }
024E ; SCL_0;
024E .dbline 277
024E A898 cbi 0x15,0
0250 .dbline 277
0250 04E6 ldi R16,100
0252 10E0 ldi R17,0
0254 D5DE xcall _Delay_us
0256 .dbline 277
0256 .dbline 277
0256 .dbline -2
0256 L39:
0256 0E940000 xcall pop_gset2
025A .dbline 0 ; func end
025A 0895 ret
025C .dbsym r j 20 c
025C .dbsym r sendbyte 22 c
025C .dbend
025C .dbfunc e i2c_Read _i2c_Read fc
025C ; ErrorCount -> R22
025C ; data -> R20
025C ; device -> R10
025C ; subAddr -> R12
.even
025C _i2c_Read::
025C 0E940000 xcall push_gset4
0260 A22E mov R10,R18
0262 C02E mov R12,R16
0264 .dbline -1
0264 .dbline 283
0264 ; }
0264 ;
0264 ; //=======================================================================
0264 ; //通过I2C读STA013
0264 ; unsigned char i2c_Read(unsigned char subAddr,uint8 device)
0264 ; {
0264 .dbline 284
0264 ; uint8 data=0;
0264 4427 clr R20
0266 .dbline 285
0266 ; uint8 ErrorCount=10;
0266 6AE0 ldi R22,10
0268 19C0 xjmp L48
026A L47:
026A .dbline 289
026A ; //Delay_us(1200);
026A ;
026A ; while(ErrorCount--)
026A ; {
026A .dbline 290
026A ; IICStart();
026A 57DF xcall _IICStart
026C .dbline 291
026C ; IICSendByte(device);
026C 0A2D mov R16,R10
026E D2DF xcall _IICSendByte
0270 .dbline 293
0270 ;
0270 ; if(IICRecAck()) continue; //如果为非0应答,重复写
0270 7ADF xcall _IICRecAck
0272 0023 tst R16
0274 09F0 breq L50
0276 .dbline 293
0276 12C0 xjmp L48
0278 L50:
0278 .dbline 295
0278 ;
0278 ; IICSendByte(subAddr);
0278 0C2D mov R16,R12
027A CCDF xcall _IICSendByte
027C .dbline 296
027C ; if(IICRecAck()) continue; //如果为非0应答,重复写
027C 74DF xcall _IICRecAck
027E 0023 tst R16
0280 09F0 breq L52
0282 .dbline 296
0282 0CC0 xjmp L48
0284 L52:
0284 .dbline 297
0284 ; IICStart();
0284 4ADF xcall _IICStart
0286 .dbline 298
0286 ; IICSendByte(device | 0x01);
0286 0A2D mov R16,R10
0288 0160 ori R16,1
028A C4DF xcall _IICSendByte
028C .dbline 299
028C ; if(IICRecAck()) continue;
028C 6CDF xcall _IICRecAck
028E 0023 tst R16
0290 09F0 breq L54
0292 .dbline 299
0292 04C0 xjmp L48
0294 L54:
0294 .dbline 302
0294 83DF xcall _IICReceiveByte
0296 402F mov R20,R16
0298 .dbline 303
0298 B0DF xcall _IICNoAck
029A .dbline 304
029A 05C0 xjmp L49
029C L48:
029C .dbline 288
029C 262E mov R2,R22
029E 3324 clr R3
02A0 6150 subi R22,1
02A2 2220 tst R2
02A4 11F7 brne L47
02A6 L49:
02A6 .dbline 306
02A6 ;
02A6 ;
02A6 ; data=IICReceiveByte(); //读数据,并发出1应答,表示不再读。
02A6 ; IICNoAck();
02A6 ; break;
02A6 ; }
02A6 ; IICStop();
02A6 4EDF xcall _IICStop
02A8 .dbline 307
02A8 ; return data;
02A8 042F mov R16,R20
02AA .dbline -2
02AA L46:
02AA 0E940000 xcall pop_gset4
02AE .dbline 0 ; func end
02AE 0895 ret
02B0 .dbsym r ErrorCount 22 c
02B0 .dbsym r data 20 c
02B0 .dbsym r device 10 c
02B0 .dbsym r subAddr 12 c
02B0 .dbend
02B0 .dbfunc e i2c_Write _i2c_Write fV
02B0 ; ErrorCount -> R20
02B0 ; data -> R22
02B0 ; device -> R10
02B0 ; subAddr -> R12
.even
02B0 _i2c_Write::
02B0 0E940000 xcall push_gset4
02B4 A22E mov R10,R18
02B6 C02E mov R12,R16
02B8 6885 ldd R22,y+8
02BA .dbline -1
02BA .dbline 312
02BA ; }
02BA ;
02BA ; //=======================================================================
02BA ; void i2c_Write(unsigned char subAddr,unsigned char device,unsigned char data)
02BA ; {
02BA .dbline 313
02BA ; uint8 ErrorCount=10;
02BA 4AE0 ldi R20,10
02BC 11C0 xjmp L58
02BE L57:
02BE .dbline 316
02BE ;
02BE ; while(ErrorCount--)
02BE ; {
02BE .dbline 317
02BE ; IICStart();
02BE 2DDF xcall _IICStart
02C0 .dbline 318
02C0 ; IICSendByte(device);
02C0 0A2D mov R16,R10
02C2 A8DF xcall _IICSendByte
02C4 .dbline 319
02C4 ; if(IICRecAck()) continue; //如果为非0应答,重复写
02C4 50DF xcall _IICRecAck
02C6 0023 tst R16
02C8 09F0 breq L60
02CA .dbline 319
02CA 0AC0 xjmp L58
02CC L60:
02CC .dbline 320
02CC ; IICSendByte(subAddr);
02CC 0C2D mov R16,R12
02CE A2DF xcall _IICSendByte
02D0 .dbline 321
02D0 ; if(IICRecAck()) continue; //如果为非0应答,重复写
02D0 4ADF xcall _IICRecAck
02D2 0023 tst R16
02D4 09F0 breq L62
02D6 .dbline 321
02D6 04C0 xjmp L58
02D8 L62:
02D8 .dbline 323
02D8 062F mov R16,R22
02DA 9CDF xcall _IICSendByte
02DC .dbline 324
02DC 7DDF xcall _IICACK
02DE .dbline 326
02DE 05C0 xjmp L59
02E0 L58:
02E0 .dbline 315
02E0 242E mov R2,R20
02E2 3324 clr R3
02E4 4150 subi R20,1
02E6 2220 tst R2
02E8 51F7 brne L57
02EA L59:
02EA .dbline 329
02EA ;
02EA ; IICSendByte(data);
02EA ; IICACK();
02EA ;
02EA ; break;
02EA ; }
02EA ;
02EA ; IICStop();
02EA 2CDF xcall _IICStop
02EC .dbline -2
02EC L56:
02EC 0E940000 xcall pop_gset4
02F0 .dbline 0 ; func end
02F0 0895 ret
02F2 .dbsym r ErrorCount 20 c
02F2 .dbsym r data 22 c
02F2 .dbsym r device 10 c
02F2 .dbsym r subAddr 12 c
02F2 .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\24C02T~1\24c02.c
0000 _DISP_NUM::
0000 .blkb 1
0001 .dbsym e DISP_NUM _DISP_NUM c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -