📄 i2c.lst
字号:
C51 COMPILER V8.02 I2C 02/09/2007 11:18:00 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN E:\WORK\程序\计重通~1\I2C.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE E:\WORK\程序\计重通~1\I2C.C DB SB OE
line level source
1 #include<head.h>
2 #include<I2C.H>
3 #include <function.h>
4 #include<LCD_1621.h>
5 //#include<ex.h>
6 //#include<modi.h>
7
8 bit E_err;
9
10 /**************************************************************************
11 * 函数原型:void I_start(void);
12 * 功 能:提供I2C总线工作时序中的起始位。
13 **************************************************************************/
14 void I_start(void)
15 {
16 1 SCL=HIGH;
17 1 _nop_();
18 1 _nop_();
19 1 SDA=LOW;
20 1 _nop_();
21 1 _nop_();
22 1 SCL=LOW;
23 1 _nop_();
24 1 _nop_();
25 1 }
26
27
28 /**************************************************************************
29 * 函数原型:void I_stop(void);
30 * 功 能:提供I2C总线工作时序中的停止位。
31 **************************************************************************/
32 void I_stop(void)
33 {
34 1 SDA=LOW;
35 1 _nop_();
36 1 _nop_();
37 1 SCL=HIGH;
38 1 _nop_();
39 1 _nop_();
40 1 SDA=HIGH;
41 1 _nop_();
42 1 _nop_();
43 1 SCL=LOW;
44 1 _nop_();
45 1 _nop_();
46 1 }
47
48 /**************************************************************************
49 * 函数原型:void I_init(void);
50 * 功 能:I2C总线初始化。在main()函数中应首先调用本函数,然后再用
51 * I2C其它函数。
52 **************************************************************************/
53 void I_init(void)
54 {
55 1 WP=0;
C51 COMPILER V8.02 I2C 02/09/2007 11:18:00 PAGE 2
56 1 SCL=LOW;
57 1 _nop_();
58 1 I_stop();
59 1 }
60
61 /**************************************************************************
62 * 函数原型:bit I_clock(void);
63 * 功 能:提供I2C总线的时钟信号,并返回在时钟电平为高期间SDA信号线上状
64 * 态。本函数可用于数据发送,也可用于数据接收。
65 **************************************************************************/
66 bit I_clock(void)
67 {
68 1 bit sample;
69 1 SCL=HIGH;
70 1 _nop_();
71 1 _nop_();
72 1 _nop_();
73 1 sample=SDA;
74 1 SCL=LOW;
75 1 _nop_();
76 1 _nop_();
77 1 _nop_();
78 1 return(sample);
79 1 }
80
81 /**************************************************************************
82 * 函数原型:bit I_send(Uchar I_data);
83 * 功 能:向I2C总线发送8位数据,并请求一个应答信号ACK。如果收到ACK应答,
84 * 则返回1(TRUE),否则返回0(FALSE)。
85 **************************************************************************/
86 bit I_send(Uchar I_data)
87 {
88 1 Uchar i;
89 1 /*发送8位数据*/
90 1 for(i=0;i<8;i++)
91 1 {
92 2 SDA=(bit)(I_data&0x80);
93 2 I_data=I_data<<1;
94 2 I_clock();
95 2 _nop_();
96 2 _nop_();
97 2 }
98 1 /*请求应答信号ACK*/
99 1 SDA=HIGH;
100 1 for(i=0;i<3;i++)
101 1 {
102 2 if(!I_clock())return 1;
103 2 delayms(1);
104 2 }
105 1 E_err=1;
106 1 return 0;
107 1 //return(~I_clock());
108 1 }
109
110 /**************************************************************************
111 * 函数原型:Uchar I_receive(void);
112 * 功 能:从I2C总线上接收8位数据信号,并将接收到的8位数据作为一个字节
113 * 返回,不回送应答信号ACK。主函数在调用本函数这前应保证SDA信
114 * 号线处于浮置状态。
115 **************************************************************************/
116 Uchar I_receive(void)
117 {
C51 COMPILER V8.02 I2C 02/09/2007 11:18:00 PAGE 3
118 1 register Uchar I_data=0;
119 1 register Uchar i;
120 1 for(i=0;i<8;i++)
121 1 {
122 2 I_data*=2;
123 2 _nop_();
124 2 _nop_();
125 2 if(I_clock())
126 2 I_data++;
127 2 }
128 1 return(I_data);
129 1 }
130
131
132
133
134 /**************************************************************************
135 * 函数原型:void E_address(Uchar Address);
136 * 功 能:向24C02写入器件地址和一个指定的字节地址。
137 **************************************************************************/
138 void E_address(Uchar Address)
139 {
140 1 I_start();
141 1 I_send(WRITE);
142 1 I_send(Address);
143 1 }
144 /**************************************************************************
145 * 函数原型:void E_writeex(Uchar Address,Uchar *E_data,Uchar datan);
146 * 功 能:将 24C02 以Address起始的空间读入e_data指向的空间
147 **************************************************************************/
148 void E_writeex(Uchar Address,Uchar *E_data,Uchar datan)
149 {
150 1 Uchar i;
151 1 for(i=0;i<datan;i++)
152 1 {
153 2 E_write(Address+i,*(E_data+i));
154 2 delayms(10);
155 2 }
156 1 }
157 /**************************************************************************
158 * 函数原型:void E_readex(Uchar Address,Uchar *E_data,Uchar datan);
159 * 功 能:将E_data所指向的内容写入 24C02 以Address起始的空间
160 **************************************************************************/
161 void E_readex(Uchar Address,Uchar *E_data,Uchar datan)
162 {
163 1 Uchar i;
164 1 for(i=0;i<datan;i++)
165 1 {
166 2 *(E_data+i)=E_read(Address+i);
167 2 }
168 1 }
169 /**************************************************************************
170 * 函数原型:void E_write(Uchar Address,Uchar E_data);
171 * 功 能:将E_data内容写入到24C02的Address单元以及与它相对应的两个备份单元
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -