?? i2c.lst
字號:
C51 COMPILER V7.50 I2C 10/08/2006 08:51:39 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN i2c.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "i2c.h"
2 /*I2C總線初始化程序*/
3
4 /*延時函數(shù)*/
5
6
7 void delay(void)
8 {
9 1 ;
10 1 }
11
12 /*停止信號函數(shù)*/
13 void I_stop(void)
14 {
15 1 SDA=0; delay( );
16 1 SCL=1; delay( );
17 1 SDA=1; delay( );
18 1 }
19
20
21 /*起始信號函數(shù)*/
22 void I_start(void)
23 {
24 1 SCL=1; delay( );
25 1 SDA=0; delay( );
26 1 SCL=0; delay( );
27 1 }
28
29
30 void I_init(void)
31 {
32 1 SCL=0;
33 1 I_stop();
34 1 }
35
36
37
38 /*提供i2c總線的時鐘信號并返回在時鐘電平為高期間SDA信號線上的狀態(tài)*/
39 bit I_clock(void)reentrant
40 {
41 1 bit idata sample;
42 1 SCL =1;
43 1 delay( );
44 1 sample=SDA;
45 1 SCL =0;
46 1 delay( );
47 1 return(sample);
48 1 }
49
50 /*應答信號函數(shù)*/
51 void I_ACK(void)
52 {
53 1 SDA=0;
54 1 I_clock();
55 1 SDA=1;
C51 COMPILER V7.50 I2C 10/08/2006 08:51:39 PAGE 2
56 1 }
57
58 /*時鐘信號函數(shù)*/
59
60
61
62 /*數(shù)據(jù)發(fā)送函數(shù)*/
63 /*向I2C總線發(fā)送8位數(shù)據(jù),并請求一個應答信號ACK,如果收到ACK應答,表示發(fā)送成功,并返回1*/
64
65 bit I_send(uchar I_data)
66 {
67 1 register uchar send_num;
68 1 for(send_num=0;send_num<8;send_num++)
69 1 {
70 2 SDA=(bit)(I_data&0x80);
71 2
72 2 I_data=I_data<<1;
73 2 I_clock( );
74 2 }
75 1
76 1 SDA=1;
77 1 return (~I_clock());
78 1 }
79
80
81 /*數(shù)據(jù)接收函數(shù)*/
82 /*從I2C總線上接收8位數(shù)據(jù),將接收到的數(shù)據(jù)作為1個字節(jié)返回值*/
83 uchar I_receive(void)
84 {
85 1 register uchar rec_num;
86 1 uchar I_data=0;
87 1
88 1 for(rec_num=0;rec_num<8;rec_num++)
89 1 {
90 2 I_data*=2;
91 2 if(I_clock()) I_data++;
92 2 }
93 1 return(I_data);
94 1 }
95
96
97
98
99 /* 器件從地址和片內(nèi)地址寫入函數(shù)發(fā)出起始信號后,若地址寫入成功
100 則返回1,否則返回0*///
101
102 bit W_address(uchar wpage, uchar WStAddress)
103 {
104 1 I_start( );
105 1 if(I_send(wpage))
106 1 {
107 2 return(I_send(WStAddress));
108 2 }
109 1 else
110 1 return(0);
111 1 }
112
113
114
115 ////////////////////////////////////////////////////////////////////
116 /*5ms延時函數(shù)*/
117
C51 COMPILER V7.50 I2C 10/08/2006 08:51:39 PAGE 3
118
119 /*void wait_5ms(void)
120 {
121 register int i;
122 for(i=0;i<1000;i++)
123 {; }
124 } */
125
126
127 void wait_1ms(void)
128 {
129 1 register int i;
130 1 for(i=0;i<100;i++)
131 1 {; }
132 1 }
133 ////////////////////////////////////////////////////////////////////
134
135 ////////////////////////////////////////////////////////////////////
136 bit Wblock(uchar wpage, uchar WSAdd , uchar *StartChar, uchar length)reentrant
137 {
138 1
139 1 register uchar Wnum;
140 1 ////////////////////////////////////////////////////////////////////
141 1 /*將映象數(shù)組中前l(fā)ength個字節(jié)數(shù)據(jù)寫入24C16A的StartAddress前l(fā)ength個單元*/
142 1
143 1
144 1 I_init();
145 1
146 1
147 1 if (W_address(wpage,WSAdd))
148 1 {
149 2 for(Wnum=0;Wnum<length;Wnum++)
150 2 {
151 3 if(I_send(StartChar[Wnum])) ;
152 3 else
153 3 {
154 4 I_stop();
155 4 return 0 ;
156 4 }
157 3 }
158 2 I_stop();
159 2 return 1;
160 2 }
161 1
162 1 I_stop();
163 1 return 0 ;
164 1 }
165 ////////////////////////////////////////////////////////////////////
166 void W_block(uchar wpage, uchar WSAdd, uchar *StartChar, uchar length)reentrant
167 {
168 1 register uchar i;
169 1 uchar addr=0,nextchar=0,len=0;
170 1 if((length%16)==0)
171 1 {
172 2 len=length/16;
173 2 for(i=0;i<len;i++)
174 2 {
175 3 Wblock(wpage, WSAdd+addr ,&StartChar[nextchar],16);
176 3 nextchar+=16;
177 3 addr+=16;
178 3 wait_1ms();
179 3 }
C51 COMPILER V7.50 I2C 10/08/2006 08:51:39 PAGE 4
180 2 }
181 1 else
182 1 {
183 2 len=(length/16)+1;
184 2 for(i=0;i<len;i++)
185 2 {
186 3 if(i==(len-1))
187 3 {
188 4 Wblock(wpage, WSAdd+addr ,&StartChar[nextchar],length%16);
189 4 wait_1ms();
190 4 }
191 3 else
192 3 {
193 4 Wblock(wpage, WSAdd+addr ,&StartChar[nextchar],16);
194 4 nextchar+=16;
195 4 addr+=16;
196 4 wait_1ms();
197 4 }
198 3 }
199 2 }
200 1
201 1
202 1 }
203
204 ////////////////////////////////////////////////////////////////////
205 /*將映象數(shù)組中前l(fā)ength個字節(jié)數(shù)據(jù)寫入24C16A的前l(fā)ength個單元*/
206 bit R_block(uchar wpage,uchar rpage, uchar RStAddress, uchar StartChar[], uchar length)reentrant
207 {
208 1
209 1 register uchar Rnum;
210 1
211 1 I_init();
212 1
213 1 if (W_address(wpage,RStAddress))
214 1 {
215 2 I_start();
216 2 if (I_send(rpage))
217 2 {
218 3 for( Rnum=0;Rnum<length ;Rnum++)
219 3 {
220 4 StartChar[Rnum]=I_receive();
221 4 if (Rnum < (length-1)) I_ACK();
222 4 }
223 3 I_stop();
224 3 return 1;
225 3 }
226 2
227 2 }
228 1
229 1 I_stop();
230 1 return 0 ;
231 1
232 1 }
233
234
235
236 ////////////////////////////////////////////////////////////////////
237
238
239
C51 COMPILER V7.50 I2C 10/08/2006 08:51:39 PAGE 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 761 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -