📄 e2prom.lst
字号:
C51 COMPILER V8.02 E2PROM 02/08/2011 09:22:39 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE E2PROM
OBJECT MODULE PLACED IN e2prom.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE source\e2prom.c BROWSE INCDIR(include/) DEBUG OBJECTEXTEND PRINT(.\e2prom.l
-st) OBJECT(e2prom.obj)
line level source
1 /*
2 * E2PROM 读写
3 */
4
5 #include "e2prom.h"
6
7
8 /**
9 * 函数: i2c_start()
10 * 功能: 启动i2c
11 */
12 void i2c_start()
13 {
14 1 SCL = 1;
15 1 nops();
16 1 SDA = 1;
17 1 nops();
18 1 SDA = 0;
19 1 nops();
20 1 SCL = 0;
21 1 }
22
23 /**
24 * 函数: i2c_stop()
25 * 功能: 停止i2c
26 */
27 void i2c_stop()
28 {
29 1 SCL = 0;
30 1 nops();
31 1 SDA = 0;
32 1 nops();
33 1 SCL = 1;
34 1 nops();
35 1 SDA = 1;
36 1 nops();
37 1 }
38
39 /**
40 * 函数: i2c_ACK(bit ck)
41 * 功能: ck为1时发送应答信号ACK,
42 * ck为0时不发送ACK
43 */
44 void i2c_ACK(bit ck)
45 {
46 1 if (ck)
47 1 SDA = 0;
48 1 else
49 1 SDA = 1;
50 1 nops();
51 1 SCL = 1;
52 1 nops();
53 1 SCL = 0;
54 1 nops();
C51 COMPILER V8.02 E2PROM 02/08/2011 09:22:39 PAGE 2
55 1 SDA = 1;
56 1 nops();
57 1 }
58
59 /**
60 * 函数: i2c_waitACK()
61 * 功能: 返回为0时收到ACK
62 * 返回为1时没收到ACK
63 */
64 bit i2c_waitACK()
65 {
66 1 SDA = 1;
67 1 nops();
68 1 SCL = 1;
69 1 nops();
70 1 if (SDA)
71 1 {
72 2 SCL = 0;
73 2 i2c_stop();
74 2 return 1;
75 2 }
76 1 else
77 1 {
78 2 SCL = 0;
79 2 return 0;
80 2 }
81 1 }
82
83 /**
84 * 函数: i2c_sendbyte(uint8 bt)
85 * 功能: 将输入的一字节数据bt发送
86 */
87 void i2c_sendbyte(uint8 bt)
88 {
89 1 uint8 i;
90 1
91 1 for(i=0; i<8; i++)
92 1 {
93 2 if (bt & 0x80)
94 2 SDA = 1;
95 2 else
96 2 SDA = 0;
97 2 nops();
98 2 SCL = 1;
99 2 bt <<= 1;
100 2 nops();
101 2 SCL = 0;
102 2 }
103 1 }
104
105 /**
106 * 函数: i2c_recbyte( )
107 * 功能: 从总线上接收1字节数据
108 */
109 uint8 i2c_recbyte()
110 {
111 1 uint8 dee, i;
112 1
113 1 for (i=0; i<8; i++)
114 1 {
115 2 SCL = 1;
116 2 nops();
C51 COMPILER V8.02 E2PROM 02/08/2011 09:22:39 PAGE 3
117 2 dee <<= 1;
118 2 if (SDA)
119 2 dee = dee | 0x01;
120 2 SCL = 0;
121 2 nops();
122 2 }
123 1
124 1 return dee;
125 1 }
126
127 /**
128 * 函数: i2c_writebyte
129 * 功能: 字节写,在指定的地址(add)
130 * 写入一字节数据(dat)
131 * 返回值: 0->成功 1->失败
132 */
133 bit i2c_writebyte(uint8 addr, uint8 dat)
134 {
135 1 i2c_start();
136 1 i2c_sendbyte(SLAVEADDR); //控制字节
137 1 if (i2c_waitACK())
138 1 return 1;
139 1 i2c_sendbyte(addr); //地址
140 1 if (i2c_waitACK())
141 1 return 1;
142 1 i2c_sendbyte(dat); //数据
143 1 if (i2c_waitACK())
144 1 return 1;
145 1 i2c_stop();
146 1 delay(2000);
147 1 return 0;
148 1 }
149
150 /**
151 * 函数: i2c_readbyte
152 * 输入: add
153 * 返回: hep
154 * 功能: 字节读,在指定的地址(add)
155 * 读出一字节数据
156 * 返回值: 0->成功 1->失败
157 */
158 bit i2c_readbyte(uint8 addr, uint8 *dat)
159 {
160 1 i2c_start();
161 1 i2c_sendbyte(SLAVEADDR); //控制字节
162 1 if (i2c_waitACK())
163 1 return 1;
164 1 i2c_sendbyte(addr); //地址
165 1 if (i2c_waitACK())
166 1 return 1;
167 1 i2c_start();
168 1 i2c_sendbyte(SLAVEADDR+1); //控制字节
169 1 if (i2c_waitACK())
170 1 return 1;
171 1 *dat = i2c_recbyte(); //读数据
172 1 i2c_ACK(0); //因为只读一字节数据,不发送ACK信号
173 1 i2c_stop();
174 1
175 1 return 0;
176 1 }
177
178 /*
C51 COMPILER V8.02 E2PROM 02/08/2011 09:22:39 PAGE 4
179 * *buf--待写数据,addr--e2prom地址,len--数据长度
180 */
181 bit i2c_write_buf(uint8 *buf, uint8 addr, uint8 len)
182 {
183 1 while (len--)
184 1 {
185 2 if (i2c_writebyte(addr++, *buf++))
186 2 return 1;
187 2 }
188 1 return 0;
189 1 }
190
191 /*
192 * *buf--读数据,addr--e2prom地址,len--数据长度
193 */
194 bit i2c_read_buf(uint8 *buf, uint8 addr, uint8 len)
195 {
196 1 while (len--)
197 1 {
198 2 if (i2c_readbyte(addr++, buf++))
199 2 return 1;
200 2 }
201 1 return 0;
202 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 368 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 10
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -