📄 iic.lst
字号:
161 //返回:无
162 //***********************************************************************************/
163 void write_byte0()
164 {
165 1 SDA=0;
166 1 SCL=1;
167 1 delay_nop(4); //根椐晶振时钟来修订延时时间 SDA=4.7us
168 1 SCL=0;
169 1 }
170 //***********************************************************************************
171 //功能:XX子程序
172 //描述:SCL=P3^6,SDA=P3^7;特别要留意时序和时钟频率,本子程序,用户无需调用
173 //参数:无
174 //返回:无
175 //***********************************************************************************/
176 void write_byte1()
177 {
C51 COMPILER V7.06 IIC 11/15/2007 11:32:38 PAGE 4
178 1 SDA=1;
179 1 SCL=1;
180 1 delay_nop(4); //根椐晶振时钟来修订延时时间 SDA=4.7us
181 1 SCL=0;
182 1 SDA=0;
183 1 }
184 //***********************************************************************************
185 //功能:读取一个字节数据子程序
186 //描述:SCL=P3^6,SDA=P3^7;特别要留意时序和时钟频率,本子程序,用户无需调用
187 //参数:无
188 //返回:无
189 //***********************************************************************************/
190 uchar read_byte()
191 {
192 1 uchar nn=0xff,mm=0x80,uu=0x7f;
193 1 uchar j;
194 1 uint q=0;
195 1 for(j=0;j<8;j++)
196 1 {
197 2 SDA=1;
198 2 SCL=1;
199 2 if(SDA==0)
200 2 {
201 3 nn=(nn&uu);
202 3 nn=_crol_(nn,1);
203 3 SCL=0;
204 3 }
205 2 else
206 2 {
207 3 nn=(nn|mm);
208 3 nn=_crol_(nn,1);
209 3 SCL=0;
210 3 }
211 2 }
212 1 return(nn);
213 1 }
214 //***********************************************************************************
215 //功能:写第N个字节数据子程序
216 //描述:SCL=P3^6,SDA=P3^7;特别要留意时序和时钟频率,本子程序,用户无需调用
217 //参数:无
218 //返回:无
219 //***********************************************************************************/
220 void write_bytea(uchar CS_I2C,uchar temp[],uchar n)
221 {
222 1 do{
223 2 iic_start();
224 2 write_byte(CS_I2C);
225 2 check_ack();
226 2 }while(F0==1);
227 1 write_byte(temp[n]);
228 1 check_ack();
229 1 }
230 //***********************************************************************************
231 //功能:发送N个数据字节子程序
232 //描述:CS_I2C,ic_addr,number,send_data,用户只需调用本子程序即可
233 //参数:发送N个字节 CS_I2C为24C02 IC地址,ic_addr为单元地址,number为连续寻址字节数,
234 // 但不能超过各种IC的每页字节数. send_data[]为发送数据来源,CS_I2C选中哪个芯片及
235 // 读写命令
236 //返回:无
237 //***********************************************************************************/
238 void write_N_byte(uchar CS_I2C,uchar ic_addr,uchar number,uchar send_data[])
239 {
C51 COMPILER V7.06 IIC 11/15/2007 11:32:38 PAGE 5
240 1 uchar idata k;
241 1 do{
242 2 iic_start();
243 2 write_byte(CS_I2C); //1010 0000/1
244 2 check_ack();
245 2 }while(F0==1);
246 1 do{
247 2 write_byte(ic_addr);
248 2 check_ack();
249 2 }while(F0==1);
250 1 for(k=0;k<number;k++)
251 1 {
252 2 write_byte(send_data[k]);
253 2 check_ack();
254 2 while(F0==1)
255 2 {
256 3 write_bytea(CS_I2C,send_data,k);
257 3 }
258 2 }
259 1 iic_stop();
260 1 }
261 //***********************************************************************************
262 //功能:接收N个字数据节子程序
263 //描述:CS_I2C,ic_addr,number,send_data,用户只需调用本子程序即可
264 //参数:发送N个字节 CS_I2C为24C02 IC地址,ic_addr为单元地址,number为连续寻址字节数,
265 // 但不能超过各种IC的每页字节数. send_data[]为发送数据来源,CS_I2C选中哪个芯片及
266 // 读写命令
267 //返回:无
268 //***********************************************************************************/
269 void read_N_byte(uchar CS_I2C,uchar ic_addr,uchar number,uchar incept_data[])
270 //uchar number,ic_addr,CS_I2C,incept_data[];
271 {
272 1 uchar idata data0,l;
273 1 do{
274 2 iic_start();
275 2 write_byte(CS_I2C);
276 2 check_ack();
277 2 }while(F0==1);
278 1 do{
279 2 write_byte(ic_addr);
280 2 check_ack();
281 2 }while(F0==1);
282 1
283 1 do{
284 2 iic_start();
285 2 write_byte(CS_I2C+1);
286 2 check_ack();
287 2 }while(F0==1);
288 1 for(l=0;l<number;l++)
289 1 {
290 2 data0=read_byte();
291 2 incept_data[l]=data0;
292 2 if(l<(number-1))
293 2 {
294 3 send_ack();
295 3 }
296 2 }
297 1 nsend_ack();
298 1 iic_stop();
299 1 }
300 /**********************************************************************************
301 功能:单步延时子程序
C51 COMPILER V7.06 IIC 11/15/2007 11:32:38 PAGE 6
302 调用:delay_nop(unsigned char step);
303 描述:在程序中可通过调用此程序来达到极短时间的延时效果,如:delay_nop(1);
304 参数:unsigned char step
305 返回:无
306 备注:通过更改delay_nop(unsigned char step)中step的值来改变时间的长短
307 ***********************************************************************************/
308 void delay_nop(unsigned char step)
309 {
310 1 unsigned char i;
311 1 for(i=0;i<step;i++);
312 1 }
313
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 504 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 21
IDATA SIZE = ---- 3
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 + -