📄 24c64.lst
字号:
C51 COMPILER V7.06 24C64 11/10/2008 22:12:04 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 24C64
OBJECT MODULE PLACED IN 24c64.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 24c64.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 #define _24c64_c_
3 #include "24c64.h"
4
5 /*
6 ********************************************************************
7 ** 函数名:5ms延时函数
8 ** 注意 :
9 ** 说明 :
10 **
11 ********************************************************************
12 */
13 void delay_5ms( void )
14 {
15 1 uchar i;
16 1 uchar j;
17 1 uchar t;
18 1 for( t = 0; t < 10; t++ )
19 1 {
20 2 for( j = 0; j < 15; j ++ )
21 2 {
22 3 for( i = 0; i < 21; i++ )
23 3 {;}
24 3 }
25 2 }
26 1 }
27
28 /*
29 ********************************************************************
30 ** 函数名:i2c启动
31 ** 注意 :
32 ** 说明 :
33 ********************************************************************
34 */
35 void I2cStart( void )
36 {
37 1 //scl=1时
38 1 //sda由1-->0
39 1 SDA = 1; //准备下降沿
40 1 SCL = 1;
41 1 NOP_5;
42 1 SDA = 0;
43 1 NOP_5;
44 1
45 1 SCL = 0; //一定要
46 1 //SDA = 0;
47 1 }
48
49 /*
50 ********************************************************************
51 ** 函数名:i2c停止
52 ** 注意 :
53 ** 说明 :
54 ********************************************************************
55 */
C51 COMPILER V7.06 24C64 11/10/2008 22:12:04 PAGE 2
56 void I2cStop( void )
57 {
58 1 //scl=1时
59 1 //sda由0-->1
60 1 SDA = 0; //准备上升沿
61 1 SCL = 1;
62 1 NOP_5;
63 1 SDA = 1;
64 1 NOP_5;
65 1
66 1 //SCL = 0; //本来书上说要此句,但发觉加入后仿真不正确...
67 1 //SDA = 0;
68 1 }
69
70 /*
71 ********************************************************************
72 ** 函数名:查询应答信号
73 ** 注意 :
74 ** 说明 :如果有应答返回 1
75 ********************************************************************
76 */
77 uchar WaitAsk( void )
78 {
79 1 uchar askflag = 0;
80 1
81 1 SDA = 1; //SDA置为输入
82 1
83 1 SCL = 1;
84 1 NOP_5; //5us后检测
85 1
86 1 if( SDA == 0 ) //检测sda线
87 1 askflag = 1; //有应答返回 1 表示成功
88 1
89 1 SCL = 0;
90 1
91 1 return askflag;
92 1 }
93
94 /*
95 ********************************************************************
96 ** 函数名:发送应答信号
97 ** 注意 :
98 ** 说明 :SCL = 1 , SDA = 0;
99 ********************************************************************
100 */
101 void SendAsk( void )
102 {
103 1 SDA = 0;
104 1
105 1 SCL = 1;
106 1 NOP_5;
107 1 SCL = 0; //在scl为高时,sda为0
108 1
109 1 SDA = 1;
110 1 }
111
112 /*
113 ********************************************************************
114 ** 函数名:发送非应答信号
115 ** 注意 :
116 ** 说明 :SCL = 1 , SDA = 1
117 ********************************************************************
C51 COMPILER V7.06 24C64 11/10/2008 22:12:04 PAGE 3
118 */
119 void SendNoAsk( void )
120 {
121 1 SDA = 1;
122 1
123 1 SCL = 1;
124 1 NOP_5;
125 1 SCL = 0; //在scl为高时, sda为1
126 1
127 1 SDA = 0;
128 1 }
129
130 /*
131 ********************************************************************
132 ** 函数名 :写一个字节数据
133 ** 入口参数: 字节数据wbyte
134 ** 注意 :
135 ** 说明 :可以用来写地址字节,也可以用来写数据字节
136 ********************************************************************
137 */
138 void I2cWriteByte( uchar wbyte )
139 {
140 1 uchar i;
141 1 for(i = 0; i < 8; i++ )
142 1 {
143 2 if( ( wbyte & 0x80 ) == 0x80 ) //!!!! 先发送高位,再发送低位.., 在数据传输时一定要注意此处细节
144 2 SDA = 1;
145 2 else
146 2 SDA = 0; //因为数据传输时要保持数据稳定, 因此要先准备好SDA上的数据才能进行SCL的变化
147 2
148 2 SCL = 1;
149 2 NOP_5;
150 2 SCL = 0;
151 2
152 2 wbyte = wbyte << 1;
153 2 }
154 1 }
155
156 /*
157 ********************************************************************
158 ** 函数名 :写一个字节数据到某器件某地址
159 ** 入口参数: 器件地址DeviceAddress 字节地址ByteAddress 要写的字节数据Wdata
160 ** 注意 :里面加有5ms延时。
161 ** 说明 :I2cWriteDataToAddr( 0xa0, 0x08, 'a' );
162 ********************************************************************
163 */
164 void I2cWriteDataToAddr( uchar DeviceAddress, uint ByteAddress, uchar Wdata )
165 {
166 1 I2cStart();
167 1 I2cWriteByte( DeviceAddress );
168 1 WaitAsk(); //等待应答
169 1 I2cWriteByte( ByteAddress >> 8 ); //高8位
170 1 WaitAsk();
171 1 I2cWriteByte( ByteAddress ); //低8位
172 1 WaitAsk();
173 1 I2cWriteByte( Wdata );
174 1 WaitAsk();
175 1 I2cStop();
176 1
177 1 delay_5ms(); //发觉这里要加一小段延时,如果不加,则可以在外面加。
178 1 }
179
C51 COMPILER V7.06 24C64 11/10/2008 22:12:04 PAGE 4
180 /*
181 ********************************************************************
182 ** 函数名 :读一个字节数据
183 ** 入口参数: 无
184 ** 注意 :
185 ** 说明 :
186 ********************************************************************
187 */
188 uchar I2cReadByte( void )
189 {
190 1 uchar rbyte = 0;
191 1 uchar i = 0;
192 1 for(i = 0; i < 8; i++ )
193 1 {
194 2 rbyte = rbyte << 1; //非常注意...此语句不放在循环体内最后.
195 2
196 2 SDA = 1; //SDA为输入
197 2
198 2 SCL = 1;
199 2 NOP_5;
200 2
201 2 if( SDA == 1 )
202 2 rbyte = rbyte | 0x01;
203 2
204 2 SCL = 0;
205 2 }
206 1
207 1 return rbyte;
208 1 }
209
210
211 /*
212 ********************************************************************
213 ** 函数名 :写一个字节数据到某器件某地址
214 ** 入口参数: 器件地址DeviceAddress 字节地址ByteAddress
215 ** 出口参数: 读到的字节数据rdata
216 ** 注意 :
217 ** 说明 :I2cWriteDataToAddr( 0xa0, 0x08, 'a' );
218 ********************************************************************
219 */
220 uchar I2cReadDataFromAddr( uchar DeviceAddress, uint ByteAddress )
221 {
222 1 uchar rdata;
223 1
224 1 I2cStart();
225 1 I2cWriteByte( DeviceAddress );
226 1 WaitAsk(); //等待应答
227 1 I2cWriteByte( ByteAddress >> 8 ); //高8位
228 1 WaitAsk();
229 1 I2cWriteByte( ByteAddress ); //低8位
230 1 WaitAsk();
231 1
232 1 I2cStart();
233 1 I2cWriteByte( DeviceAddress | 0x01 ); //读
234 1 WaitAsk();
235 1 rdata = I2cReadByte();
236 1 SendNoAsk(); //不发送应答信号
237 1 I2cStop();
238 1
239 1 return rdata;
240 1 }
241
C51 COMPILER V7.06 24C64 11/10/2008 22:12:04 PAGE 5
242 /*
243 ********************************************************************
244 ** 函数名 :连续写字节数据到某器件某地址之后的好几个单元
245 ** 入口参数: 器件地址DeviceAddress 字节地址ByteAddress 要写的字节数据取址*Wdata 字节数据的个数n
246 ** 注意 :里面加有5ms延时。
247 ** 说明 :I2cWriteDataToAddr( 0xa0, 0x08, "hebei is a big pig!", 20 );
248 ********************************************************************
249 */
250 void I2c_Write_n( uchar DeviceAddress, uint ByteAddress, uchar *Wdata, uchar n )
251 {
252 1 uchar i = 0;
253 1 I2cStart();
254 1 I2cWriteByte( DeviceAddress );
255 1 WaitAsk(); //等待应答
256 1 I2cWriteByte( ByteAddress >> 8 ); //高8位
257 1 WaitAsk();
258 1 I2cWriteByte( ByteAddress ); //低8位
259 1 WaitAsk();
260 1
261 1 for( i = 0; i < n; i++ )
262 1 {
263 2 I2cWriteByte( *Wdata );
264 2 WaitAsk();
265 2 Wdata++;
266 2 }
267 1
268 1 I2cStop();
269 1
270 1 delay_5ms(); //发觉这里要加一小段延时,如果不加,则可以在外面加。
271 1 }
272
273 /*
274 ********************************************************************
275 ** 函数名 :写一个字节数据到某器件某地址
276 ** 入口参数: 器件地址DeviceAddress 字节地址ByteAddress
277 ** 出口参数: 读到的字节数据rdata
278 ** 注意 :
279 ** 说明 :I2c_Read_n( 0xa0, 0x0003, a, 10 ) //uchar a[10];
280 ********************************************************************
281 */
282 void I2c_Read_n( uchar DeviceAddress, uint ByteAddress, uchar *rdatabuf, uchar n )
283 {
284 1 uchar i = 0;
285 1
286 1 I2cStart(); //启动总线
287 1 I2cWriteByte( DeviceAddress );
288 1 WaitAsk(); //等待应答
289 1 I2cWriteByte( ByteAddress >> 8 ); //高8位
290 1 WaitAsk();
291 1 I2cWriteByte( ByteAddress ); //低8位
292 1 WaitAsk();
293 1
294 1 I2cStart(); //重新启动
295 1 I2cWriteByte( DeviceAddress | 0x01 ); //读
296 1 WaitAsk();
297 1
298 1 for( i = 0; i < n; i++ )
299 1 {
300 2 *rdatabuf = I2cReadByte();
301 2 SendAsk(); //连续发送应答信号
302 2 rdatabuf++;
303 2 }
C51 COMPILER V7.06 24C64 11/10/2008 22:12:04 PAGE 6
304 1
305 1 I2cStop();
306 1 }
307
308
309
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 370 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 14
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 + -