📄 iic.src
字号:
; .\iic.SRC generated from: ..\SourceFile\iic.c
; COMPILER INVOKED BY:
; C:\Program Files\Keil\C51\BIN\C51.EXE ..\SourceFile\iic.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\iic.lst) SRC(.\iic.SRC)
$NOMOD51
NAME IIC
P0 DATA 080H
P1 DATA 090H
P2 DATA 0A0H
P3 DATA 0B0H
T0 BIT 0B0H.4
AC BIT 0D0H.6
T1 BIT 0B0H.5
T2 BIT 090H.0
EA BIT 0A8H.7
IE DATA 0A8H
EXF2 BIT 0C8H.6
RD BIT 0B0H.7
ES BIT 0A8H.4
IP DATA 0B8H
RI BIT 098H.0
INT0 BIT 0B0H.2
CY BIT 0D0H.7
TI BIT 098H.1
INT1 BIT 0B0H.3
RCAP2H DATA 0CBH
PS BIT 0B8H.4
SP DATA 081H
T2EX BIT 090H.1
OV BIT 0D0H.2
RCAP2L DATA 0CAH
C_T2 BIT 0C8H.1
WR BIT 0B0H.6
RCLK BIT 0C8H.5
TCLK BIT 0C8H.4
SBUF DATA 099H
PCON DATA 087H
SCON DATA 098H
TMOD DATA 089H
TCON DATA 088H
IE0 BIT 088H.1
IE1 BIT 088H.3
AUXR DATA 08EH
B DATA 0F0H
CP_RL2 BIT 0C8H.0
ACC DATA 0E0H
ET0 BIT 0A8H.1
ET1 BIT 0A8H.3
TF0 BIT 088H.5
ET2 BIT 0A8H.5
TF1 BIT 088H.7
TF2 BIT 0C8H.7
RB8 BIT 098H.2
TH0 DATA 08CH
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
TB8 BIT 098H.3
EX1 BIT 0A8H.2
IT1 BIT 088H.2
TH2 DATA 0CDH
P BIT 0D0H.0
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
TL2 DATA 0CCH
PT0 BIT 0B8H.1
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
PT2 BIT 0B8H.5
TR0 BIT 088H.4
RS1 BIT 0D0H.4
TR1 BIT 088H.6
SDA BIT 0B0H.4
TR2 BIT 0C8H.2
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
IPH DATA 0B7H
SCL BIT 0B0H.5
EXEN2 BIT 0C8H.3
REN BIT 098H.4
T2MOD DATA 0C9H
T2CON DATA 0C8H
SADEN DATA 0B9H
RXD BIT 0B0H.0
SADDR DATA 0A9H
CKCON DATA 08FH
TXD BIT 0B0H.1
AUXR1 DATA 0A2H
F0 BIT 0D0H.5
PSW DATA 0D0H
?PR?StartI2c?IIC SEGMENT CODE
?PR?StopI2c?IIC SEGMENT CODE
?PR?_SendByte?IIC SEGMENT CODE
?PR?RcvByte?IIC SEGMENT CODE
?PR?AckI2c?IIC SEGMENT CODE
?BI?AckI2c?IIC SEGMENT BIT OVERLAYABLE
?PR?_iic_send_byte?IIC SEGMENT CODE
?PR?_iic_rcv_byte?IIC SEGMENT CODE
?PR?_iic_send_str?IIC SEGMENT CODE
?XD?_iic_send_str?IIC SEGMENT XDATA OVERLAYABLE
?PR?_iic_rcv_str?IIC SEGMENT CODE
?XD?_iic_rcv_str?IIC SEGMENT XDATA OVERLAYABLE
?PR?_iiv_send_long_str?IIC SEGMENT CODE
?XD?_iiv_send_long_str?IIC SEGMENT XDATA OVERLAYABLE
?PR?_iic_rcv_long_str?IIC SEGMENT CODE
?XD?_iic_rcv_long_str?IIC SEGMENT XDATA OVERLAYABLE
?BI?IIC SEGMENT BIT
?ID?_SendByte?IIC SEGMENT IDATA OVERLAYABLE
?ID?RcvByte?IIC SEGMENT IDATA OVERLAYABLE
?ID?_iic_send_str?IIC SEGMENT IDATA OVERLAYABLE
?ID?_iic_rcv_str?IIC SEGMENT IDATA OVERLAYABLE
?ID?_iiv_send_long_str?IIC SEGMENT IDATA OVERLAYABLE
?ID?_iic_rcv_long_str?IIC SEGMENT IDATA OVERLAYABLE
EXTRN CODE (?C?CLDPTR)
EXTRN CODE (?C?CSTPTR)
PUBLIC ack
PUBLIC ?_iic_rcv_long_str?BYTE
PUBLIC _iic_rcv_long_str
PUBLIC ?_iiv_send_long_str?BYTE
PUBLIC _iiv_send_long_str
PUBLIC ?_iic_rcv_str?BYTE
PUBLIC _iic_rcv_str
PUBLIC ?_iic_send_str?BYTE
PUBLIC _iic_send_str
PUBLIC _iic_rcv_byte
PUBLIC _iic_send_byte
RSEG ?XD?_iic_rcv_str?IIC
?_iic_rcv_str?BYTE:
SlaveAddress?854: DS 1
address?855: DS 1
source?856: DS 3
len?857: DS 1
RSEG ?XD?_iiv_send_long_str?IIC
?_iiv_send_long_str?BYTE:
SlaveAddress?959: DS 1
address?960: DS 2
source?961: DS 3
len?962: DS 1
RSEG ?XD?_iic_rcv_long_str?IIC
?_iic_rcv_long_str?BYTE:
SlaveAddress?1064: DS 1
address?1065: DS 2
source?1066: DS 3
len?1067: DS 1
RSEG ?XD?_iic_send_str?IIC
?_iic_send_str?BYTE:
SlaveAddress?749: DS 1
address?750: DS 1
source?751: DS 3
len?752: DS 1
RSEG ?BI?AckI2c?IIC
?AckI2c?BIT:
bFlag?444: DBIT 1
RSEG ?BI?IIC
ack: DBIT 1
RSEG ?ID?_SendByte?IIC
i?241: DS 1
RSEG ?ID?RcvByte?IIC
i?342: DS 1
RSEG ?ID?RcvByte?IIC
retc?343: DS 1
RSEG ?ID?_iic_send_str?IIC
i?753: DS 1
RSEG ?ID?_iic_rcv_str?IIC
i?858: DS 1
RSEG ?ID?_iiv_send_long_str?IIC
i?963: DS 1
RSEG ?ID?_iic_rcv_long_str?IIC
i?1068: DS 1
; /*************************************************/
;
; /*****************I2C串行总线********************/
;
; /****************2003年1月15日*******************/
;
; /************WROTE BY ZLGMCU********************/
;
; /************MODIFY BY WANGSW********************/
;
;
;
; #include <intrins.h>
; #include "reg52x2.h" /*头文件的包含*/
;
; #include "define.h"
; #include "interrupt.h"
; #include "iic.h"
;
;
; /*端口位定义*/
; sbit SDA=P3^4; /*模拟I2C数据传送位*/
; sbit SCL=P3^5; /*模拟I2C时钟控制位*/
;
; /*状态标志*/
; bool ack; /*应答标志位*/
;
; static void StartI2c(void);
; static void StopI2c(void);
; static bool SendByte(byte value);
; static byte RcvByte(void);
; static void AckI2c(bool bFlag);
;
;
; /**********************************************************************/
;
;
;
; static void StartI2c()
RSEG ?PR?StartI2c?IIC
StartI2c:
; SOURCE LINE # 39
; {
; SOURCE LINE # 40
; SDA = 1; /*发送起始条件的数据信号*/
; SOURCE LINE # 41
SETB SDA
; //_nop_();
; SCL = 1;
; SOURCE LINE # 43
SETB SCL
; //_nop_();
; SDA = 0; /*发送起始信号*/
; SOURCE LINE # 45
CLR SDA
; //_nop_();
; SCL = 0; /*钳住I2C总线,准备发送或接收数据 */
; SOURCE LINE # 47
CLR SCL
; }
; SOURCE LINE # 48
RET
; END OF StartI2c
;
; static void StopI2c()
RSEG ?PR?StopI2c?IIC
StopI2c:
; SOURCE LINE # 50
; {
; SOURCE LINE # 51
; SDA = 0; /*发送结束条件的数据信号*/
; SOURCE LINE # 52
CLR SDA
; //_nop_();
; SCL = 1; /*结束条件建立时间大于4μs*/
; SOURCE LINE # 54
SETB SCL
; //_nop_();
; SDA = 1; /*发送I2C总线结束信号*/
; SOURCE LINE # 56
SETB SDA
; }
; SOURCE LINE # 57
RET
; END OF StopI2c
;
; static bool SendByte(byte value)
RSEG ?PR?_SendByte?IIC
L?0050:
USING 0
LCALL StartI2c
_SendByte:
USING 0
; SOURCE LINE # 59
;---- Variable 'value?240' assigned to Register 'R7' ----
; {
; SOURCE LINE # 60
; byte idata i;
;
; for(i = 0; i < 8; i++) /*要传送的数据长度为8位*/
; SOURCE LINE # 63
CLR A
MOV R0,#LOW (i?241)
MOV @R0,A
?C0003:
MOV R0,#LOW (i?241)
MOV A,@R0
MOV R6,A
CLR C
SUBB A,#08H
JNC ?C0004
; {
; SOURCE LINE # 64
; SCL = 0;
; SOURCE LINE # 65
CLR SCL
;
; SDA = (value >> (7 - i))&0x01;
; SOURCE LINE # 67
CLR C
MOV A,#07H
SUBB A,R6
MOV R6,A
MOV A,R7
MOV R0,AR6
INC R0
SJMP ?C0049
?C0048:
CLR C
RRC A
?C0049:
DJNZ R0,?C0048
RRC A
MOV SDA,C
; // _nop_();
; SCL = 1; /*置时钟线为高,通知被控器开始接收数据位*/
; SOURCE LINE # 69
SETB SCL
; // _nop_();
; }
; SOURCE LINE # 71
MOV R0,#LOW (i?241)
INC @R0
SJMP ?C0003
?C0004:
;
; SCL = 0;
; SOURCE LINE # 73
CLR SCL
; //_nop_();
; SDA = 1; /*8位发送完后释放数据线,准备接收应答位*/
; SOURCE LINE # 75
SETB SDA
; //_nop_();
; SCL = 1;
; SOURCE LINE # 77
SETB SCL
; _nop_();
; SOURCE LINE # 78
NOP
; ack = ~SDA;
; SOURCE LINE # 79
MOV C,SDA
CPL C
MOV ack,C
; //_nop_();
; SCL = 0;
; SOURCE LINE # 81
CLR SCL
;
; return(ack);
; SOURCE LINE # 83
MOV C,ack
; }
; SOURCE LINE # 84
?C0006:
RET
; END OF _SendByte
;
; static byte RcvByte()
RSEG ?PR?RcvByte?IIC
RcvByte:
USING 0
; SOURCE LINE # 86
; {
; SOURCE LINE # 87
; byte idata i;
; byte idata retc;
;
; retc = 0;
; SOURCE LINE # 91
CLR A
MOV R0,#LOW (retc?343)
MOV @R0,A
; SDA = 1; /*置数据线为输入方式*/
; SOURCE LINE # 92
SETB SDA
;
; for(i = 0; i < 8; i++)
; SOURCE LINE # 94
DEC R0
MOV @R0,A
?C0007:
; {
; SOURCE LINE # 95
; SCL = 0; /*置时钟线为低,准备接收数据位*/
; SOURCE LINE # 96
CLR SCL
; _nop_(); /*重要的延时wangsw add for emphasis*/
; SOURCE LINE # 97
NOP
; _nop_();
; SOURCE LINE # 98
NOP
; SCL = 1; /*置时钟线为高使数据线上数据有效*/
; SOURCE LINE # 99
SETB SCL
; //_nop_();
; retc = retc << 1;
; SOURCE LINE # 101
MOV R0,#LOW (retc?343)
MOV A,@R0
ADD A,ACC
MOV @R0,A
; if(SDA)
; SOURCE LINE # 102
JNB SDA,?C0009
; {
; SOURCE LINE # 103
; retc = retc + 1; /*读数据位,接收的数据位放入retc中 */
; SOURCE LINE # 104
INC @R0
; }
; SOURCE LINE # 105
; }
; SOURCE LINE # 106
?C0009:
MOV R0,#LOW (i?342)
INC @R0
MOV A,@R0
CJNE A,#08H,?C0007
?C0008:
; SCL = 0;
; SOURCE LINE # 107
CLR SCL
;
; return(retc);
; SOURCE LINE # 109
MOV R0,#LOW (retc?343)
MOV A,@R0
MOV R7,A
; }
; SOURCE LINE # 110
?C0011:
RET
; END OF RcvByte
;
; static void AckI2c(bool bFlag)
RSEG ?PR?AckI2c?IIC
L?0051:
USING 0
MOV A,R7
LCALL ?C?CSTPTR
CLR ?AckI2c?BIT
AckI2c:
; SOURCE LINE # 112
; {
; SOURCE LINE # 113
; SDA = bFlag;
; SOURCE LINE # 114
MOV C,bFlag?444
MOV SDA,C
; //_nop_();
; SCL = 1;
; SOURCE LINE # 116
SETB SCL
; //_nop_();
; SCL = 0; /*清时钟线,钳住I2C总线以便继续接收*/
; SOURCE LINE # 118
CLR SCL
; }
; SOURCE LINE # 119
RET
; END OF AckI2c
;
;
; /***************************************************************/
;
;
; extern bool iic_send_byte(byte SlaveAddress, byte value)
RSEG ?PR?_iic_send_byte?IIC
_iic_send_byte:
USING 0
; SOURCE LINE # 125
;---- Variable 'value?546' assigned to Register 'R5' ----
;---- Variable 'SlaveAddress?545' assigned to Register 'R7' ----
; {
; SOURCE LINE # 126
; StartI2c(); /*启动总线*/
; SOURCE LINE # 127
;
; if(!SendByte(SlaveAddress)) /*发送器件地址*/
; SOURCE LINE # 129
LCALL L?0050
JC ?C0013
; {
; SOURCE LINE # 130
; return(FALSE);
; SOURCE LINE # 131
RET
; }
; SOURCE LINE # 132
?C0013:
;
; if(!SendByte(value)) /*发送数据*/
; SOURCE LINE # 134
MOV R7,AR5
LCALL _SendByte
JC ?C0015
; {
; SOURCE LINE # 135
; return(FALSE);
; SOURCE LINE # 136
RET
; }
; SOURCE LINE # 137
?C0015:
;
; StopI2c(); /*结束总线*/
; SOURCE LINE # 139
LCALL StopI2c
;
; return(TRUE);
; SOURCE LINE # 141
SETB C
; }
; SOURCE LINE # 142
?C0014:
RET
; END OF _iic_send_byte
;
;
;
; extern bool iic_rcv_byte(byte SlaveAddress, byte value)
RSEG ?PR?_iic_rcv_byte?IIC
_iic_rcv_byte:
USING 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -