📄 iic.ls1
字号:
215 ; bool ack; /*应答标志位*/
216 ;
217 ; static void StartI2c(void);
218 ; static void StopI2c(void);
219 ; static bool SendByte(byte value);
220 ; static byte RcvByte(void);
221 ; static void AckI2c(bool bFlag);
222 ;
223 ;
224 ; /**********************************************************************/
225 ;
226 ;
227 ;
228 ; static void StartI2c()
229
---- 230 RSEG ?PR?StartI2c?IIC
0000 231 StartI2c:
232 ; SOURCE LINE # 39
233 ; {
234 ; SOURCE LINE # 40
235 ; SDA = 1; /*发送起始条件的数据信号*/
236 ; SOURCE LINE # 41
0000 D2B4 237 SETB SDA
238 ; //_nop_();
239 ; SCL = 1;
240 ; SOURCE LINE # 43
0002 D2B5 241 SETB SCL
242 ; //_nop_();
243 ; SDA = 0; /*发送起始信号*/
244 ; SOURCE LINE # 45
0004 C2B4 245 CLR SDA
246 ; //_nop_();
247 ; SCL = 0; /*钳住I2C总线,准备发送或接收数据 */
248 ; SOURCE LINE # 47
0006 C2B5 249 CLR SCL
250 ; }
251 ; SOURCE LINE # 48
0008 22 252 RET
253 ; END OF StartI2c
254
255 ;
A51 MACRO ASSEMBLER IIC 10/31/2003 02:22:26 PAGE 5
256 ; static void StopI2c()
257
---- 258 RSEG ?PR?StopI2c?IIC
0000 259 StopI2c:
260 ; SOURCE LINE # 50
261 ; {
262 ; SOURCE LINE # 51
263 ; SDA = 0; /*发送结束条件的数据信号*/
264 ; SOURCE LINE # 52
0000 C2B4 265 CLR SDA
266 ; //_nop_();
267 ; SCL = 1; /*结束条件建立时间大于4μs*/
268 ; SOURCE LINE # 54
0002 D2B5 269 SETB SCL
270 ; //_nop_();
271 ; SDA = 1; /*发送I2C总线结束信号*/
272 ; SOURCE LINE # 56
0004 D2B4 273 SETB SDA
274 ; }
275 ; SOURCE LINE # 57
0006 22 276 RET
277 ; END OF StopI2c
278
279 ;
280 ; static bool SendByte(byte value)
281
---- 282 RSEG ?PR?_SendByte?IIC
0000 283 L?0050:
284 USING 0
0000 120000 F 285 LCALL StartI2c
0003 286 _SendByte:
287 USING 0
288 ; SOURCE LINE # 59
289 ;---- Variable 'value?240' assigned to Register 'R7' ----
290 ; {
291 ; SOURCE LINE # 60
292 ; byte idata i;
293 ;
294 ; for(i = 0; i < 8; i++) /*要传送的数据长度为8位*/
295 ; SOURCE LINE # 63
0003 E4 296 CLR A
0004 7800 F 297 MOV R0,#LOW (i?241)
0006 F6 298 MOV @R0,A
0007 299 ?C0003:
0007 7800 F 300 MOV R0,#LOW (i?241)
0009 E6 301 MOV A,@R0
000A FE 302 MOV R6,A
000B C3 303 CLR C
000C 9408 304 SUBB A,#08H
000E 501B 305 JNC ?C0004
306 ; {
307 ; SOURCE LINE # 64
308 ; SCL = 0;
309 ; SOURCE LINE # 65
0010 C2B5 310 CLR SCL
311 ;
312 ; SDA = (value >> (7 - i))&0x01;
313 ; SOURCE LINE # 67
0012 C3 314 CLR C
0013 7407 315 MOV A,#07H
0015 9E 316 SUBB A,R6
0016 FE 317 MOV R6,A
0017 EF 318 MOV A,R7
0018 A806 319 MOV R0,AR6
001A 08 320 INC R0
001B 8002 321 SJMP ?C0049
A51 MACRO ASSEMBLER IIC 10/31/2003 02:22:26 PAGE 6
001D 322 ?C0048:
001D C3 323 CLR C
001E 13 324 RRC A
001F 325 ?C0049:
001F D8FC 326 DJNZ R0,?C0048
0021 13 327 RRC A
0022 92B4 328 MOV SDA,C
329 ; // _nop_();
330 ; SCL = 1; /*置时钟线为高,通知被控器开始接收数据位*/
331 ; SOURCE LINE # 69
0024 D2B5 332 SETB SCL
333 ; // _nop_();
334 ; }
335 ; SOURCE LINE # 71
0026 7800 F 336 MOV R0,#LOW (i?241)
0028 06 337 INC @R0
0029 80DC 338 SJMP ?C0003
002B 339 ?C0004:
340 ;
341 ; SCL = 0;
342 ; SOURCE LINE # 73
002B C2B5 343 CLR SCL
344 ; //_nop_();
345 ; SDA = 1; /*8位发送完后释放数据线,准备接收应答位*/
346 ; SOURCE LINE # 75
002D D2B4 347 SETB SDA
348 ; //_nop_();
349 ; SCL = 1;
350 ; SOURCE LINE # 77
002F D2B5 351 SETB SCL
352 ; _nop_();
353 ; SOURCE LINE # 78
0031 00 354 NOP
355 ; ack = ~SDA;
356 ; SOURCE LINE # 79
0032 A2B4 357 MOV C,SDA
0034 B3 358 CPL C
0035 9200 F 359 MOV ack,C
360 ; //_nop_();
361 ; SCL = 0;
362 ; SOURCE LINE # 81
0037 C2B5 363 CLR SCL
364 ;
365 ; return(ack);
366 ; SOURCE LINE # 83
0039 A200 F 367 MOV C,ack
368 ; }
369 ; SOURCE LINE # 84
003B 370 ?C0006:
003B 22 371 RET
372 ; END OF _SendByte
373
374 ;
375 ; static byte RcvByte()
376
---- 377 RSEG ?PR?RcvByte?IIC
0000 378 RcvByte:
379 USING 0
380 ; SOURCE LINE # 86
381 ; {
382 ; SOURCE LINE # 87
383 ; byte idata i;
384 ; byte idata retc;
385 ;
386 ; retc = 0;
387 ; SOURCE LINE # 91
A51 MACRO ASSEMBLER IIC 10/31/2003 02:22:26 PAGE 7
0000 E4 388 CLR A
0001 7800 F 389 MOV R0,#LOW (retc?343)
0003 F6 390 MOV @R0,A
391 ; SDA = 1; /*置数据线为输入方式*/
392 ; SOURCE LINE # 92
0004 D2B4 393 SETB SDA
394 ;
395 ; for(i = 0; i < 8; i++)
396 ; SOURCE LINE # 94
0006 18 397 DEC R0
0007 F6 398 MOV @R0,A
0008 399 ?C0007:
400 ; {
401 ; SOURCE LINE # 95
402 ; SCL = 0; /*置时钟线为低,准备接收数据位*/
403 ; SOURCE LINE # 96
0008 C2B5 404 CLR SCL
405 ; _nop_(); /*重要的延时wangsw add for emphasis*/
406 ; SOURCE LINE # 97
000A 00 407 NOP
408 ; _nop_();
409 ; SOURCE LINE # 98
000B 00 410 NOP
411 ; SCL = 1; /*置时钟线为高使数据线上数据有效*/
412 ; SOURCE LINE # 99
000C D2B5 413 SETB SCL
414 ; //_nop_();
415 ; retc = retc << 1;
416 ; SOURCE LINE # 101
000E 7800 F 417 MOV R0,#LOW (retc?343)
0010 E6 418 MOV A,@R0
0011 25E0 419 ADD A,ACC
0013 F6 420 MOV @R0,A
421 ; if(SDA)
422 ; SOURCE LINE # 102
0014 30B401 423 JNB SDA,?C0009
424 ; {
425 ; SOURCE LINE # 103
426 ; retc = retc + 1; /*读数据位,接收的数据位放入retc中 */
427 ; SOURCE LINE # 104
0017 06 428 INC @R0
429 ; }
430 ; SOURCE LINE # 105
431 ; }
432 ; SOURCE LINE # 106
0018 433 ?C0009:
0018 7800 F 434 MOV R0,#LOW (i?342)
001A 06 435 INC @R0
001B E6 436 MOV A,@R0
001C B408E9 437 CJNE A,#08H,?C0007
001F 438 ?C0008:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -