📄 iic.lst
字号:
C51 COMPILER V7.10 IIC 12/14/2004 10:51:17 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN .\iic.obj
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE ..\SourceFile\iic.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\i
-ic.lst) OBJECT(.\iic.obj)
line level source
1 /*************************************************/
2
3 /*****************I2C串行总线********************/
4
5 /****************2003年1月15日*******************/
6
7 /************WROTE BY ZLGMCU********************/
8
9 /************MODIFY BY WANGSW********************/
10
11
12
13 #include <intrins.h>
14 #include "reg52x2.h" /*头文件的包含*/
15
16 #include "define.h"
17 #include "interrupt.h"
18 #include "iic.h"
19
20
21
22 /*端口位定义*/
23 sbit SDA=P3^4; /*模拟I2C数据传送位*/
24 sbit SCL=P3^5; /*模拟I2C时钟控制位*/
25
26 /*状态标志*/
27 bool ack; /*应答标志位*/
28
29
30
31 static void StartI2c(void);
32 static void StopI2c(void);
33 static bool SendByte(byte value);
34 static byte RcvByte(void);
35 static void AckI2c(bool bFlag);
36
37
38 /**********************************************************************/
39
40
41
42 static void StartI2c()
43 {
44 1 SDA = 1; /*发送起始条件的数据信号*/
45 1 _nop_();
46 1 SCL = 1;
47 1 _nop_();
48 1 SDA = 0; /*发送起始信号*/
49 1 _nop_();
50 1 SCL = 0; /*钳住I2C总线,准备发送或接收数据 */
51 1 }
52
53 static void StopI2c()
54 {
C51 COMPILER V7.10 IIC 12/14/2004 10:51:17 PAGE 2
55 1 SDA = 0; /*发送结束条件的数据信号*/
56 1 _nop_();
57 1 SCL = 1; /*结束条件建立时间大于4μs*/
58 1 _nop_();
59 1 SDA = 1; /*发送I2C总线结束信号*/
60 1 }
61
62 static bool SendByte(byte value)
63 {
64 1 byte data i;
65 1
66 1 for(i = 0; i < 8; i++) /*要传送的数据长度为8位*/
67 1 {
68 2 SCL = 0;
69 2 if((value << i) & 0x80) /*取数据,并转串*/
70 2 {
71 3 SDA = 1;
72 3 }
73 2 else
74 2 {
75 3 SDA = 0;
76 3 }
77 2 _nop_();
78 2 SCL = 1; /*置时钟线为高,通知被控器开始接收数据位*/
79 2 _nop_();
80 2 }
81 1
82 1 SCL = 0;
83 1 _nop_();
84 1 SDA = 1; /*8位发送完后释放数据线,准备接收应答位*/
85 1 _nop_();
86 1 SCL = 1;
87 1 _nop_();
88 1 if(SDA)
89 1 {
90 2 ack = 0;
91 2 }
92 1 else
93 1 {
94 2 ack = 1; /*判断是否接收到应答信号*/
95 2 }
96 1 _nop_();
97 1 SCL = 0;
98 1
99 1 return(ack);
100 1 }
101
102 static byte RcvByte()
103 {
104 1 byte data i;
105 1 byte data retc;
106 1
107 1 retc = 0;
108 1 SDA = 1; /*置数据线为输入方式*/
109 1
110 1 for(i = 0; i < 8; i++)
111 1 {
112 2 SCL = 0; /*置时钟线为低,准备接收数据位*/
113 2 _nop_();
114 2 SCL = 1; /*置时钟线为高使数据线上数据有效*/
115 2 _nop_();
116 2 retc = retc << 1;
C51 COMPILER V7.10 IIC 12/14/2004 10:51:17 PAGE 3
117 2 if(SDA)
118 2 {
119 3 retc = retc + 1; /*读数据位,接收的数据位放入retc中 */
120 3 }
121 2 }
122 1 SCL = 0;
123 1 return(retc);
124 1 }
125
126 static void AckI2c(bool bFlag)
127 {
128 1 if(bFlag)
129 1 {
130 2 SDA = 1; /*在此发出应答或非应答信号 */
131 2 }
132 1 else
133 1 {
134 2 SDA = 0;
135 2 }
136 1 _nop_();
137 1 SCL = 1;
138 1 _nop_();
139 1 SCL = 0; /*清时钟线,钳住I2C总线以便继续接收*/
140 1 }
141
142
143 /***************************************************************/
144
145
146 extern bool iic_send_byte(byte SlaveAddress, byte value)
147 {
148 1 StartI2c(); /*启动总线*/
149 1
150 1 if(!SendByte(SlaveAddress)) /*发送器件地址*/
151 1 {
152 2 return(FALSE);
153 2 }
154 1
155 1 if(!SendByte(value)) /*发送数据*/
156 1 {
157 2 return(FALSE);
158 2 }
159 1
160 1 StopI2c(); /*结束总线*/
161 1 return(TRUE);
162 1 }
163
164
165
166
167 extern bool iic_rcv_byte(byte SlaveAddress, byte value)
168 {
169 1 StartI2c(); /*启动总线*/
170 1
171 1 if(!SendByte(SlaveAddress + 1)) /*发送器件地址*/
172 1 {
173 2 return(FALSE);
174 2 }
175 1
176 1 value = RcvByte(); /*读取数据*/
177 1
178 1 AckI2c(TRUE); /*发送非就答位*/
C51 COMPILER V7.10 IIC 12/14/2004 10:51:17 PAGE 4
179 1
180 1 StopI2c(); /*结束总线*/
181 1 return(TRUE);
182 1 }
183
184
185 extern bool iic_send_str(byte SlaveAddress, byte address, byte *source, byte len)
186 {
187 1 byte i;
188 1
189 1 StartI2c(); /*启动总线*/
190 1
191 1 if(!SendByte(SlaveAddress)) /*发送器件地址*/
192 1 {
193 2 return(FALSE);
194 2 }
195 1
196 1 if(!SendByte(address)) /*发送器件子地址*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -