📄 bus.lst
字号:
C51 COMPILER V6.23a BUS 09/10/2004 16:09:02 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE BUS
OBJECT MODULE PLACED IN BUS.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE BUS.C OPTIMIZE(6,SIZE) ORDER DEFINE(DEBUGMSG=0,DEBUGTOOL=0) DEBUG OBJECTEXT
-END CODE SYMBOLS SRC(.\BUS.SRC)
stmt level source
1 /************************************************
2 * *
3 * BUS.C: BUS control routines. *
4 * *
5 *************************************************/
6 #include <reg51.h>
7 #include <intrins.h>
8 #include "mascot.h"
9 #include "OSD.h"
10 #include "global.h"
11
12
13
14 #define USE_ASM 1
15
16 /*******************************************************************
17 * Send SCL pin high and wait for any clock stretching peripherals *
18 ********************************************************************/
19 #define SCLHigh() { SCLPin = 1; while(!SCLPin); }
20 #define SCLHigh2() { SCLPin2 = 1; while(!SCLPin2); }
21
22
23
24 /********************************************************
25 * Grasp the I2C bus, send slave address and command *
26 *********************************************************/
27 void GoI2CMaster(unsigned char adr)
28 {
29 1
30 1 BusBusy = 1;
31 1
32 1 if (!SCLPin) SCLHigh();
33 1
34 1 NoAck = 0;
35 1 BusFault = 0;
36 1
37 1 if (SCLPin & SDAPin) {
38 2 SDAPin = 0;
39 2 _nop_();
40 2 SCLPin = 0;
41 2 _nop_();
42 2 SendI2CByte(adr);
43 2 } else
44 1 BusFault = 1;
45 1 }
46
47
48
49
50 /*********************************************
51 * Send one byte of data to an I2C device *
52 **********************************************/
53 void SendI2CByte(unsigned char val)
54 {
C51 COMPILER V6.23a BUS 09/10/2004 16:09:02 PAGE 2
55 1
56 1 #if USE_ASM
57 1
58 1 ACC = val;
59 1 #pragma asm
60 1
61 1 MOV R7,#8
62 1
63 1 SendByte1:
64 1 RLC A
65 1 MOV SDAPin,C
66 1 NOP
67 1 SETB SCLPin
68 1 JNB SCLPin,$
69 1 NOP
70 1 CLR SCLPin
71 1 DJNZ R7,SendByte1
72 1
73 1 SETB SDAPin
74 1 NOP
75 1 SETB SCLPin
76 1 JNB SCLPin,$
77 1 JNB SDAPin,SendByte2
78 1 SETB NoAck
79 1
80 1 SendByte2:
81 1 CLR SCLPin
82 1
83 1 #pragma endasm
84 1
85 1 #else
unsigned char bmsk = 0x80;
while (bmsk) {
SDAPin = (val & bmsk) ? 0x01 : 0x00;
SCLHigh();
bmsk >>= 1;
SCLPin = 0;
}
SDAPin = 1;
SCLHigh();
if (SDAPin) NoAck = 1;
SCLPin = 0;
#endif
104 1
105 1 }
106
107
108
109 /*********************************************
110 * Receive byte of data from an I2C device *
111 **********************************************/
112 unsigned char RcvI2CByte(unsigned char cnt)
113 {
114 1 #if USE_ASM
115 1
116 1 B = cnt;
C51 COMPILER V6.23a BUS 09/10/2004 16:09:02 PAGE 3
117 1 #pragma asm
118 1
119 1 MOV R7,#8
120 1
121 1 RcvByte1:
122 1 SETB SCLPin
123 1 JNB SCLPin,$
124 1 MOV C,SDAPin
125 1 RLC A
126 1 CLR SCLPin
127 1 DJNZ R7,RcvByte1
128 1
129 1 PUSH ACC
130 1 MOV A,B
131 1 CJNE A,#1,RcvByte2
132 1 SETB SDAPin
133 1 SJMP RcvByte3
134 1
135 1 RcvByte2:
136 1 CLR SDAPin
137 1 NOP
138 1 RcvByte3:
139 1 SETB SCLPin
140 1 JNB SCLPin,$
141 1 NOP
142 1 CLR SCLPin
143 1 NOP
144 1 SETB SDAPin
145 1 POP ACC
146 1
147 1 #pragma endasm
148 1
149 1 return ACC;
150 1
151 1 #else
unsigned char bval = 0, b;
for(b=0; b < 8; b++) {
SCLHigh();
bval <<= 1;
bval |= SDAPin;
SCLPin = 0;
}
SDAPin = (cnt==1) ? 1 : 0;
SCLHigh();
SCLPin = 0;
SDAPin = 1; //Clear acknowledge bit.
return bval;
#endif
168 1 }
169
170 /*************************************
171 * Send I2C STOP, release bus *
172 **************************************/
173 void SendI2CStop(void)
174 {
175 1 SDAPin = 0;
176 1 _nop_();
177 1 SCLHigh();
178 1 _nop_();
C51 COMPILER V6.23a BUS 09/10/2004 16:09:02 PAGE 4
179 1 SDAPin = 1;
180 1 _nop_();
181 1 BusBusy = 0;
182 1 }
183
184
185
186 #if USE_I2C_2
/********************************************************
* Grasp the I2C bus, send slave address and command *
*********************************************************/
void GoI2CMaster2(unsigned char adr)
{
BusBusy = 1;
if (!SCLPin2) SCLHigh2();
NoAck = 0;
BusFault = 0;
if(SCLPin2 & SDAPin2) {
SDAPin2 = 0;
_nop_();
SCLPin2 = 0;
_nop_();
SendI2CByte2(adr);
} else
BusFault = 1;
}
/*********************************************
* Send one byte of data to an I2C device *
**********************************************/
void SendI2CByte2(unsigned char val)
{
#if USE_ASM
ACC = val;
#pragma asm
MOV R7,#8
SendByte1:
RLC A
MOV SDAPin2,C
SETB SCLPin2
JNB SCLPin2,$
CLR SCLPin2
DJNZ R7,SendByte1
SETB SDAPin2
SETB SCLPin2
JNB SCLPin2,$
JNB SDAPin2,SendByte2
SETB NoAck
SendByte2:
CLR SCLPin2
#pragma endasm
C51 COMPILER V6.23a BUS 09/10/2004 16:09:02 PAGE 5
#else
unsigned char bmsk = 0x80;
while (bmsk) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -