📄 iic.lst
字号:
C51 COMPILER V7.50 IIC 11/14/2007 11:29:07 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN iic.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE iic.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 本项目专门为本站的51 PIC AVR 多功能学习开发板而写,仅供参考,请勿做商业用途,欢迎转载但要保留本站信息
3 志博电子专注于8位单片机开发板设计和教学
4 让人耳目一心的经济又豪华型开发板
5 性价比最高
6 仅售378!
7 欢迎访问我们的网站 www.elecmcu.com
8 */
9 #define IIC_READ 0XA1 //定义读指令
10 #define IIC_WRITE 0XA0 //定义写指令
11 #define NOP _nop_()
12 #define uchar unsigned char
13 #define uint unsigned int
14 #include "reg52.h"
15 #define IIC_READ 0XA1 //定义读指令
16 #define IIC_WRITE 0XA0 //定义写指令
17 #define NOP _nop_()
18 uchar readbyteseq(uint add,uchar *ptr,uint readlen);
19 uchar writebyteseq(uint add,uchar *ptr,uint writelen);
20 void delay10ms(void);
21 //#define SDA INT0
22 //#define SCL T0
23 //==============================
24 uchar xdata buff[2000]; //save the byte read out form iic device in test operation
25 uchar xdata readbuff[232];//测试数组,暂存写入读出数据
26 //uchar writebuff[32];
27 //===============================
28 sbit SDA=P3^5;//P2^7; //THE SDA BIT IS PORT 2 BIT 7
29 sbit SCL=P3^4;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
30 sbit SEN=P3^3;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
31 sbit STE=P3^2;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
32 uchar bdata bbyte;//定义位操作用数组,采用此方法可提高位操作速度
33 sbit a0=bbyte^0;
34 sbit a1=bbyte^1;
35 sbit a2=bbyte^2;
36 sbit a3=bbyte^3;
37 sbit a4=bbyte^4;
38 sbit a5=bbyte^5;
39 sbit a6=bbyte^6;
40 sbit a7=bbyte^7;
41 //========================================
42 bit IFACK; //record the SDA state to confirn if ACK has happened
43 bit NO_ACK; //no ack flag
44 bit BUS_FAULT; //bus fault flag
45 //========================================
46 void start(void)
47 {
48 1 SCL=0;
49 1 SDA=1;
50 1 SCL=1;
51 1 SDA=0;
52 1 SCL=0;
53 1 }
54 //=======================================
55 //FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
C51 COMPILER V7.50 IIC 11/14/2007 11:29:07 PAGE 2
56 void stop(void)
57 {
58 1 SCL=0;
59 1 SDA=0;
60 1 SCL=1;
61 1 SDA=1;
62 1 SCL=0;
63 1 }
64 //=====================================
65 //FUNCTION:ROUTES TO PROVIDE ACK SINGAL
66 void ack(void)
67 {
68 1 SCL=0;
69 1 SDA=0;
70 1 SCL=1;
71 1 SCL=0;
72 1 }
73 //=====================================
74 //FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL
75 // OR TO PROVIDE A NO_ACK SIGNAL
76 //type=1等待应答信号
77 //type=0 产生无应答信号
78 void nack(uchar type)
79 {
80 1 SCL=0;
81 1 SDA=1;
82 1 SCL=1;
83 1 IFACK=SDA;
84 1 SCL=0;
85 1 if(type)
86 1 {
87 2 if(IFACK)//如果无应答信号,则置标志位NO_ACK,程序中止
88 2 {
89 3 NO_ACK=1;//用户可以加入自己的异常处理程序
90 3 //while(1);
91 3 }
92 2 else NO_ACK=0;
93 2 }
94 1 }
95 //=======================================================
96 //FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE TO THE MASTER
97 uchar inbyte(void) {//从IIC器件中读出数据
98 1 SDA=1;
99 1 SCL=1;
100 1 a7=SDA;
101 1 SCL=0;
102 1 SCL=1;
103 1 a6=SDA;
104 1 SCL=0;
105 1 SCL=1;
106 1 a5=SDA;
107 1 SCL=0;
108 1 SCL=1;
109 1 a4=SDA;
110 1 SCL=0;
111 1 SCL=1;
112 1 a3=SDA;
113 1 SCL=0;
114 1 SCL=1;
115 1 a2=SDA;
116 1 SCL=0;
117 1 SCL=1;
C51 COMPILER V7.50 IIC 11/14/2007 11:29:07 PAGE 3
118 1 a1=SDA;
119 1 SCL=0;
120 1 SCL=1;
121 1 a0=SDA;
122 1 SCL=0;
123 1 return(bbyte);
124 1 }
125 //=======================================================
126 //FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER
127 void outbyte(uchar outdata) {//将数据写放IIC器件
128 1 bbyte=outdata;
129 1 SDA=a7;
130 1 SCL=1;
131 1 SCL=0;
132 1 SDA=a6;
133 1 SCL=1;
134 1 SCL=0;
135 1 SDA=a5;
136 1 SCL=1;
137 1 SCL=0;
138 1 SDA=a4;
139 1 SCL=1;
140 1 SCL=0;
141 1 SDA=a3;
142 1 SCL=1;
143 1 SCL=0;
144 1 SDA=a2;
145 1 SCL=1;
146 1 SCL=0;
147 1 SDA=a1;
148 1 SCL=1;
149 1 SCL=0;
150 1 SDA=a0;
151 1 SCL=1;
152 1 SCL=0;
153 1 }
154 /*
155 //======================================================
156 //FUNCTION:BYTE WRITE. 'add' THE WRITE ADDRESS, 'wbyte' THE DATA WANT TO WRITE
157 void writebyte(uint add,uchar wbyte)//add为写入地址,wbyte为写入数据
158 {
159 uchar temph,templ;
160 temph=(uchar)(add/256);
161 templ=(uchar)(add%256);
162 if(!STE)
163 return;
164 SEN=0;
165 if(!STE)
166 {
167 SEN=1;
168 SCL=1;
169 SDA=1;
170 return;
171 }
172 start(); //开始信号
173 outbyte(IIC_WRITE|(temph<<1)); //写命令
174 nack(1); //等待应答
175 outbyte(templ); //写地址
176 nack(1);
177 outbyte(wbyte); //写数据
178 nack(1); //等待应答
179 stop(); //停止信号
C51 COMPILER V7.50 IIC 11/14/2007 11:29:07 PAGE 4
180 SCL=1;
181 SDA=1;
182 SEN=1;
183 }
184 //=====================================================
185 //FUNCTION:RANDOM READ.'add' IS THE ADDRESS WANT TO READ
186 uchar readbyte (uint add)//add为读地址
187 {
188 uchar temp,temph,templ;
189 temph=(uchar)(add/256);
190 templ=(uchar)(add%256);
191 if(!STE)
192 return 0XFF;
193 SEN=0;
194 if(!STE)
195 {
196 SCL=1;
197 SDA=1;
198 SEN=1;
199 return 0XFF;
200 }
201 start(); //开始信号
202 outbyte(IIC_WRITE|(temph<<1)); //写命令
203 nack(1); //等待应答
204 outbyte(templ); //写地址
205 nack(1);
206 start(); //开始信号
207 outbyte(IIC_READ|(temph<<1)); //读命令
208 nack(1); //等待应答
209 temp=inbyte(); //读数据
210 nack(0); //无应答
211 stop(); //停止信号
212 SEN=1;
213 SCL=1;
214 SDA=1;
215 return(temp);
216 }
217 */
218 //=================================================
219 //连写函数
220 //add为读起始地址,ptr数据保存指针,writelen为写入数据长度
221 uchar writebyteseq(uint add,uchar *ptr,uint writelen)
222 {
223 1 //uchar temp;
224 1 data uchar temph,templ;
225 1 data uint i;
226 1 temph=(uchar)(add/256);
227 1 templ=(uchar)(add%256);
228 1 if(!STE)
229 1 return 0XFF;
230 1 SEN=0;
231 1 if(!STE)
232 1 {
233 2 SCL=1;
234 2 SDA=1;
235 2 SEN=1;
236 2 return 0XFF;
237 2 }
238 1 start();
239 1 outbyte(IIC_WRITE|(temph<<1));
240 1 nack(1);
241 1 outbyte(templ);
C51 COMPILER V7.50 IIC 11/14/2007 11:29:07 PAGE 5
242 1 nack(1);
243 1 for(i=0;i<writelen;i++)
244 1 {
245 2 outbyte(*(ptr+i));
246 2 SCL=0;
247 2 SDA=1;
248 2 SCL=1;
249 2 SCL=0;
250 2 //nack(1);
251 2 }
252 1
253 1 stop();
254 1 SCL=1;
255 1 SDA=1;
256 1 SEN=1;
257 1 return 0;
258 1 }
259 //=================================================
260 //连读函数
261 //add为读起始地址,ptr数据保存指针,writelen为读出数据长度
262 uchar readbyteseq(uint add,uchar *ptr,uint readlen)
263 {
264 1
265 1 xdata uchar temph,templ;
266 1 uint i;
267 1
268 1 temph=(uchar)(add/256);
269 1 templ=(uchar)(add%256);
270 1 if(!STE)
271 1 {
272 2 SCL=1;
273 2 SDA=1;
274 2 SEN=1;
275 2 return 0XFF;
276 2 }
277 1 SEN=0;
278 1 if(!STE)
279 1 {
280 2 SCL=1;
281 2 SDA=1;
282 2 SEN=1;
283 2 return 0XFF;
284 2 }
285 1 start();
286 1 outbyte(IIC_WRITE|(temph<<1));
287 1 nack(1);
288 1 outbyte(templ);
289 1 nack(1);
290 1 start();
291 1 outbyte(IIC_READ|(temph<<1));
292 1 nack(1);
293 1 for(i=0;i<readlen-1;i++)
294 1 {
295 2 *(ptr+i)=inbyte();
296 2 ack();
297 2
298 2 }
299 1 *(ptr+readlen-1)=inbyte();
300 1 nack(0);
301 1 stop();
302 1 SCL=1;
303 1 SDA=1;
C51 COMPILER V7.50 IIC 11/14/2007 11:29:07 PAGE 6
304 1 SEN=1;
305 1 return 0;
306 1 }
307
308
309 void delay10ms(void)
310 {
311 1 xdata int i;
312 1 for(i=0;i<1000;i++)
313 1 ;
314 1 }
315
316
317
318
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 517 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 2232 4
PDATA SIZE = ---- ----
DATA SIZE = 1 14
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -