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

📄 i2c.lst

📁 1
💻 LST
📖 第 1 页 / 共 2 页
字号:
MPASM  5.06.4                           I2C.ASM   7-27-2007  17:01:58         PAGE  1


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

                      00001 ;***********************************************************
                      00002 ; 
                      00003 ;***********************************************************
                      00004 ;* 本程序为I2C主控方式模块程序              
                      00005 ;* 占用I/O     RC3,RC4                       
                      00006 ;* 使用RAM     2个字节                          
                      00007 ;* 程序包括:                               
                      00008 ;    :I2C_BYTE_READ         ; 读一个字节函数
                      00009 ;    :I2C_BYTE_WRITE        ; 写一个字节函数
                      00010 ;    :I2C_ACK_CHECK         ; I2C 器件接收应答位检测
                      00011 ;    :InitI2C               ; 初始化I2C工作方式
                      00012 ;    :StartI2C              ; 启动I2C总线
                      00013 ;    :StopI2C               ; 停止I2C总线
                      00014 ;    :RstartI2C             ; 重启动I2C总线
                      00015 ;    :RecI2C                ; 允许I2C总线接收
                      00016 ;    :ACKI2C                ; 发送应答位
                      00017 ;    :NACKI2C               ; 发送非应答位
                      00018 ;    :WaitI2C               ; 等待SSPIF置位 
                      00019 ;    :入口参数    I2C_Data,I2C_Addr                
                      00020 ;    :出口参数    I2C_Data
                      00021 ;***********************************************************
                      00022         #include p16f877a.inc        ;定义所用单片机的头文件
                      00001         LIST
                      00002 ; P16F877A.INC  Standard Header File, Version 1.00    Microchip Technology, Inc.
                      00400         LIST
                      00023 ;***********************************************************
                      00024 
  00000020            00025 I2C_Data        EQU     0X20
  00000021            00026 I2C_Addr        EQU     0X21      
  00000022            00027 I2C_DATA_BACK   EQU             0X22
                      00028 
                      00029 
Warning[205]: Found directive in column 1. (ORG)
0000                  00030 ORG     0X0
0000   0000           00031         NOP
0001   1303           00032         BCF             STATUS,RP1;
0002   1683           00033         BSF             STATUS,RP0;
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0003   1006           00034         BCF             TRISB,0;
0004   1283           00035         BCF             STATUS,RP0;
0005   1006           00036         BCF             PORTB,0;
                      00037  
0006   2059           00038     call     InitI2C
                      00039    
0007   1303           00040     BCF         STATUS,RP1;
0008   1283           00041         BCF             STATUS,RP0;
0009   3000           00042     movlw    0x00
000A   00A1           00043     movwf    I2C_Addr    ; 设定要写入的资料的地址    
000B   3039           00044     movlw    0x39
000C   00A0           00045     movwf    I2C_Data    ; 设定欲写入的数据
000D   00A2           00046         movwf    I2C_DATA_BACK;
000E   204B           00047     call     I2C_BYTE_WRITE    ; Write to I2C Device when Address & Data are set OK
000F   203D           00048     call     I2C_ACK_CHECK    ; Check the ACK response, Wait until the Device Acknowledge 
MPASM  5.06.4                           I2C.ASM   7-27-2007  17:01:58         PAGE  2


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

                      00049                               ; Issue !! The subroutine will not return until the device send ACK !!
                      00050                               ; 中文 : 检查 WRITE 的动作是否已完成 !!
                      00051                              ;若 EEPROM 完成写入会开始回应 ACK 
0010   1303           00052     BCF         STATUS,RP1;
0011   1283           00053         BCF             STATUS,RP0;
0012   01A0           00054     clrf    I2C_Data 
0013   3000           00055     movlw    0x00
0014   00A1           00056     movwf    I2C_Addr         ; 设定欲读取的地址
0015   2026           00057     call    I2C_BYTE_READ
0016   0820           00058     movf    I2C_Data,W
0017   0222           00059     SUBWF       I2C_DATA_BACK,W;
0018   1C03           00060         BTFSS   STATUS,C;
0019   2820           00061         GOTO    FAIL;
001A   1303           00062         BCF             STATUS,RP1;
001B   1683           00063         BSF             STATUS,RP0;
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
001C   1006           00064         BCF             TRISB,0;
001D   1283           00065         BCF             STATUS,RP0;
001E   1406           00066         BSF             PORTB,0;
001F   281F           00067         GOTO    $;;
0020                  00068 FAIL
0020   1303           00069         BCF             STATUS,RP1;
0021   1683           00070         BSF             STATUS,RP0;
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0022   1006           00071         BCF             TRISB,0;
0023   1283           00072         BCF             STATUS,RP0;
0024   1006           00073         BCF             PORTB,0;
0025   2825           00074     goto    $
                      00075 
                      00076 
                      00077 
                      00078 ;****************************************************************************
0026                  00079 I2C_BYTE_READ          
                      00080 ;****************************************************************************
                      00081 ;*从I2C_Addr所指定的地址读一个字节数据到I2C_Data
                      00082     
0026   2070           00083     call    StartI2C       ; Set SSPCON2.SEN
0027   208A           00084     call    WaitI2C        ; Wait PIR1,SSPIF
0028   30A0           00085     movlw    B'10100000'   ; Write Command
0029   0093           00086     movwf    SSPBUF
002A   208A           00087     call    WaitI2C        ; Wait PIR1,SSPIF
002B   1283           00088     bcf     STATUS,RP0
002C   0821           00089     movf    I2C_Addr,W     ; The Address you wish to "READ" from
002D   0093           00090     movwf    SSPBUF
002E   208A           00091     call    WaitI2C        ; Wait PIR1,SSPIF
002F   2078           00092     call    RstartI2C      ; Restart Condition !!
0030   208A           00093     call    WaitI2C        ; Wait Until Restart OK !!
0031   30A1           00094     movlw    B'10100001'    ; Write Read Command
0032   0093           00095     movwf    SSPBUF
0033   208A           00096     call    WaitI2C         ; Wait PIR1,SSPIF
0034   2086           00097     call    RecI2C         ; Enable I2C Receive 
0035   208A           00098     call    WaitI2C        ; Wait Until Buffer Received
0036   0813           00099     movf    SSPBUF,W       ; Save to I2C_Data First !!    
MPASM  5.06.4                           I2C.ASM   7-27-2007  17:01:58         PAGE  3


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

0037   00A0           00100     movwf    I2C_Data
0038   207C           00101     call    NACKI2C        ; Initial NACK Response !!
0039   208A           00102     call    WaitI2C        ; Wait until NACK sent out
003A   2074           00103     call    StopI2C        ; Initial STOP Condition 
003B   208A           00104     call    WaitI2C        ; Wait Until STOP Condition Terminated 
003C   0008           00105     return
                      00106 
                      00107 ;****************************************************************************
003D                  00108 I2C_ACK_CHECK            
                      00109 ;****************************************************************************
                      00110 ;*24C01的应答位检查
                      00111     
003D   2070           00112     call    StartI2C        ; Set SSPCON2.SEN  
003E   208A           00113     call    WaitI2C         ; Wait PIR1,SSPIF
003F   30A1           00114     movlw    B'10100001'    ; Read Command
0040   0093           00115     movwf    SSPBUF
0041   208A           00116     call    WaitI2C
0042   1683           00117     bsf     STATUS,RP0
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0043   1F11           00118     btfss    SSPCON2,ACKSTAT    ; Check ACKSTAT bit , 0 = ACK , 1 = NACK
0044   2848           00119     goto    ACK_Return
0045   2074           00120     call    StopI2C
0046   208A           00121     call    WaitI2C
0047   283D           00122     goto    I2C_ACK_CHECK
0048                  00123 ACK_Return:
0048   2074           00124     call    StopI2C        ; Initial STOP Condition 
0049   208A           00125     call    WaitI2C        ; Wait Until STOP Condition Terminated 
004A   0008           00126     return
                      00127 
                      00128 ;****************************************************************************
004B                  00129 I2C_BYTE_WRITE            ; Write a Byte to I2C_Addr with I2C_Data
                      00130 ;****************************************************************************
                      00131 ;*把I2C_Data中的数据写到I2C_Addr所指定的位置
                      00132     
004B   2070           00133     call    StartI2C       ; Set SSPCON2.SEN
004C   208A           00134     call    WaitI2C        ; Wait PIR1,SSPIF
004D   30A0           00135     movlw    B'10100000'    ; Write Command
004E   0093           00136     movwf    SSPBUF
004F   208A           00137     call    WaitI2C
0050   0821           00138     movf    I2C_Addr,W     ; The Address you wish to "READ" from
0051   0093           00139     movwf    SSPBUF
0052   208A           00140     call    WaitI2C
0053   0820           00141     movf    I2C_Data,W    
0054   0093           00142     movwf    SSPBUF
0055   208A           00143     call    WaitI2C
0056   2074           00144     call    StopI2C        ; Initial STOP Condition 
0057   208A           00145     call    WaitI2C        ; Wait Until STOP Condition Terminated 
0058   0008           00146     return
                      00147 
                      00148 ;**********************************************************************
                      00149 ;*以下函数是对I2C初始化及各种状态处理的子函数 
                      00150 ;**********************************************************************
0059                  00151 InitI2C                ;初始化I2C子函数 
MPASM  5.06.4                           I2C.ASM   7-27-2007  17:01:58         PAGE  4


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

                      00152    
0059   1683 1303      00153     banksel    TRISC      
005B   3018           00154     movlw    B'00011000'    ; Initial PortC,bit 3 & 4 as Input
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
005C   0087           00155     movwf    TRISC          ; RC3 = SCL  ,  RC4 = SDA
005D   1283 1303      00156     banksel    PORTC
005F   30FF           00157     movlw    0xFF           ;使I2C总线空闲时,保持高电平
0060   0087           00158     movwf    PORTC
0061   3009           00159     movlw   0x09            ; This gives 100KHz I2C clock @ 4MHz
0062   1683 1303      00160     banksel SSPADD
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0064   0093           00161     movwf   SSPADD
0065   3080           00162     movlw   b'10000000'     ; Disable slew rate control.
0066   1683 1303      00163     banksel SSPSTAT
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0068   0094           00164     movwf   SSPSTAT
0069   3000           00165     movlw   b'00000000'     ;
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
006A   0091           00166     movwf   SSPCON2         ; Setup MSSP for continuous reception.
006B   3028           00167     movlw   b'00101000'     ; Enable MSSP and setup for I2C master
006C   1283 1303      00168     banksel SSPCON          ; mode.
006E   0094           00169     movwf   SSPCON
006F   0008           00170     return
                      00171 
                      00172 
0070                  00173 StartI2C                  ; Initiate the I2C START condition.
0070   1683 1303      00174         banksel SSPCON2
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0072   1411           00175         bsf     SSPCON2,SEN
0073   0008           00176         return
                      00177         
0074                  00178 StopI2C                  ; Initiate the I2C STOP condition.
0074   1683 1303      00179         banksel SSPCON2
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0076   1511           00180         bsf     SSPCON2,PEN
0077   0008           00181         return
                      00182         
0078                  00183 RstartI2C                ; Initiate the I2C restart condition.
0078   1683 1303      00184         banksel SSPCON2
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
007A   1491           00185         bsf     SSPCON2,RSEN
007B   0008           00186         return
                      00187         
007C                  00188 NACKI2C
007C   1683 1303      00189         banksel SSPCON2
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
007E   1691           00190         bsf     SSPCON2,ACKDT    ; Set the ACK bit
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
007F   1611           00191         bsf     SSPCON2,ACKEN    ; Initiate the NACK sequence.
0080   0008           00192         return
                      00193         
0081                  00194 ACKI2C
0081   1683 1303      00195         banksel SSPCON2
MPASM  5.06.4                           I2C.ASM   7-27-2007  17:01:58         PAGE  5


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0083   1291           00196         bcf     SSPCON2,ACKDT    ; Clear the ACK bit
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0084   1611           00197         bsf     SSPCON2,ACKEN    ; Initiate the NACK sequence.
0085   0008           00198         return
                      00199 
0086                  00200 RecI2C
0086   1683 1303      00201         banksel SSPCON2         ;
Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.
0088   1591           00202         bsf     SSPCON2,RCEN    ; Set the receive enable bit.
0089   0008           00203         return
                      00204 
                      00205 
008A                  00206 WaitI2C                         ; Poll for SSPIF
008A   1283 1303      00207         banksel PIR1
008C   1D8C           00208 FLoop   btfss   PIR1,SSPIF
008D   288C           00209         goto    FLoop
008E   118C           00210         bcf     PIR1,SSPIF
008F   0008           00211         return
                      00212 ;********************************************************************
                      00213     end       
MPASM  5.06.4                           I2C.ASM   7-27-2007  17:01:58         PAGE  6


SYMBOL TABLE
  LABEL                             VALUE 

ACKDT                             00000005
ACKEN                             00000004
ACKI2C                            00000081
ACKSTAT                           00000006
ACK_Return                        00000048
ADCON0                            0000001F
ADCON1                            0000009F
ADCS0                             00000006
ADCS1                             00000007
ADCS2                             00000006
ADDEN                             00000003
ADFM                              00000007
ADIE                              00000006
ADIF                              00000006
ADON                              00000000
ADRESH                            0000001E
ADRESL                            0000009E
BCLIE                             00000003
BCLIF                             00000003
BF                                00000000
BRGH                              00000002
C                                 00000000
C1INV                             00000004
C1OUT                             00000006
C2INV                             00000005
C2OUT                             00000007
CCP1CON                           00000017
CCP1IE                            00000002
CCP1IF                            00000002
CCP1M0                            00000000

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -