?? 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 * 函數(shù): 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 * 函數(shù): 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 * 函數(shù): i2c_ACK(bit ck)
41 * 功能: ck為1時發(fā)送應答信號ACK,
42 * ck為0時不發(fā)送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 * 函數(shù): 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 * 函數(shù): i2c_sendbyte(uint8 bt)
85 * 功能: 將輸入的一字節(jié)數(shù)據(jù)bt發(fā)送
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 * 函數(shù): i2c_recbyte( )
107 * 功能: 從總線上接收1字節(jié)數(shù)據(jù)
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 * 函數(shù): i2c_writebyte
129 * 功能: 字節(jié)寫,在指定的地址(add)
130 * 寫入一字節(jié)數(shù)據(jù)(dat)
131 * 返回值: 0->成功 1->失敗
132 */
133 bit i2c_writebyte(uint8 addr, uint8 dat)
134 {
135 1 i2c_start();
136 1 i2c_sendbyte(SLAVEADDR); //控制字節(jié)
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); //數(shù)據(jù)
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 * 函數(shù): i2c_readbyte
152 * 輸入: add
153 * 返回: hep
154 * 功能: 字節(jié)讀,在指定的地址(add)
155 * 讀出一字節(jié)數(shù)據(jù)
156 * 返回值: 0->成功 1->失敗
157 */
158 bit i2c_readbyte(uint8 addr, uint8 *dat)
159 {
160 1 i2c_start();
161 1 i2c_sendbyte(SLAVEADDR); //控制字節(jié)
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); //控制字節(jié)
169 1 if (i2c_waitACK())
170 1 return 1;
171 1 *dat = i2c_recbyte(); //讀數(shù)據(jù)
172 1 i2c_ACK(0); //因為只讀一字節(jié)數(shù)據(jù),不發(fā)送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--待寫數(shù)據(jù),addr--e2prom地址,len--數(shù)據(jù)長度
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--讀數(shù)據(jù),addr--e2prom地址,len--數(shù)據(jù)長度
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 + -