📄 i2c.lst
字号:
C51 COMPILER V7.50 I2C 09/18/2008 15:29:04 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: D:\Keil C51\C51\BIN\C51.EXE I2C.c OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1 //*******************************************************
2 // 文件名:I2C.c
3 // 创建人: ZFZ
4 // 建立时间: 2008-6-6
5 // 版本描 述: STIV8.0.0
6 // 文件描述:标准80C51单片机模拟I2C总线的主机程序
7 // 功能描述:
8 // 备注:本程序仅供学习参考,版权归江西新和公司所有,勿用于商业目的
9 // 最后修改时间:
10 //*******************************************************
11 #include <C8051F340.h>
12 #include <intrins.h>
13 #include "I2C.h"
14
15
16 /*---------------------------------------------
17 函数名:Romdelay
18 功 能:24C512的延时
19 参 数:uint x
20 返回值:无
21 修改记录
22 ----------------------------------------------
23 日期 作者 内容
24
25 ---------------------------------------------*/
26 void Romdelay(unsigned int x)
27 {
28 1 unsigned int i;
29 1 for(i=0;i<x;i++);
30 1 }
31
32
33 /*---------------------------------------------
34 函数名: sta
35 功 能:24C512起始条件
36 参 数:无
37 返回值:无
38 修改记录
39 ----------------------------------------------
40 日期 作者 内容
41
42 ---------------------------------------------*/
43 void sta(void)
44 {
45 1 SDA=1; //SCL为高时,SDA的下降延开始
46 1 Romdelay(50);
47 1 //_nop_();
48 1 SCL=1;
49 1 while(SCL==0)
50 1 {;}
51 1 //_nop_();
52 1 //_nop_();
53 1 //_nop_();
54 1 //_nop_();
55 1 //_nop_();
C51 COMPILER V7.50 I2C 09/18/2008 15:29:04 PAGE 2
56 1 Romdelay(100);
57 1 SDA=0;
58 1 //_nop_();
59 1 //_nop_();
60 1 //_nop_();
61 1 //_nop_();
62 1 //_nop_();
63 1 //_nop_();
64 1 Romdelay(100);
65 1 SCL=0;
66 1 //_nop_();
67 1 //_nop_();
68 1 Romdelay(100);
69 1 }
70
71 /*---------------------------------------------
72 函数名:stop
73 功 能:24C512停止
74 参 数:无
75 返回值:无
76 修改记录
77 ----------------------------------------------
78 日期 作者 内容
79
80 ---------------------------------------------*/
81 void stop(void)
82 {
83 1 SDA=0; //SCL为高时,SDA的上升延停止
84 1 SCL=1;
85 1 while(SCL==0)
86 1 {;}
87 1 //_nop_();
88 1 //_nop_();
89 1 //_nop_();
90 1 //_nop_();
91 1 //_nop_();
92 1 Romdelay(100);
93 1 SDA=1;
94 1 //_nop_();
95 1 //_nop_();
96 1 //_nop_();
97 1 //_nop_();
98 1 //_nop_();
99 1 Romdelay(100);
100 1 }
101
102 /*---------------------------------------------
103 函数名:wrbyt
104 功 能:向EEPROM写一个字节函数
105 参 数:uchar shu
106 返回值:无
107 修改记录
108 ----------------------------------------------
109 日期 作者 内容
110
111 ---------------------------------------------*/
112 void wrbyt(unsigned char shu)
113 {
114 1 unsigned char i;
115 1
116 1 for(i=0;i<8;i++)
117 1 {
C51 COMPILER V7.50 I2C 09/18/2008 15:29:04 PAGE 3
118 2 SDA=((shu&0x80)>0)?1:0; //取数据最高位,先传高再低
119 2 Romdelay(100);
120 2 //_nop_();
121 2 SCL=1;
122 2 //_nop_();
123 2 //_nop_();
124 2 //_nop_();
125 2 //_nop_();
126 2 //_nop_();
127 2 Romdelay(100);
128 2 SCL=0; //SDA上的数据只有在SCL为低时才能改变
129 2 Romdelay(100);
130 2 //_nop_();
131 2 shu<<=1; //数据左移一位
132 2 }
133 1 }
134
135 /*---------------------------------------------
136 函数名:rdbyt
137 功 能:从EEPROM读一个字节
138 参 数:无
139 返回值:uchar nn
140 修改记录
141 ----------------------------------------------
142 日期 作者 内容
143
144 ---------------------------------------------*/
145 unsigned char rdbyt(void)
146 {
147 1 unsigned char nn=0xff;
148 1 unsigned char j;
149 1
150 1 for(j=0;j<8;j++)
151 1 {
152 2 SDA=1;
153 2 //_nop_();
154 2 //_nop_();
155 2 //_nop_();
156 2 //_nop_();
157 2 //_nop_();
158 2 Romdelay(100);
159 2 SCL=1;
160 2 if(SDA==0)
161 2 {
162 3 nn<<=1;
163 3 nn=(nn&0xfe);
164 3 SCL=0;
165 3 }
166 2 else
167 2 {
168 3 nn<<=1;
169 3 nn=(nn|0x01);
170 3 SCL=0;
171 3 }
172 2 }
173 1 return(nn);
174 1 }
175
176
177 /*---------------------------------------------
178 函数名:mack
179 功 能:
C51 COMPILER V7.50 I2C 09/18/2008 15:29:04 PAGE 4
180 参 数:无
181 返回值:无
182 修改记录
183 ----------------------------------------------
184 日期 作者 内容
185
186 ---------------------------------------------*/
187 void mack(void)
188 {
189 1 SDA=0;
190 1 SCL=1;
191 1 Romdelay(100);
192 1 //_nop_();
193 1 //_nop_();
194 1 //_nop_();
195 1 //_nop_();
196 1 //_nop_();
197 1 //_nop_();
198 1 SCL=0;
199 1 SDA=1;
200 1 }
201
202 /*---------------------------------------------
203 函数名:mnack
204 功 能:
205 参 数:无
206 返回值:无
207 修改记录
208 ----------------------------------------------
209 日期 作者 内容
210
211 ---------------------------------------------*/
212 void mnack(void)
213 {
214 1 SDA=1;
215 1 SCL=1;
216 1 //_nop_();
217 1 //_nop_();
218 1 //_nop_();
219 1 //_nop_();
220 1 //_nop_();
221 1 //_nop_();
222 1 Romdelay(100);
223 1 SCL=0;
224 1 SDA=0;
225 1 }
226
227 /*---------------------------------------------
228 函数名:cack
229 功 能:返回应答信号
230 参 数:无
231 返回值:F0(0或1)
232 修改记录
233 ----------------------------------------------
234 日期 作者 内容
235
236 ---------------------------------------------*/
237 bit cack(void)
238 {
239 1 bit F0;
240 1 //_nop_();
241 1 //_nop_();
C51 COMPILER V7.50 I2C 09/18/2008 15:29:04 PAGE 5
242 1 //_nop_();
243 1 Romdelay(50);
244 1 SDA=1;
245 1 //_nop_();
246 1 //_nop_();
247 1 //_nop_();
248 1 Romdelay(50);
249 1 SCL=1;
250 1 //_nop_();
251 1 //_nop_();
252 1 //_nop_();
253 1 //_nop_();
254 1 //_nop_();
255 1 //_nop_();
256 1 Romdelay(200);
257 1 F0=(SDA==0)?0:1;
258 1 SCL=0;
259 1 //_nop_();
260 1 //_nop_();
261 1 //_nop_();
262 1 //_nop_();
263 1 //_nop_();
264 1 //_nop_();
265 1 //_nop_();
266 1 Romdelay(100);
267 1 return(F0);
268 1 }
269
270 /*---------------------------------------------
271 函数名:rdnbyt
272 功 能:从EEPROM读出一个数组函数
273 参 数:unsigned int SubAddr,unsigned char number,unsigned char qq[]
274 返回值:unsigned char qq[]
275 修改记录
276 ----------------------------------------------
277 日期 作者 内容
278
279 ---------------------------------------------*/
280 void rdnbyt(unsigned int SubAddr,unsigned char number,unsigned char qq[])
281 {
282 1 unsigned char l;
283 1 unsigned char addh,addl;
284 1 bit cflag=0;
285 1
286 1 addh = SubAddr / 0x100;
287 1 addl = SubAddr % 0x100;
288 1 sta();
289 1 wrbyt(0xA0);
290 1 cflag=cack();
291 1 wrbyt(addh);
292 1 cflag=cack();
293 1 wrbyt(addl);
294 1 cflag=cack();
295 1
296 1 sta();
297 1 wrbyt(0xA1); //写命令字(读)
298 1 cflag=cack();
299 1
300 1 for(l=0;l<number;l++)
301 1 {
302 2 qq[l]=rdbyt();
303 2 if(l<(number-1))
C51 COMPILER V7.50 I2C 09/18/2008 15:29:04 PAGE 6
304 2 {
305 3 mack();
306 3 }
307 2 Romdelay(100);
308 2 }
309 1 mnack();
310 1 Romdelay(100);
311 1 stop();
312 1 Romdelay(2000);
313 1 }
314
315 /*---------------------------------------------
316 函数名:wrnbyt
317 功 能:向EEPROM写一个数组
318 参 数:unsigned int SubAddr,unsigned char number,unsigned char ff[]
319 返回值:无
320 修改记录
321 ----------------------------------------------
322 日期 作者 内容
323
324 ---------------------------------------------*/
325 void wrnbyt(unsigned int SubAddr,unsigned char number,unsigned char ff[])
326 {
327 1 unsigned char k;
328 1 unsigned char addh,addl;
329 1 bit cflag=0;
330 1
331 1 addh = SubAddr / 0x100;
332 1 addl = SubAddr % 0x100;
333 1
334 1 for (k=0;k<number;k++)
335 1 {
336 2 if ((k==0) || (addl==0)||(addl==128)) //页边界处理。
337 2 {
338 3 sta(); //开始
339 3 wrbyt(0xA0); //写命令字(写)1010(000)0
340 3 cflag=cack();
341 3 wrbyt(addh);
342 3 cflag=cack();
343 3 wrbyt(addl);
344 3 cflag=cack();
345 3 }
346 2 wrbyt(ff[k]);
347 2 cflag=cack(); //接收应答信号
348 2 Romdelay(100); //延时
349 2 addl=addl+1;
350 2 if((addl==128)||(addl==0))
351 2 {
352 3 addh=(addl==0)?(addh+1):addh;
353 3 stop();
354 3 Romdelay(2000); //延时
355 3 }
356 2 }
357 1 Romdelay(200); //延时
358 1 stop(); //停止
359 1 Romdelay(2000); //延时
360 1 }
361
362
363
364
C51 COMPILER V7.50 I2C 09/18/2008 15:29:04 PAGE 7
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 482 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 17
IDATA SIZE = ---- ----
BIT SIZE = ---- 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -