📄 i2c.lst
字号:
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 + -