📄 i2c.lst
字号:
C51 COMPILER V7.07 I2C 03/22/2006 16:36:26 PAGE 1
C51 COMPILER V7.07, 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 <absacc.h>
2 #include <intrins.h>
3 #include "main.h"
4 #include "mcs51.h"
5 #include "i2c.h"
6
7 void i2c_writ2(uchar bat );
8 uchar i2c_rea2(bit ack) ;
9 void i2c_start(void);
10 #define ADDR 0x50
11
12
13 void i2c_start()
14 {
15 1 SCL=1;delay_5us();
16 1 SDA=1;delay_5us();
17 1 SDA=0;delay_5us();
18 1 SCL=0;delay_5us();
19 1 }
20 void i2c_stop()
21 {
22 1 SCL=0;//wu
23 1 SDA=0;delay_5us();
24 1 SCL=1;delay_5us();
25 1 SDA=1;delay_5us();
26 1
27 1
28 1 }
29 /**--------------------------------------------------------------------------------
30 调用方式:bit I2CAck(void) ﹫200 /07/0 4
31 函数说明:私有函数,I2C用,等待从器件接收方的应答
32 ---------------------------------------------------------------------------------*/
33
34 /**--------------------------------------------------------------------------------
35 调用方式:void SendAck(void) ﹫200 /07/0 4
36 函数说明:私有函数,I2C用,主器件为接收方,从器件为发送方时,非应答信号。
37 --------------------------------------------------------------------------------*/
38
39
40 //------------------------------------------------
41
42
43
44
45
46 void write_24c64(unsigned char adr,uchar dat)
47 {
48 1 //unsigned char add1;
49 1 //if(adr>0x1fff)
50 1 // return ;
51 1 //add1=adr>>8;
52 1 i2c_start();
53 1 i2c_writ2(0xa6);//
54 1 i2c_writ2(adr);
55 1 //add1=adr&0x00ff;
C51 COMPILER V7.07 I2C 03/22/2006 16:36:26 PAGE 2
56 1 //i2c_writ2(add1);
57 1 i2c_writ2(dat);
58 1 i2c_stop();
59 1 delay(30);//20
60 1 }
61
62 uchar read_24c64(unsigned char adr)
63 {
64 1 uchar i;
65 1 //if(adr>0x1fff)
66 1 //return 0x10;
67 1 //add1=adr>>8;
68 1 i2c_start();
69 1 i2c_writ2(0xa6);
70 1 //i2c_writ2(add1);
71 1 //add1=adr&0x00ff;
72 1 i2c_writ2(adr);
73 1 i2c_start();
74 1 i2c_writ2(0xa7);
75 1 i=i2c_rea2(0);
76 1 i2c_stop();
77 1 delay(5);
78 1 return i;
79 1 }
80
81 void i2c_writ2(uchar dat)
82 {
83 1 uchar i;
84 1 for(i=0;i<8;i++)
85 1 {
86 2 SDA=1;
87 2 if((dat&0x80)==0x00) SDA=0;
88 2 SCL=1;delay_5us();SCL=0;
89 2 dat=dat<<1;
90 2 }
91 1 SDA=1;
92 1 SCL=1;delay_5us();
93 1 SCL=0;delay_5us();
94 1 }
95
96 uchar i2c_rea2(bit ack)
97 {
98 1 uchar i,j;
99 1 j=0x00;
100 1 SDA=1;
101 1 for(i=0;i<8;i++)
102 1 {
103 2 SCL=1;
104 2 j=j<<1;
105 2 if(SDA) j|=0x01;
106 2 SCL=0;delay_5us();
107 2 }
108 1 if(ack) SDA=0;
109 1 SCL=1;delay_5us();
110 1 SCL=0;delay_5us();
111 1 return j;
112 1 }
113
114
115 void delay_5us()
116 {
117 1 uchar i;
C51 COMPILER V7.07 I2C 03/22/2006 16:36:26 PAGE 3
118 1 //for(i=0;i<2;i++){}
119 1 for(i=0;i<3;i++){}
120 1 }
121
122
123
124 //#define WCR0 0xa0
125 //#define WCR1 0xa4
126 /* ADDR EQU 01010000B
127 WCR0 EQU 10100000B
128 WCR1 EQU 10100100B*/
129
130
131
132
133 /*************************************************************************
134 * 函数原型:void START_I2C(void)
135 * 功 能:启动I2C总线
136 * 返 回 值:无
137 * 最后修改日期:2003-11-4
138 **************************************************************************/
139 /*
140 void START_I2C()
141 {
142 //EA=0;
143 SDA=1;
144 _nop_();
145 _nop_();
146 _nop_();
147 _nop_();
148 _nop_();
149 SCL=1;
150 _nop_();
151 _nop_();
152 _nop_();
153 _nop_();
154 _nop_();
155 SDA=0;
156 _nop_();
157 _nop_();
158 SCL=0;
159 }
160 */
161 /*************************************************************************
162 * 函数原型:void STOP_I2C(void)
163 * 功 能:停止I2C总线
164 * 返 回 值:无
165 * 最后修改日期:2003-11-4
166 **************************************************************************/
167 /*
168 void STOP_I2C()
169 {
170 SDA=0;
171 _nop_();
172 _nop_();
173 _nop_();
174 _nop_();
175 SCL=1;
176 _nop_();
177 _nop_();
178 _nop_();
179 _nop_();
C51 COMPILER V7.07 I2C 03/22/2006 16:36:26 PAGE 4
180 SDA=1;
181 _nop_();
182 //EA=1;
183 }
184 */
185 /*************************************************************************
186 * 函数原型:void CACK_I2C(void)
187 * 功 能:I2C总线MCU检查应答
188 * 返 回 值:1 成功
189 * 最后修改日期:2003-11-4
190 **************************************************************************/
191 /*bit CACK_I2C()
192 {
193 SDA=1;
194 _nop_();
195 _nop_();
196 _nop_();
197 SCL=1;
198 _nop_();
199 _nop_();
200 _nop_();
201 if(!SDA)/*有应答*/
202 /* {
203 _nop_();
204 _nop_();
205 SCL=0;
206 _nop_();
207 return(1);
208 }
209 _nop_();
210 _nop_();
211 SCL=0;
212 _nop_();
213 return(0);
214 }*/
215 /*************************************************************************
216 * 函数原型:void MACK_I2C(void)
217 * 功 能:I2C总线MCU作出应答
218 * 返 回 值:无
219 * 最后修改日期:2003-11-4
220 **************************************************************************/
221 /*void MACK_I2C()
222 {
223 SDA=0;
224 _nop_();
225 _nop_();
226 SCL=1;
227 _nop_();
228 _nop_();
229 _nop_();
230 _nop_();
231 SCL=0;
232 _nop_();
233 _nop_();
234 }*/
235 /*************************************************************************
236 * 函数原型:void SendData_I2C(void)
237 * 功 能:I2C总线MCU检查应答
238 * 返 回 值:无
239 * 最后修改日期:2003-11-4
240 **************************************************************************/
241 /*
C51 COMPILER V7.07 I2C 03/22/2006 16:36:26 PAGE 5
242 void SendData_I2C(uchar Data)
243 {
244 uchar i;
245 for(i=0;i<8;i++)
246 {
247 if(Data & 0x80)
248 {SDA=1;}
249 else
250 {SDA=0;}
251 _nop_();
252 _nop_();
253 _nop_();
254 _nop_();
255 SCL=1;
256 _nop_();
257 _nop_();
258 _nop_();
259 _nop_();
260 _nop_();
261 SCL=0;
262 _nop_();
263 _nop_();
264 Data=Data<<1;
265 }
266 SDA=1;//很奇怪,应答要加在这里才可以
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -