📄 i2c.lst
字号:
220 ; SOURCE LINE # 54
0005 00 221 NOP
222 ; _Nop();
223 ; SOURCE LINE # 55
0006 00 224 NOP
225 ; _Nop();
226 ; SOURCE LINE # 56
0007 00 227 NOP
228 ; _Nop();
229 ; SOURCE LINE # 57
0008 00 230 NOP
231 ; _Nop();
232 ; SOURCE LINE # 58
0009 00 233 NOP
234 ; SDA=1; /*发送I2C总线结束信号*/
235 ; SOURCE LINE # 59
000A D2A1 236 SETB SDA
237 ; _Nop();
238 ; SOURCE LINE # 60
000C 00 239 NOP
240 ; _Nop();
241 ; SOURCE LINE # 61
000D 00 242 NOP
243 ; _Nop();
244 ; SOURCE LINE # 62
000E 00 245 NOP
246 ; _Nop();
247 ; SOURCE LINE # 63
000F 00 248 NOP
249 ; }
250 ; SOURCE LINE # 64
0010 22 251 RET
252 ; END OF Stop_I2c
253
254 ;
255 ; /*******************************************************************
256 ; 字节数据发送函数
A51 MACRO ASSEMBLER I2C 09/13/2009 23:31:56 PAGE 5
257 ; 函数原型: void SendByte(UCHAR c);
258 ; 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
259 ; 此状态位进行操作.(不应答或非应答都使ack=0)
260 ; 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
261 ; ********************************************************************/
262 ; void SendByte(unsigned char c)
263
---- 264 RSEG ?PR?_SendByte?I2C
0000 265 _SendByte:
266 USING 0
267 ; SOURCE LINE # 73
268 ;---- Variable 'c?240' assigned to Register 'R7' ----
269 ; {
270 ; SOURCE LINE # 74
271 ; unsigned char BitCnt;
272 ;
273 ; for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
274 ; SOURCE LINE # 77
275 ;---- Variable 'BitCnt?241' assigned to Register 'R6' ----
0000 E4 276 CLR A
0001 FE 277 MOV R6,A
0002 278 ?C0003:
279 ; {
280 ; SOURCE LINE # 78
281 ; if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
282 ; SOURCE LINE # 79
0002 EF 283 MOV A,R7
0003 A806 284 MOV R0,AR6
0005 08 285 INC R0
0006 8002 286 SJMP ?C0020
0008 287 ?C0019:
0008 C3 288 CLR C
0009 33 289 RLC A
000A 290 ?C0020:
000A D8FC 291 DJNZ R0,?C0019
000C 30E704 292 JNB ACC.7,?C0006
000F D2A1 293 SETB SDA
0011 8002 294 SJMP ?C0007
0013 295 ?C0006:
296 ; else SDA=0;
297 ; SOURCE LINE # 80
0013 C2A1 298 CLR SDA
0015 299 ?C0007:
300 ; _Nop();
301 ; SOURCE LINE # 81
0015 00 302 NOP
303 ; SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
304 ; SOURCE LINE # 82
0016 D2A0 305 SETB SCL
306 ; _Nop();
307 ; SOURCE LINE # 83
0018 00 308 NOP
309 ; _Nop(); /*保证时钟高电平周期大于4μs*/
310 ; SOURCE LINE # 84
0019 00 311 NOP
312 ; _Nop();
313 ; SOURCE LINE # 85
001A 00 314 NOP
315 ; _Nop();
316 ; SOURCE LINE # 86
001B 00 317 NOP
318 ; _Nop();
319 ; SOURCE LINE # 87
001C 00 320 NOP
321 ; SCL=0;
322 ; SOURCE LINE # 88
A51 MACRO ASSEMBLER I2C 09/13/2009 23:31:56 PAGE 6
001D C2A0 323 CLR SCL
324 ; }
325 ; SOURCE LINE # 89
001F 0E 326 INC R6
0020 BE08DF 327 CJNE R6,#08H,?C0003
0023 328 ?C0004:
329 ;
330 ; _Nop();
331 ; SOURCE LINE # 91
0023 00 332 NOP
333 ; _Nop();
334 ; SOURCE LINE # 92
0024 00 335 NOP
336 ; SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
337 ; SOURCE LINE # 93
0025 D2A1 338 SETB SDA
339 ; _Nop();
340 ; SOURCE LINE # 94
0027 00 341 NOP
342 ; _Nop();
343 ; SOURCE LINE # 95
0028 00 344 NOP
345 ; SCL=1;
346 ; SOURCE LINE # 96
0029 D2A0 347 SETB SCL
348 ; _Nop();
349 ; SOURCE LINE # 97
002B 00 350 NOP
351 ; _Nop();
352 ; SOURCE LINE # 98
002C 00 353 NOP
354 ; _Nop();
355 ; SOURCE LINE # 99
002D 00 356 NOP
357 ; if(SDA==1)ack=0;
358 ; SOURCE LINE # 100
002E 30A104 359 JNB SDA,?C0008
0031 C200 F 360 CLR ack
0033 8002 361 SJMP ?C0009
0035 362 ?C0008:
363 ; else ack=1; /*判断是否接收到应答信号*/
364 ; SOURCE LINE # 101
0035 D200 F 365 SETB ack
0037 366 ?C0009:
367 ; SCL=0;
368 ; SOURCE LINE # 102
0037 C2A0 369 CLR SCL
370 ; _Nop();
371 ; SOURCE LINE # 103
0039 00 372 NOP
373 ; _Nop();
374 ; SOURCE LINE # 104
003A 00 375 NOP
376 ; }
377 ; SOURCE LINE # 105
003B 22 378 RET
379 ; END OF _SendByte
380
381 ;
382 ; /*******************************************************************
383 ; 字节数据接收函数
384 ; 函数原型: UCHAR RcvByte();
385 ; 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
386 ; 发完后请用应答函数应答从机。
387 ; ********************************************************************/
388 ; unsigned char RcvByte()
A51 MACRO ASSEMBLER I2C 09/13/2009 23:31:56 PAGE 7
389
---- 390 RSEG ?PR?RcvByte?I2C
0000 391 RcvByte:
392 USING 0
393 ; SOURCE LINE # 113
394 ; {
395 ; SOURCE LINE # 114
396 ; unsigned char retc;
397 ; unsigned char BitCnt;
398 ;
399 ; retc=0;
400 ; SOURCE LINE # 118
401 ;---- Variable 'retc?342' assigned to Register 'R7' ----
0000 E4 402 CLR A
0001 FF 403 MOV R7,A
404 ; SDA=1; /*置数据线为输入方式*/
405 ; SOURCE LINE # 119
0002 D2A1 406 SETB SDA
407 ; for(BitCnt=0;BitCnt<8;BitCnt++)
408 ; SOURCE LINE # 120
409 ;---- Variable 'BitCnt?343' assigned to Register 'R6' ----
0004 FE 410 MOV R6,A
0005 411 ?C0011:
412 ; {
413 ; SOURCE LINE # 121
414 ; _Nop();
415 ; SOURCE LINE # 122
0005 00 416 NOP
417 ; SCL=0; /*置时钟线为低,准备接收数据位*/
418 ; SOURCE LINE # 123
0006 C2A0 419 CLR SCL
420 ; _Nop();
421 ; SOURCE LINE # 124
0008 00 422 NOP
423 ; _Nop(); /*时钟低电平周期大于4.7μs*/
424 ; SOURCE LINE # 125
0009 00 425 NOP
426 ; _Nop();
427 ; SOURCE LINE # 126
000A 00 428 NOP
429 ; _Nop();
430 ; SOURCE LINE # 127
000B 00 431 NOP
432 ; _Nop();
433 ; SOURCE LINE # 128
000C 00 434 NOP
435 ; SCL=1; /*置时钟线为高使数据线上数据有效*/
436 ; SOURCE LINE # 129
000D D2A0 437 SETB SCL
438 ; _Nop();
439 ; SOURCE LINE # 130
000F 00 440 NOP
441 ; _Nop();
442 ; SOURCE LINE # 131
0010 00 443 NOP
444 ; retc=retc<<1;
445 ; SOURCE LINE # 132
0011 EF 446 MOV A,R7
0012 25E0 447 ADD A,ACC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -