📄 bus.a51
字号:
; BUS.A51 generated from: BUS.C
$NOMOD51
NAME BUS
P0 DATA 080H
P1 DATA 090H
SDAPin BIT 090H.6
P2 DATA 0A0H
P3 DATA 0B0H
T0 BIT 0B0H.4
AC BIT 0D0H.6
T1 BIT 0B0H.5
LED_G_Pin BIT 080H.1
EA BIT 0A8H.7
SCLPin BIT 090H.7
LED_O_Pin BIT 080H.0
IE DATA 0A8H
RIGHT_BUT_PIN BIT 090H.2
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
PS BIT 0B8H.4
SP DATA 081H
POWER_BUT_PIN BIT 090H.4
OV BIT 0D0H.2
WR BIT 0B0H.6
ResetPin BIT 0A0H.0
SBUF DATA 099H
PCON DATA 087H
SCON DATA 098H
TMOD DATA 089H
TCON DATA 088H
IE0 BIT 088H.1
IE1 BIT 088H.3
LEFT_BUT_PIN BIT 090H.3
B DATA 0F0H
ACC DATA 0E0H
BrightnessPin BIT 0B0H.5
ET0 BIT 0A8H.1
ET1 BIT 0A8H.3
TF0 BIT 088H.5
MENU_BUT_PIN BIT 090H.1
TF1 BIT 088H.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
AUTO_BUT_PIN BIT 090H.0
P BIT 0D0H.0
WPPin BIT 090H.5
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
PT0 BIT 0B8H.1
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
TR0 BIT 088H.4
RS1 BIT 0D0H.4
TR1 BIT 088H.6
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
REN BIT 098H.4
VGA_CON_PIN BIT 0A0H.5
RXD BIT 0B0H.0
TXD BIT 0B0H.1
PANEL_BKL_PIN BIT 0A0H.3
F0 BIT 0D0H.5
PANEL_VCC_PIN BIT 0A0H.2
PSW DATA 0D0H
?PR?_GoI2CMaster?BUS SEGMENT CODE
?DT?_GoI2CMaster?BUS SEGMENT DATA OVERLAYABLE
?PR?_SendI2CByte?BUS SEGMENT CODE
?PR?_RcvI2CByte?BUS SEGMENT CODE
?DT?_RcvI2CByte?BUS SEGMENT DATA OVERLAYABLE
?PR?SendI2CStop?BUS SEGMENT CODE
?PR?BitDly?BUS SEGMENT CODE
?DT?BUS SEGMENT DATA
EXTRN CODE (SendByte)
EXTRN BIT (BusFault)
EXTRN BIT (NoAck)
EXTRN BIT (BusBusy)
PUBLIC BitCnt
PUBLIC BitDly
PUBLIC SendI2CStop
PUBLIC _RcvI2CByte
PUBLIC _SendI2CByte
PUBLIC _GoI2CMaster
RSEG ?DT?_GoI2CMaster?BUS
?_GoI2CMaster?BYTE:
adr?040: DS 1
RSEG ?DT?_RcvI2CByte?BUS
?_RcvI2CByte?BYTE:
bval?243: DS 1
RSEG ?DT?BUS
BitCnt: DS 1
; /************************************************
; * *
; * BUS.C: BUS control routines. *
; * *
; *************************************************/
; #include <reg51.h>
; #include <intrins.h>
; #include "mosaic.h"
; #include "BUSIO.h"
; #include "OSD.h"
; #include "global.h"
;
;
;
;
;
; /*******************************************************************
; * Send SCL pin high and wait for any clock stretching peripherals *
; ********************************************************************/
; #if 1
; #define SCLHigh(a) { SCLPin = 1; while(!SCLPin) {}; }
; #define SCLHigh2(a) { SCLPin2 = 1; while(!SCLPin2) {}; }
; #else
; void SCLHigh(void)
; {
; SCLPin = 1; while(!SCLPin) {};
; }
; void SCLHigh2(void)
; {
; SCLPin2 = 1; while(!SCLPin2) {};
; }
; #endif
;
;
; #if USE_I2CBUS
; /********************************************************
; * Grasp the I2C bus, send slave address and command *
; *********************************************************/
; void GoI2CMaster(unsigned char adr)
RSEG ?PR?_GoI2CMaster?BUS
USING 0
_GoI2CMaster:
MOV adr?040,R7
; SOURCE LINE # 39
; {
; SOURCE LINE # 40
; //Indicate that I2C frame is in progress.
; BusBusy = 1;
; SOURCE LINE # 42
SETB BusBusy
;
; if (!SCLPin) SCLHigh();
; SOURCE LINE # 44
JB SCLPin,?C0001
SETB SCLPin
?C0002:
JNB SCLPin,?C0002
?C0001:
;
; //Clear error status flags.
; NoAck = 0; BusFault = 0;
; SOURCE LINE # 47
CLR NoAck
CLR BusFault
;
; if (SCLPin & SDAPin) {
; SOURCE LINE # 49
MOV C,SDAPin
ANL C,SCLPin
JNC ?C0004
; // begin I2C start.
; SDAPin = 0; BitDly();
; SOURCE LINE # 51
CLR SDAPin
LCALL BitDly
; SCLPin = 0; //BitDly();
; SOURCE LINE # 52
CLR SCLPin
; _nop_(); _nop_();
; SOURCE LINE # 53
NOP
NOP
; // send slave address.
; SendI2CByte(adr);
; SOURCE LINE # 55
MOV R7,adr?040
LCALL _SendI2CByte
; } else
; SOURCE LINE # 56
RET
?C0004:
; BusFault = 1;
; SOURCE LINE # 57
SETB BusFault
; }
; SOURCE LINE # 58
?C0006:
RET
; END OF _GoI2CMaster
;
;
; #if 1
;
; unsigned char data BitCnt;
; void SendByte();
;
; /*********************************************
; * Send one byte of data to an I2C device *
; **********************************************/
; void SendI2CByte(unsigned char val)
RSEG ?PR?_SendI2CByte?BUS
USING 0
_SendI2CByte:
;---- Variable 'val?141' assigned to Register 'R7' ----
; SOURCE LINE # 69
; {
; SOURCE LINE # 70
; ACC = val;
; SOURCE LINE # 71
MOV A,R7
; SendByte();
; SOURCE LINE # 72
LCALL SendByte
; #pragma asm
; MOV ACC,#0
MOV ACC,#0
;
; #pragma endasm
; }
; SOURCE LINE # 77
RET
; END OF _SendI2CByte
;
; #else
;
; /*********************************************
; * Send one byte of data to an I2C device *
; **********************************************/
; void SendI2CByte(unsigned char val)
; {
; unsigned char bmsk = 0x80;
;
; while (bmsk) {
; SDAPin = (val & bmsk) ? 0x01 : 0x00;
; _nop_(); _nop_();
; SCLHigh(); //BitDly();
; _nop_(); _nop_();
; bmsk >>= 1;
; SCLPin = 0; //BitDly();
; _nop_(); _nop_();
; }
;
; //Release data line for acknowledge.
; SDAPin = 1;
; _nop_(); _nop_();
; SCLHigh(); //BitDly();
; _nop_(); _nop_();
; //Check for valid acknowledge bit.
; if (SDAPin) NoAck = 1;
; _nop_(); _nop_();
; SCLPin = 0; //BitDly();
; _nop_(); _nop_();
; }
;
; #endif
;
; /*********************************************
; * Receive byte of data from an I2C device *
; **********************************************/
; unsigned char RcvI2CByte(unsigned char cnt)
RSEG ?PR?_RcvI2CByte?BUS
USING 0
_RcvI2CByte:
;---- Variable 'cnt?242' assigned to Register 'R7' ----
; SOURCE LINE # 115
; {
; SOURCE LINE # 116
; unsigned char bval = 0, b;
; SOURCE LINE # 117
CLR A
MOV bval?243,A
;
; for(b=0; b < 8; b++) {
; SOURCE LINE # 119
;---- Variable 'b?244' assigned to Register 'R6' ----
MOV R6,A
?C0008:
; SCLHigh(); //BitDly();
; SOURCE LINE # 120
SETB SCLPin
?C0011:
JNB SCLPin,?C0011
?C0012:
; _nop_(); _nop_();
; SOURCE LINE # 121
NOP
NOP
; bval <<= 1;
; SOURCE LINE # 122
MOV A,bval?243
ADD A,ACC
MOV bval?243,A
; bval |= SDAPin;
; SOURCE LINE # 123
MOV C,SDAPin
CLR A
RLC A
ORL bval?243,A
; SCLPin = 0; //BitDly();
; SOURCE LINE # 124
CLR SCLPin
; _nop_(); _nop_();
; SOURCE LINE # 125
NOP
NOP
; }
; SOURCE LINE # 126
INC R6
CJNE R6,#08H,?C0008
?C0009:
;
; SDAPin = (cnt==1) ? 1 : 0;
; SOURCE LINE # 128
CJNE R7,#01H,?C0013
SETB C
SJMP ?C0014
?C0013:
CLR C
?C0014:
MOV SDAPin,C
; _nop_(); _nop_();
; SOURCE LINE # 129
NOP
NOP
; SCLHigh();
; SOURCE LINE # 130
SETB SCLPin
?C0015:
JNB SCLPin,?C0015
?C0016:
; ////M2
; BitDly(); BitDly();
; SOURCE LINE # 132
LCALL BitDly
LCALL BitDly
; ////M2
;
; SCLPin = 0;
; SOURCE LINE # 135
CLR SCLPin
; _nop_(); _nop_();
; SOURCE LINE # 136
NOP
NOP
; SDAPin = 1; //Clear acknowledge bit.
; SOURCE LINE # 137
SETB SDAPin
; ////M2
; BitDly(); BitDly();
; SOURCE LINE # 139
LCALL BitDly
LCALL BitDly
; ////M2
;
; return bval;
; SOURCE LINE # 142
MOV R7,bval?243
; }
; SOURCE LINE # 143
?C0017:
RET
; END OF _RcvI2CByte
;
; /*************************************
; * Send I2C STOP, release bus *
; **************************************/
; void SendI2CStop(void)
RSEG ?PR?SendI2CStop?BUS
USING 0
SendI2CStop:
; SOURCE LINE # 148
; {
; SOURCE LINE # 149
; SDAPin = 0; BitDly();
; SOURCE LINE # 150
CLR SDAPin
LCALL BitDly
; SCLHigh(); BitDly();
; SOURCE LINE # 151
SETB SCLPin
?C0018:
JNB SCLPin,?C0018
?C0019:
LCALL BitDly
; SDAPin = 1; //BitDly();
; SOURCE LINE # 152
SETB SDAPin
; _nop_(); _nop_();
; SOURCE LINE # 153
NOP
NOP
; BusBusy = 0;
; SOURCE LINE # 154
CLR BusBusy
; }
; SOURCE LINE # 155
RET
; END OF SendI2CStop
; #endif //USE_I2CBUS
;
;
; #if USE_I2C_2
;
; /********************************************************
; * Grasp the I2C bus, send slave address and command *
; *********************************************************/
; void GoI2CMaster2(unsigned char adr)
; {
; //Indicate that I2C frame is in progress.
; BusBusy = 1;
;
; if (!SCLPin2) SCLHigh2();
;
; //Clear error status flags.
; NoAck = 0; BusFault = 0;
;
; if(SCLPin2 & SDAPin2) {
; // Begin I2C start.
; SDAPin2 = 0; BitDly();
; SCLPin2 = 0; //BitDly();
; //Get slave address.
; SendI2CByte2(adr);
; } else
; BusFault = 1;
; }
;
; /*********************************************
; * Send one byte of data to an I2C device *
; **********************************************/
; void SendI2CByte2(unsigned char val)
; {
; unsigned char bmsk = 0x80;
;
; while (bmsk) {
; SDAPin2 = (val & bmsk) ? 0x01 : 0x00;
; SCLHigh2(); //BitDly();
; bmsk >>= 1;
; SCLPin2 = 0; //BitDly();
; }
;
; //Release data line for acknowledge.
; SDAPin2 = 1;
; SCLHigh2(); //BitDly();
;
; //Check for valid acknowledge bit.
; if (SDAPin2) NoAck = 1;
;
; SCLPin2 = 0; //BitDly();
; }
;
; /*********************************************
; * Receive byte of data from an I2C device *
; **********************************************/
; unsigned char RcvI2CByte2(unsigned char cnt)
; {
; unsigned char bval = 0, b;
;
; for(b=0; b < 8; b++) {
; SCLHigh2(); //BitDly();
; bval <<= 1;
; bval |= SDAPin2;
; SCLPin2 = 0; //BitDly();
; }
;
; SDAPin2 = (cnt==1) ? 1 : 0;
;
; SCLHigh2(); //BitDly();
; SCLPin2 = 0;
; SDAPin2 = 1; //BitDly(); //Clear acknowledge bit.
;
; return bval;
; }
;
; /*************************************
; * Send I2C STOP, release bus *
; **************************************/
; void SendI2CStop2(void)
; {
; SDAPin2 = 0; BitDly();
; SCLHigh2(); BitDly();
; SDAPin2 = 1; //BitDly();
;
; BusBusy = 0;
; }
;
; #endif //USE_I2C_2
;
;
; #if USE_SPIBUS
; /*********************************************
; * Send one byte of data to an SPI device *
; **********************************************/
; void SendSPIByte(unsigned char val)
; {
; OutByte = val;
; #pragma asm
; MOV BitCnt,#8 ;Set bit count.
; MOV A,OutByte
;
; SSPIBL: RLC A ;Send one data bit.
; MOV SDAPin,C ;Put data bit on pin.
; ACALL SCLHigh ;Send clock.
; ACALL BitDly
; CLR SCLPin
; ACALL BitDly
; DJNZ BitCnt,SSPIBL ;Repeat until all bits sent.
; RET
; #pragma endasm
; }
;
; /*********************************************
; * Receive byte of data from an SPI device *
; **********************************************/
; unsigned char RcvSPIByte(void)
; {
; #pragma asm
; MOV BitCnt,#8 ;Set bit count.
;
; RSPIBL: ACALL SCLHigh ;Read one data bit.
; ACALL BitDly
; MOV C,SDAPin ;Get data bit from pin.
; RLC A ;Rotate bit into result byte.
; CLR SCLPin
; ACALL BitDly
; DJNZ BitCnt,RSPIBL ;Repeat until all bits received.
;
; MOV InByte,A ;return received data
; #pragma endasm
;
; return(InByte);
; }
;
; /****************************************************
; * Grasp the SPI bus, send phase bit and command *
; *****************************************************/
; void SPIStart(unsigned char mode)
; {
; PhaseBit = mode;
; #pragma asm
; SETB BusBusy ;Indicate that SPI frame is in progress.
; CLR BusFault ;
;
; JNB SEPin,SPIFt ;Check for bus clear.
; JNB SCLPin,SPIFt ;
; JNB SDAPin,SPIFt ;
;
; CLR SEPin ;Start SPI Bus.
; NOP ;
;
; MOV A,PhaseBit ;Select process mode
; CJNE A,#1,SPIWR ;
; SETB SDAPin ;Read Mode.
; SJMP SPIMODE ;
; SPIWR: CLR SDAPin ;Write Mode.
; SPIMODE: ACALL BitDly ;
; CLR SCLPin ;Make a SCL pulse for Write mode.
; ACALL BitDly ;
; ACALL SCLHigh ;
; ACALL BitDly ;
; CLR SCLPin ;
; RET ;
;
; SPIFt: SETB BusFault ;Set fault status
; #pragma endasm
; }
;
; /****************************************************
; * Release the SPI bus *
; *****************************************************/
; void SPIStop(void)
; {
; #pragma asm
; CLR BusBusy ;Indicate that SPI frame is released.
; SETB SEPin ;Stop SPI Bus.
; SETB SCLPin ;Stop SPI Bus.
; SETB SDAPin ;Stop SPI Bus.
; RET
; #pragma endasm
; }
; #endif
;
; /***********************************************************
; * delay routine, delay timing may need to change later *
; ************************************************************/
; #define BITDELAY (2*CPUCLOCK/12)
;
; void BitDly(void)
RSEG ?PR?BitDly?BUS
USING 0
BitDly:
; SOURCE LINE # 344
; {
; SOURCE LINE # 345
; int val = BITDELAY;
; SOURCE LINE # 346
;---- Variable 'val?445' assigned to Register 'R6/R7' ----
MOV R7,#02H
MOV R6,#00H
?C0021:
;
; while(val--) {}
; SOURCE LINE # 348
MOV A,R7
DEC R7
MOV R4,AR6
JNZ ?C0024
DEC R6
?C0024:
ORL A,R4
JNZ ?C0021
; }
; SOURCE LINE # 349
?C0023:
RET
; END OF BitDly
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -