📄 i2c.asm
字号:
;---------------------------------------------------------------------------
; Terawins Inc. Company Confidential Strictly Private
;
; $Archive: $
; $Revision: 0.9 $
; $Author: Bruce $
; $Date: 2007/02/084 22:34:39 $
;
; --------------------------------------------------------------------------
; >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; --------------------------------------------------------------------------
; Copyright 2007 (c) Terawins Inc.
;
; Functions:
; void StartCondition(void)
; void StopCondition(void)
; uCHAR Send_Byte(uCHAR cData)
; uCHAR Read_Byte(uCHAR cNum)
; void twdWr_Burst_D(uCHAR cData)
;
$NOMOD51
NAME I2C
bSDA_MSB BIT 0E0H.7
P0 DATA 080H
P1 DATA 090H
P2 DATA 0A0H
P3 DATA 0B0H
AC BIT 0D0H.6
T0 BIT 0B0H.4
T1 BIT 0B0H.5
EA BIT 0A8H.7
IE DATA 0A8H
RD BIT 0B0H.7
ES BIT 0A8H.4
IP DATA 0B8H
RI BIT 098H.0
CY BIT 0D0H.7
INT0 BIT 0B0H.2
INT1 BIT 0B0H.3
TI BIT 098H.1
PS BIT 0B8H.4
SP DATA 081H
OV BIT 0D0H.2
WR BIT 0B0H.6
SBUF DATA 099H
PCON DATA 087H
SCON DATA 098H
TMOD DATA 089H
IE0 BIT 088H.1
IE1 BIT 088H.3
B DATA 0F0H
ACC DATA 0E0H
ET0 BIT 0A8H.1
ET1 BIT 0A8H.3
TF0 BIT 088H.5
TF1 BIT 088H.7
RB8 BIT 098H.2
TH0 DATA 08CH
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
EX1 BIT 0A8H.2
TB8 BIT 098H.3
IT1 BIT 088H.2
P BIT 0D0H.0
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
PT0 BIT 0B8H.1
RS0 BIT 0D0H.3
PT1 BIT 0B8H.3
RS1 BIT 0D0H.4
TR0 BIT 088H.4
TR1 BIT 088H.6
SDA BIT 090H.7
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
SCL BIT 090H.6
REN BIT 098H.4
RXD BIT 0B0H.0
TXD BIT 0B0H.1
F0 BIT 0D0H.5
PSW DATA 0D0H
?PR?StartCondition?I2C SEGMENT CODE
?PR?StopCondition?I2C SEGMENT CODE
?PR?_Send_Byte?I2C SEGMENT CODE
?PR?_Read_Byte?I2C SEGMENT CODE
?PR?_twdWr_Burst_D?I2C SEGMENT CODE
PUBLIC _twdWr_Burst_D
PUBLIC _Read_Byte
PUBLIC _Send_Byte
PUBLIC StopCondition
PUBLIC StartCondition
; #pragma SRC
; #include "reg51.h"
; #include "i2c.h"
;
;
; //----------------------------------------
; // Start_Condition for TWD protocol
; //----------------------------------------
;
; void StartCondition(void)
RSEG ?PR?StartCondition?I2C
StartCondition:
USING 0
; uCHAR cTWtrytime=0;
CLR A
MOV R7,A
; EA=0;
CLR EA
?C0001:
; while(++cTWtrytime) {
INC R7
MOV A,R7
JZ ?C0004
SETB SDA
SETB SDA
SETB SCL
SETB SCL
CLR SDA
CLR SDA
JNB SCL,?C0001
JB SDA,?C0001
; }
?C0004:
RET
; END OF StartCondition
;
; //----------------------------------------
; // Stop_Condition for TWD protocol
; //----------------------------------------
; void StopCondition(void)
RSEG ?PR?StopCondition?I2C
StopCondition:
USING 0
; uCHAR cTWtrytime=0;
CLR A
MOV R7,A
; Set_SDA_Low;
CLR SDA
CLR SDA
; Set_SCL_High;
SETB SCL
SETB SCL
?C0005:
; while(SCL_Low && ++cTWtrytime) {};
JB SCL,?C0006
INC R7
MOV A,R7
JNZ ?C0005
?C0006:
; Set_SDA_High;
SETB SDA
SETB SDA
; EA=1;
SETB EA
RET
; END OF StopCondition
;
; //--------------------------------------------------
; // Send_Byte
; // Send a byte to master with a acknowledge bit
; //--------------------------------------------------
; uCHAR Send_Byte(uCHAR cData)
RSEG ?PR?_Send_Byte?I2C
_Send_Byte:
USING 0
; cAcknowledge = 0;
; CLR A
MOV R6,#0
; ACC=cData;
MOV A,R7
; for(ix = 0; ix < 8; ix++)
MOV R7,#0
?C0008:
; {
; Set_SCL_Low;
CLR SCL
CLR SCL
; Setting SDA
RLC A
MOV SDA,C
MOV SDA,C
; Set_SCL_High;
SETB SCL
SETB SCL
; }
; SOURCE LINE # 75
INC R7
CJNE R7,#08H,?C0008
?C0009:
; Set_SCL_Low;
CLR SCL
CLR SCL
; Set_SDA_High; /* release data line for acknowledge */
SETB SDA
SETB SDA
; Set_SCL_High; /* Send a clock for Acknowledge */
SETB SCL
SETB SCL
?C0011:
; while(SCL_Low) { };
JNB SCL,?C0011
?C0012:
;
; if(SDA_High) cAcknowledge = 1; /* No Acknowledge */
JNB SDA,?C0013
MOV R6,#01H
?C0013:
; Set_SCL_Low; /* Finish Acknoledge */
CLR SCL
CLR SCL
; return(cAcknowledge);
MOV R7,AR6
; }
?C0014:
RET
; END OF _Send_Byte
;
;
;
; //--------------------------------------------------
; // Read_Byte
; // Read a byte from master with a acknowledge bit
; //--------------------------------------------------
; uCHAR Read_Byte(uCHAR cNum)
RSEG ?PR?_Read_Byte?I2C
_Read_Byte:
USING 0
; cNum -> 'R1'
MOV R1,AR7
; {
; uCHAR ix; 'R4'
; uCHAR cRetval=0; 'R5'
CLR A
MOV R5,A
;
; for(ix=0;ix<8;ix++){
MOV R4,A
?C0015:
; Set_SCL_High;
SETB SCL
SETB SCL
?C0018:
; while(SCL_Low){};
JNB SCL,?C0018
?C0019:
; cRetval = (SDA_High)? (cRetval|(1<<(7-ix))):cRetval ; /* MSB First */
JNB SDA,?C0020
CLR C
MOV A,#07H
SUBB A,R4
MOV R7,A
MOV A,#01H
MOV R6,#00H
MOV R0,AR7
INC R0
SJMP ?C0032
?C0031:
CLR C
RLC A
XCH A,R6
RLC A
XCH A,R6
?C0032:
DJNZ R0,?C0031
MOV R7,A
MOV A,R5
MOV R3,A
MOV A,R7
ORL A,R3
MOV R7,A
SJMP ?C0021
?C0020:
MOV A,R5
MOV R7,A
?C0021:
MOV R5,AR7
; Set_SCL_Low;
CLR SCL
CLR SCL
; }
INC R4
MOV A,R4
CJNE A,#08H,?C0015
?C0016:
;
; if(cNum==1)
MOV A,R1
CJNE A,#01H,?C0022
; Set_SDA_High;
SETB SDA
SETB SDA
SJMP ?C0023
?C0022:
; else
; Set_SDA_Low;
CLR SDA
CLR SDA
?C0023:
; Set_SCL_High;
SETB SCL
SETB SCL
?C0024:
; while(SCL_Low){};
JNB SCL,?C0024
?C0025:
; Set_SCL_Low;
CLR SCL
CLR SCL
; Set_SDA_High;
SETB SDA
SETB SDA
; return cRetval;
MOV R7,AR5
; }
?C0026:
RET
; END OF _Read_Byte
;
; =============================================================================
; void twdWr_Burst_D(uCHAR cData)
; =============================================================================
RSEG ?PR?_twdWr_Burst_D?I2C
_twdWr_Burst_D:
USING 0
; {
; ACC=cData;
MOV A,R7
?C0027:
; { send 8bit from MSB to LSB
; Set_SCL2Low;
CLR SCL
; Setting SDA (Data bit-7)
RLC A
MOV SDA,C
NOP
; Setup SCL to high
SETB SCL
; Bit-6
RLC A
CLR SCL
MOV SDA,C
SETB SCL
NOP
; Bit-5
RLC A
CLR SCL
MOV SDA,C
SETB SCL
NOP
; Bit-4
RLC A
CLR SCL
MOV SDA,C
SETB SCL
NOP
; Bit-3
RLC A
CLR SCL
MOV SDA,C
SETB SCL
NOP
; Bit-2
RLC A
CLR SCL
MOV SDA,C
SETB SCL
NOP
; Bit-1
RLC A
CLR SCL
MOV SDA,C
SETB SCL
NOP
; Bit-0
RLC A
CLR SCL
MOV SDA,C
SETB SCL
NOP
; }
?C0028:
; Set_SCL2Low;
NOP
CLR SCL
NOP
NOP
; Set_SDA2High; /* release data line for acknowledge */
SETB SDA
NOP
NOP
; Set_SCL2High; /* Send a clock for Acknowledge */
SETB SCL
NOP
NOP
; Set_SCL2Low; /* Finish Acknoledge */
CLR SCL
NOP
; }
RET
; END OF _twdWr_Burst_D
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -