📄 wdi2c.lst
字号:
C51 COMPILER V7.06 WDI2C 12/23/2003 08:42:55 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE WDI2C
OBJECT MODULE PLACED IN .\wdi2c.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE .\wdi2c.c DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2
3 #include<intrins.h>
4
5 #define uint unsigned int
6 #define uchar unsigned char
7
8
9 sbit sda= P1^4;
10 sbit scl= P1^5;
11
12 sbit ac0=ACC^0; /*定义ACC的位,利用ACC操作速度最快*/
13 sbit ac1=ACC^1;
14 sbit ac2=ACC^2;
15 sbit ac3=ACC^3;
16 sbit ac4=ACC^4;
17 sbit ac5=ACC^5;
18 sbit ac6=ACC^6;
19 sbit ac7=ACC^7;
20
21
22
23 void delay();
24
25
26
27 void i2c_start(void); /*起始*/
28 void i2c_stop(void); /*停止*/
29 bit wait_ack(void); /*等待24c02应答*/
30 void send_ack(void); /*向24c02发送应答*/
31 void sendnot_ack(void); /*向24c02发送非应答*/
32 void i2c_sendbyte(uchar ch);/*写发送移位*/
33 uint i2c_readbyte(void); /*读移位*/
34
35 uint i2c_read(uchar address);
36 bit i2c_write(uchar address,uint fb);
37
38
39
40 void i2c_start(void)
41 {
42 1
43 1 sda=1;
44 1 scl=1;
45 1 delay();
46 1 sda=0;
47 1 delay();
48 1 scl=0;
49 1 delay();
50 1 }
51
52
53
54 void i2c_stop(void)
55 {
C51 COMPILER V7.06 WDI2C 12/23/2003 08:42:55 PAGE 2
56 1 scl=0;
57 1 _nop_();
58 1 sda=0;
59 1 delay();
60 1 scl=1;
61 1 delay();
62 1 sda=1;
63 1
64 1 }
65
66
67 bit wait_ack(void)
68 {
69 1 uchar i;
70 1 scl=0;
71 1 _nop_();
72 1 _nop_();
73 1 sda=1;
74 1 delay();
75 1 scl=1;
76 1 delay();
77 1 while(sda)
78 1 {
79 2 for(i=0;i<=5;i++)
80 2 {
81 3 if(!sda)
82 3 {
83 4 scl=0;
84 4 return(0);
85 4 }
86 3 }
87 2
88 2 return(1);
89 2 }
90 1 scl=0;
91 1 return(0);
92 1 }
93
94 void send_ack(void)
95 {
96 1 sda=0;
97 1 delay();
98 1 scl=1;
99 1 delay();
100 1 scl=0;
101 1 }
102
103
104 void sendnot_ack(void)
105 {
106 1 sda=1;
107 1 delay();
108 1 scl=1;
109 1 delay();
110 1 scl=0;
111 1 }
112
113
114 void i2c_sendbyte(uchar ch)
115 {
116 1 ACC=ch;
117 1
C51 COMPILER V7.06 WDI2C 12/23/2003 08:42:55 PAGE 3
118 1 sda=ac7;_nop_();scl=1;delay();scl=0;delay();
119 1 sda=ac6;_nop_();scl=1;delay();scl=0;delay();
120 1 sda=ac5;_nop_();scl=1;delay();scl=0;delay();
121 1 sda=ac4;_nop_();scl=1;delay();scl=0;delay();
122 1 sda=ac3;_nop_();scl=1;delay();scl=0;delay();
123 1 sda=ac2;_nop_();scl=1;delay();scl=0;delay();
124 1 sda=ac1;_nop_();scl=1;delay();scl=0;delay();
125 1 sda=ac0;_nop_();scl=1;delay();scl=0;delay();
126 1 }
127
128
129 uint i2c_readbyte(void)
130 {
131 1 uint sf;
132 1 sda=1;_nop_();_nop_();
133 1 scl=1;delay();ac7=sda;scl=0;delay();
134 1 scl=1;delay();ac6=sda;scl=0;delay();
135 1 scl=1;delay();ac5=sda;scl=0;delay();
136 1 scl=1;delay();ac4=sda;scl=0;delay();
137 1 scl=1;delay();ac3=sda;scl=0;delay();
138 1 scl=1;delay();ac2=sda;scl=0;delay();
139 1 scl=1;delay();ac1=sda;scl=0;delay();
140 1 scl=1;delay();ac0=sda;scl=0;delay();
141 1 sf=ACC;
142 1 return(sf);
143 1 }
144
145
146
147 void delay()
148 {
149 1 _nop_();
150 1 _nop_();
151 1 _nop_();
152 1 _nop_();
153 1 _nop_();
154 1 _nop_();
155 1
156 1
157 1
158 1
159 1
160 1 }
161
162
163
164 uint i2c_read(uchar address)
165 {
166 1 uchar dd=0xa0;
167 1 uchar dc=0xa1;
168 1 uint ae;
169 1 uint ar;
170 1 i2c_start();
171 1 i2c_sendbyte(dd);
172 1 if(wait_ack())
173 1 {
174 2 i2c_stop();
175 2 return(0);
176 2 }
177 1 i2c_sendbyte(address);
178 1 if(wait_ack())
179 1 {
C51 COMPILER V7.06 WDI2C 12/23/2003 08:42:55 PAGE 4
180 2 i2c_stop();
181 2 return(0);
182 2 }
183 1 i2c_stop();
184 1 delay();
185 1 i2c_start();
186 1 i2c_sendbyte(dc);
187 1 if(wait_ack())
188 1 {
189 2 i2c_stop();
190 2 return(0);
191 2 }
192 1 ae=i2c_readbyte();
193 1 send_ack();
194 1 ar=i2c_readbyte();
195 1 sendnot_ack();
196 1 i2c_stop();
197 1 ar=ar<<8;
198 1 return(ar+ae);
199 1 }
200
201
202 bit i2c_write(uchar address,uint fb)
203 {
204 1 uchar dd=0xa0;
205 1 uchar ae;
206 1 uchar ar;
207 1 ae=(uchar)fb;
208 1 fb=(fb>>8);
209 1 ar=(uchar)fb;
210 1 i2c_start();
211 1 i2c_sendbyte(dd);
212 1 if(wait_ack())
213 1 {
214 2 i2c_stop();
215 2 return(0);
216 2 }
217 1 i2c_sendbyte(address);
218 1 if(wait_ack())
219 1 {
220 2 i2c_stop();
221 2 return(0);
222 2 }
223 1 i2c_sendbyte(ae);
224 1 if(wait_ack())
225 1 {
226 2 i2c_stop();
227 2 return(0);
228 2 }
229 1 i2c_sendbyte(ar);
230 1 if(wait_ack())
231 1 {
232 2 i2c_stop();
233 2 return(0);
234 2 }
235 1 i2c_stop();
236 1 return(1);
237 1 }
238
239
C51 COMPILER V7.06 WDI2C 12/23/2003 08:42:55 PAGE 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 515 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 11
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 + -