📄 i2c.lst
字号:
C51 COMPILER V7.06 I2C 04/26/2008 10:09:15 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include<at89x51.h>
2 #include<intrins.h>
3
4 #define uint unsigned int
5 #define uchar unsigned char
6
7 code uchar SenData[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
8 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10};
9
10 sbit SCL=P1^4;
11 sbit SDA=P1^5;
12
13 /***********************************************
14 **函数名称:DelayNms()
15 **函数功能:延时N毫秒
16 **入口参数:n
17 **出口参数:无
18 **说明 :无
19 ***********************************************/
20 void DelayNms(uint n)
21 {
22 1 uint i,j;
23 1 for(i=0;i<n;i++)
24 1 for(j=0;j<120;j++);
25 1 }
26
27
28 /***********************************************
29 **函数名称:I2C_Start()
30 **函数功能:发送起始条件
31 **入口参数:无
32 **出口参数:无
33 **说明 :时序按照标准模式建立
34 ***********************************************/
35 void I2C_Start()
36 {
37 1 SDA=1;
38 1 _nop_();//数据建立时间大于250ns
39 1 _nop_();
40 1 _nop_();
41 1 SCL=1;
42 1 _nop_();
43 1 _nop_();
44 1 _nop_();
45 1 SDA=0;
46 1 _nop_();
47 1 _nop_();
48 1 SCL=0; //SCL高电平时间大于4us,嵌住时钟总线
49 1 _nop_();
50 1 _nop_();
51 1 _nop_();
52 1 _nop_();
53 1 _nop_();
54 1 }
55
C51 COMPILER V7.06 I2C 04/26/2008 10:09:15 PAGE 2
56 /***********************************************
57 **函数名称:I2C_Stop()
58 **函数功能:发送停止条件
59 **入口参数:无
60 **出口参数:无
61 **说明 :时序按照标准模式建立
62 ***********************************************/
63 void I2C_Stop()
64 {
65 1 SDA=0;
66 1 _nop_();//数据建立时间大于250ns
67 1 _nop_();
68 1 _nop_();
69 1 SCL=1;
70 1 _nop_();
71 1 _nop_();
72 1 _nop_();
73 1 SDA=1;
74 1 _nop_();
75 1 _nop_();
76 1 SCL=0; //SCL高电平时间大于4us,嵌住时钟总线
77 1 _nop_();
78 1 _nop_();
79 1 _nop_();
80 1 _nop_();
81 1 _nop_();
82 1 }
83
84 /***********************************************
85 **函数名称:I2C_SendByte()
86 **函数功能:发送一个字节
87 **入口参数:待发送字节n
88 **出口参数:无
89 **说明 :时序按照标准模式建立
90 ***********************************************/
91 void I2C_SendByte(uchar n)
92 {
93 1 char i;
94 1 for(i=7;i>=0;i--)
95 1 {
96 2 SDA=(n>>i)&0x01;
97 2 _nop_();
98 2 _nop_();
99 2 _nop_();
100 2 SCL=1;
101 2 _nop_();
102 2 _nop_();
103 2 _nop_();
104 2 _nop_();
105 2 _nop_();
106 2 SCL=0;
107 2 _nop_();
108 2 _nop_();
109 2 _nop_();
110 2 _nop_();
111 2 _nop_();
112 2 }
113 1 }
114
115
116 /***********************************************
117 **函数名称:I2C_RecByte()
C51 COMPILER V7.06 I2C 04/26/2008 10:09:15 PAGE 3
118 **函数功能:接收一个字节
119 **入口参数:无
120 **出口参数:已接收字节
121 **说明 :时序按照标准模式建立
122 ***********************************************/
123 I2C_RecByte(void)
124 {
125 1 char i,j=0;
126 1 for(i=7;i>=0;i--)
127 1 {
128 2 j<<=1;
129 2 SDA=1;
130 2 _nop_();
131 2 _nop_();
132 2 _nop_();
133 2 SCL=1;
134 2 _nop_();
135 2 _nop_();
136 2 _nop_();
137 2 j|=SDA&0x01;
138 2 _nop_();
139 2 _nop_();
140 2 SCL=0;
141 2 _nop_();
142 2 _nop_();
143 2 _nop_();
144 2 _nop_();
145 2 _nop_();
146 2 }
147 1 return (j);
148 1 }
149
150
151
152 /***********************************************
153 **函数名称:Check_Ack()
154 **函数功能:检测从机响应
155 **入口参数:无
156 **出口参数:从机响应则为'0',否则为'1'
157 **说明 :时序按照标准模式建立
158 ***********************************************/
159 Check_Ack()
160 {
161 1 uchar i=1;
162 1 SDA=1;
163 1 _nop_();
164 1 _nop_();
165 1 _nop_();
166 1 SCL=1;
167 1 _nop_();
168 1 _nop_();
169 1 _nop_();
170 1 i=SDA;
171 1 _nop_();
172 1 _nop_();
173 1 _nop_();
174 1 SCL=0;
175 1 _nop_();
176 1 _nop_();
177 1 _nop_();
178 1 _nop_();
179 1 _nop_();
C51 COMPILER V7.06 I2C 04/26/2008 10:09:15 PAGE 4
180 1 return (i);
181 1 }
182
183 /***********************************************
184 **函数名称:Gen_Ack()
185 **函数功能:产生应答
186 **入口参数:i
187 **出口参数:无
188 **说明 :i=0产生应答,i=1产生非应答
189 ***********************************************/
190 Gen_Ack(char i)
191 {
192 1 SDA=i;
193 1 _nop_();
194 1 _nop_();
195 1 SCL=1;
196 1 _nop_();
197 1 _nop_();
198 1 _nop_();
199 1 _nop_();
200 1 _nop_();
201 1 SCL=0;
202 1 _nop_();
203 1 _nop_();
204 1 SDA=1;
205 1 _nop_();
206 1 _nop_();
207 1 _nop_();
208 1 }
209
210 /***********************************************
211 **函数名称:I2C_SendNByte()
212 **函数功能:发送N个字节
213 **入口参数:字节个数n,待发送数据队列首地址
214 **出口参数:无
215 **说明 :时序按照标准模式建立
216 ***********************************************/
217 void I2C_SendNByte(uchar n,uchar *p)
218 {
219 1 while(n--)
220 1 {
221 2 send:I2C_SendByte(*p);
222 2 if(Check_Ack()) goto send;
223 2 p++;
224 2 }
225 1 I2C_Stop();
226 1
227 1 }
228
229 /***********************************************
230 **函数名称:I2C_RecNByte()
231 **函数功能:接收N个字节
232 **入口参数:字节个数n,存放数据队列首地址
233 **出口参数:无
234 **说明 :时序按照标准模式建立
235 ***********************************************/
236 void I2C_RecNByte(char n,uchar *p)
237 {
238 1 while(n--)
239 1 {
240 2 *p=I2C_RecByte();
241 2 if(n>0)
C51 COMPILER V7.06 I2C 04/26/2008 10:09:15 PAGE 5
242 2 {Gen_Ack(0x00);//产生应答
243 3 p++;
244 3 }
245 2 else
246 2 {Gen_Ack(0x01);//产生非应答
247 3 I2C_Stop();
248 3 }
249 2 }
250 1 }
251
252
253
254 void main(void)
255 {
256 1 uchar RecData[18]={0x00};
257 1
258 1 start:I2C_Start();
259 1 I2C_SendByte(0xae);//发送从地址
260 1
261 1 if(Check_Ack())
262 1 {
263 2 I2C_Stop();
264 2 goto start;
265 2 }
266 1 I2C_SendByte(0x30);//发送子地址
267 1 if(Check_Ack())
268 1 {
269 2 I2C_Stop();
270 2 goto start;
271 2 }
272 1 I2C_SendNByte(17,SenData);//在页写入模式下一次最多写一页,写的数据超过16个将覆盖前面所写的
273 1 DelayNms(1000);//这个延时很有用,去掉试试看
274 1
275 1 start2:I2C_Start();
276 1 I2C_SendByte(0xac);//发送从地址
277 1
278 1 if(Check_Ack())
279 1 {
280 2 I2C_Stop();
281 2 goto start2;
282 2 }
283 1 I2C_SendByte(0x80);//发送子地址
284 1 if(Check_Ack())
285 1 {
286 2 I2C_Stop();
287 2 goto start2;
288 2 }
289 1 I2C_SendNByte(17,SenData);//在页写入模式下一次最多写一页,写的数据超过16个将覆盖前面所写的
290 1 DelayNms(1000);//这个延时很有用,去掉试试看
291 1
292 1
293 1 start3:I2C_Start();
294 1 I2C_SendByte(0xa0);//发送从地址,选择24c04,第0页
295 1
296 1 if(Check_Ack())
297 1 {
298 2 I2C_Stop();
299 2 goto start3;
300 2 }
301 1 I2C_SendByte(0x80);//发送子地址
302 1 if(Check_Ack())
303 1 {
C51 COMPILER V7.06 I2C 04/26/2008 10:09:15 PAGE 6
304 2 I2C_Stop();
305 2 goto start3;
306 2 }
307 1 I2C_SendNByte(17,SenData);//在页写入模式下一次最多写一页,写的数据超过16个将覆盖前面所写的
308 1 DelayNms(1000);//这个延时很有用,去掉试试看
309 1
310 1 start4:I2C_Start();
311 1 I2C_SendByte(0xa2);//发送从地址,选择24c04,第1页
312 1
313 1 if(Check_Ack())
314 1 {
315 2 I2C_Stop();
316 2 goto start4;
317 2 }
318 1 I2C_SendByte(0x70);//发送子地址
319 1 if(Check_Ack())
320 1 {
321 2 I2C_Stop();
322 2 goto start4;
323 2 }
324 1 I2C_SendNByte(17,SenData);//在页写入模式下一次最多写一页,写的数据超过16个将覆盖前面所写的
325 1 DelayNms(1000);//这个延时很有用,去掉试试看
326 1
327 1 start1: I2C_Start();
328 1 I2C_SendByte(0xa0);//发送从地址
329 1 if(Check_Ack())
330 1 {
331 2 I2C_Stop();
332 2 goto start1;
333 2 }
334 1 I2C_SendByte(0x08);//发送子地址
335 1 if(Check_Ack())
336 1 {
337 2 I2C_Stop();
338 2 goto start1;
339 2 }
340 1 I2C_Start();
341 1 I2C_SendByte(0xa1);//这一步不要忘记检测应答
342 1 if(Check_Ack())
343 1 {
344 2 I2C_Stop();
345 2 goto start1;
346 2 }
347 1 I2C_RecNByte(18,RecData);
348 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 536 ----
CONSTANT SIZE = 35 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 18
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -