📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 08/08/2007 15:38:24 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h>
2 #include <stdio.h>
3 #include <absacc.h>
4 #include <intrins.h>
5 #define uchar unsigned char
6 #define uint unsigned int
7 //************************变量声明***************************
8 //读写控制命令
9 const uchar WR24C02 = 0xA0; //EEPROM地址+写命令
10 const uchar RD24C02 = 0xA1; //EEPROM地址+读命令
11 //I/O口定义
12 sbit I2C_SCL = P1^1;
13 sbit I2C_SDA = P1^0;
14 //用户变量声明
15 bit ErrorBit; //读写错误标志 1错误 0 正确
16 uchar idata ErrorCode; //错误码
17 //************************函数声明***************************
18 void Start(void);
19 void Stop(void);
20 void Ack(void);
21 void NoAck(void);
22 void TestAck(void);
23 void Write_I2c(uchar date);
24 uchar Read_I2c(void);
25 void DelayMs(uchar time);
26 void Write_Date(uchar StartAddress,uchar *date,uchar bytes);
27 void Read_Date(uchar StartAddress,uchar *date,uchar bytes);
28 #endif
*** WARNING C312 IN LINE 28 OF main.c: misplaced endif control
29 /*...................................................*/
30 void Start(void)
31 {
32 1 I2C_SDA = 1; //起始条件的数据信号
33 1 _nop_();
34 1 I2C_SCL = 1; //起始条件时钟信号
35 1 _nop_(); //信号建立时间>4.7us
36 1 _nop_();
37 1 _nop_();
38 1 _nop_();
39 1 _nop_();
40 1 I2C_SDA = 0; //起始信号
41 1 _nop_();
42 1 _nop_();
43 1 _nop_();
44 1 _nop_();
45 1 _nop_();
46 1 I2C_SCL = 0; //钳住I2C总线, 准备发送或者接受数据
47 1 _nop_();
48 1 _nop_();
49 1 }
50 /***************************************
51 *函数名称: void Stop(void)
52 *功能描述: 读写结束
53 *输入: 无
54 *输出: 无
C51 COMPILER V7.50 MAIN 08/08/2007 15:38:24 PAGE 2
55 *全局变量: I2C_SCL,I2C_SDA
56 *调用模块: 无
57
58 ****************************************/
59 void Stop(void)
60 {
61 1 I2C_SDA = 0; //结束条件的数据信号
62 1 _nop_();
63 1 I2C_SCL = 1; //结束条件的时钟信号
64 1 _nop_();
65 1 _nop_();
66 1 _nop_();
67 1 _nop_();
68 1 _nop_();
69 1 I2C_SDA = 1; //结束信号
70 1 _nop_();
71 1 _nop_();
72 1 _nop_();
73 1 _nop_();
74 1 }
75 /***************************************
76 *函数名称: void Ack(void)
77 *功能描述: 正确应答,读一个字节后必须应答
78 *输入: 无
79 *输出: 无
80 *全局变量: I2C_SCL,I2C_SDA
81 *调用模块: 无
82
83 ****************************************/
84 void Ack(void)
85 {
86 1 I2C_SDA = 0;
87 1 _nop_();
88 1 _nop_();
89 1 I2C_SCL = 1;
90 1 _nop_();
91 1 _nop_();
92 1 _nop_();
93 1 _nop_();
94 1 _nop_();
95 1 I2C_SCL = 0;
96 1 _nop_();
97 1 _nop_();
98 1 }
99 /***************************************
100 *函数名称: void NoAck(void)
101 *功能描述: 无应答
102 *输入: 无
103 *输出: 无
104 *全局变量: I2C_SCL,I2C_SDA
105 *调用模块: 无
106
107 ****************************************/
108 void NoAck(void)
109 {
110 1 I2C_SDA = 1;
111 1 _nop_();
112 1 _nop_();
113 1 I2C_SCL = 1;
114 1 _nop_();
115 1 _nop_();
116 1 _nop_();
C51 COMPILER V7.50 MAIN 08/08/2007 15:38:24 PAGE 3
117 1 _nop_();
118 1 _nop_();
119 1 I2C_SCL = 0;
120 1 _nop_();
121 1 _nop_();
122 1 }
123 /***************************************
124 *函数名称: void TestAck(void)
125 *功能描述: 读写错误测试,写一个字节应该测试应答信号
126 *输入: 无
127 *输出: 返回一个位
128 *全局变量: I2C_SCL,I2C_SDA
129 *调用模块: 无
130
131 ****************************************/
132 void TestAck(void)
133 {
134 1 I2C_SDA = 1;
135 1 _nop_();
136 1 _nop_();
137 1 I2C_SCL = 1;
138 1 _nop_();
139 1 _nop_();
140 1 _nop_();
141 1 ErrorBit=I2C_SDA;
142 1 I2C_SCL=0;
143 1 _nop_();
144 1 _nop_();
145 1 }
146 /***************************************
147 *函数名称: void Write_I2c(uchar date)
148 *功能描述: 写I2C
149 *输入: 待送数据,高字节先送
150 *输出: 无
151 *全局变量: I2C_SCL,I2C_SDA
152 *调用模块: 无
153
154 ****************************************/
155 void Write_I2c(uchar date)
156 {
157 1 uchar i;
158 1 for(i=0;i<8;i++)
159 1 {
160 2 I2C_SDA=date&0x80; //送数据到数据线上
161 2 date<<=1;
162 2 _nop_();
163 2 I2C_SCL = 1; //置时钟信号为高电平,使数据有效
164 2 _nop_();
165 2 _nop_();
166 2 _nop_();
167 2 _nop_();
168 2 _nop_();
169 2 I2C_SCL = 0;
170 2 _nop_();
171 2 _nop_();
172 2
173 2 }
174 1 }
175 /***************************************
176 *函数名称: uchar Read_I2c(void)
177 *功能描述: 读I2C
178 *输入: 无
C51 COMPILER V7.50 MAIN 08/08/2007 15:38:24 PAGE 4
179 *输出: 返回一个字节的数据,高字节在前
180 *全局变量: I2C_SCL,I2C_SDA
181 *调用模块: 无
182
183 ****************************************/
184 uchar Read_I2c(void)
185 {
186 1 uchar i;
187 1 uchar byte=0;
188 1 for(i=0;i<8;i++)
189 1 {
190 2 I2C_SCL=0; //置时钟为低电平,准备接受数据
191 2 _nop_();
192 2 _nop_();
193 2 _nop_();
194 2 _nop_();
195 2 _nop_();
196 2 I2C_SCL = 1; //置时钟为高电平,使数据线数据有效
197 2 _nop_();
198 2 _nop_();
199 2 byte <<=1;
200 2 byte|=I2C_SDA;
201 2 _nop_();
202 2 _nop_();
203 2 I2C_SCL = 0;
204 2 }
205 1 return(byte);
206 1 }
207 /***************************************
208 *函数名称: void DelayMs(uchar time)
209 *功能描述: 延时
210 *输入: 延时时间
211 *输出: 无
212 *全局变量: 无
213 *调用模块: 无
214
215 ****************************************/
216 void DelayMs(uchar time)
217 {
218 1 uchar i;
219 1 do
220 1 {
221 2 for(i=0;i<125;i++); //*延时 8us x 125 = 1ms
222 2 }
223 1 while(time--);
224 1 }
225 /***************************************
226 *函数名称: void Write_Date(uchar StartAddress,uchar *date,uchar bytes)
227 *功能描述: 写数据
228 *输入: 数据开始地址,保存数据指针,数据字节数
229 *输出: 无
230 *全局变量: 无
231 *调用模块: Start(),Write_I2c(),Stop(),TestAck()
232 *注意事项: 调用之前,需要定义一个数组,用来存待发送的数据
233 ****************************************/
234 void Write_Date(uchar StartAddress,uchar *date,uchar bytes)
235 {
236 1 uchar i=0;
237 1 Start();
238 1 Write_I2c(WR24C02);
239 1 TestAck();
240 1 Write_I2c(StartAddress);
C51 COMPILER V7.50 MAIN 08/08/2007 15:38:24 PAGE 5
241 1 TestAck();
242 1 for(i=0;i<bytes;i++)
243 1 {
244 2 Write_I2c(*date);
245 2 TestAck();
246 2 date++;
247 2 }
248 1 Stop();
249 1 DelayMs(20);
250 1 }
251 /***************************************
252 *函数名称: void Read_Date(uchar StartAddress,uchar *date,uchar bytes)
253 *功能描述: 读数据
254 *输入: 数据开始地址,读取数据指针,数据字节数
255 *输出: 无
256 *全局变量: 无
257 *调用模块: Start(),Write_I2c(),Read_I2c(),Ack(),NoAck(),Stop(),TestAck()
258 *注意事项: 调用之前,需要定义一个数组,用来存读取的数据
259 ****************************************/
260 void Read_Date(uchar StartAddress,uchar *date,uchar bytes)
261 {
262 1 uchar i;
263 1 Start();
264 1 Write_I2c(WR24C02);
265 1 TestAck();
266 1 Write_I2c(StartAddress);
267 1 TestAck();
268 1 Write_I2c(RD24C02);
269 1 TestAck();
270 1 for (i=0;i<bytes;i++)
271 1 {
272 2 *date=Read_I2c();
273 2 Ack();
274 2 date++;
275 2 }
276 1 NoAck();
277 1 Stop();
278 1 DelayMs(10);
279 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 271 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 10
IDATA SIZE = 1 ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -