⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iic.ls1

📁 一个完整的51单片机的操作糸统源程序! 内容十分丰富!很有借鉴价值!
💻 LS1
📖 第 1 页 / 共 5 页
字号:
                     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 + -