📄 iic.lst
字号:
C51 COMPILER V7.50 IIC 12/04/2007 21:53:32 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 LARGE OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND
line level source
1 #define IIC_READ 0XA1 //定义读指令
2 #define IIC_WRITE 0XA0 //定义写指令
3 #define NOP _nop_()
4 #define uchar unsigned char
5 #define uint unsigned int
6 #include "reg52.h"
7 #define IIC_READ 0XA1 //定义读指令
8 #define IIC_WRITE 0XA0 //定义写指令
9 #define NOP _nop_()
10 uchar readbyteseq(uint add,uchar *ptr,uint readlen);
11 uchar writebyteseq(uint add,uchar *ptr,uint writelen);
12 void delay10ms(void);
13 //#define SDA INT0
14 //#define SCL T0
15 //==============================
16 uchar xdata buff[2000]; //save the byte read out form iic device in test operation
17 uchar xdata readbuff[232];//测试数组,暂存写入读出数据
18 //uchar writebuff[32];
19 //===============================
20 sbit SDA=P3^5;//P2^7; //THE SDA BIT IS PORT 2 BIT 7
21 sbit SCL=P3^4;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
22 sbit SEN=P3^3;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
23 sbit STE=P3^2;//P2^6; //THE SCL BIT IS PORT 2 BIT 6
24 uchar bdata bbyte;//定义位操作用数组,采用此方法可提高位操作速度
25 sbit a0=bbyte^0;
26 sbit a1=bbyte^1;
27 sbit a2=bbyte^2;
28 sbit a3=bbyte^3;
29 sbit a4=bbyte^4;
30 sbit a5=bbyte^5;
31 sbit a6=bbyte^6;
32 sbit a7=bbyte^7;
33 //========================================
34 bit IFACK; //record the SDA state to confirn if ACK has happened
35 bit NO_ACK; //no ack flag
36 bit BUS_FAULT; //bus fault flag
37 //========================================
38 void start(void)
39 {
40 1 SCL=0;
41 1 SDA=1;
42 1 SCL=1;
43 1 SDA=0;
44 1 SCL=0;
45 1 }
46 //=======================================
47 //FUNCTION:ROUTES TO PROVIDE A STOP SIGNAL
48 void stop(void)
49 {
50 1 SCL=0;
51 1 SDA=0;
52 1 SCL=1;
53 1 SDA=1;
54 1 SCL=0;
55 1 }
C51 COMPILER V7.50 IIC 12/04/2007 21:53:32 PAGE 2
56 //=====================================
57 //FUNCTION:ROUTES TO PROVIDE ACK SINGAL
58 void ack(void)
59 {
60 1 SCL=0;
61 1 SDA=0;
62 1 SCL=1;
63 1 SCL=0;
64 1 }
65 //=====================================
66 //FUNCTION:ROUTES TO RELEASE THE SDA TO RECEIVE A ACK SIGNAL
67 // OR TO PROVIDE A NO_ACK SIGNAL
68 //type=1等待应答信号
69 //type=0 产生无应答信号
70 void nack(uchar type)
71 {
72 1 SCL=0;
73 1 SDA=1;
74 1 SCL=1;
75 1 IFACK=SDA;
76 1 SCL=0;
77 1 if(type)
78 1 {
79 2 if(IFACK)//如果无应答信号,则置标志位NO_ACK,程序中止
80 2 {
81 3 NO_ACK=1;//用户可以加入自己的异常处理程序
82 3 //while(1);
83 3 }
84 2 else NO_ACK=0;
85 2 }
86 1 }
87 //=======================================================
88 //FUNCTION:THE IIC DEVICE SHIFT OUT A BYTE TO THE MASTER
89 uchar inbyte(void) {//从IIC器件中读出数据
90 1 SDA=1;
91 1 SCL=1;
92 1 a7=SDA;
93 1 SCL=0;
94 1 SCL=1;
95 1 a6=SDA;
96 1 SCL=0;
97 1 SCL=1;
98 1 a5=SDA;
99 1 SCL=0;
100 1 SCL=1;
101 1 a4=SDA;
102 1 SCL=0;
103 1 SCL=1;
104 1 a3=SDA;
105 1 SCL=0;
106 1 SCL=1;
107 1 a2=SDA;
108 1 SCL=0;
109 1 SCL=1;
110 1 a1=SDA;
111 1 SCL=0;
112 1 SCL=1;
113 1 a0=SDA;
114 1 SCL=0;
115 1 return(bbyte);
116 1 }
117 //=======================================================
C51 COMPILER V7.50 IIC 12/04/2007 21:53:32 PAGE 3
118 //FUNCTION:THE IIC DEVICE SHIFT IN A BYTE FROM THE MASTER
119 void outbyte(uchar outdata) {//将数据写放IIC器件
120 1 bbyte=outdata;
121 1 SDA=a7;
122 1 SCL=1;
123 1 SCL=0;
124 1 SDA=a6;
125 1 SCL=1;
126 1 SCL=0;
127 1 SDA=a5;
128 1 SCL=1;
129 1 SCL=0;
130 1 SDA=a4;
131 1 SCL=1;
132 1 SCL=0;
133 1 SDA=a3;
134 1 SCL=1;
135 1 SCL=0;
136 1 SDA=a2;
137 1 SCL=1;
138 1 SCL=0;
139 1 SDA=a1;
140 1 SCL=1;
141 1 SCL=0;
142 1 SDA=a0;
143 1 SCL=1;
144 1 SCL=0;
145 1 }
146 /*
147 //======================================================
148 //FUNCTION:BYTE WRITE. 'add' THE WRITE ADDRESS, 'wbyte' THE DATA WANT TO WRITE
149 void writebyte(uint add,uchar wbyte)//add为写入地址,wbyte为写入数据
150 {
151 uchar temph,templ;
152 temph=(uchar)(add/256);
153 templ=(uchar)(add%256);
154 if(!STE)
155 return;
156 SEN=0;
157 if(!STE)
158 {
159 SEN=1;
160 SCL=1;
161 SDA=1;
162 return;
163 }
164 start(); //开始信号
165 outbyte(IIC_WRITE|(temph<<1)); //写命令
166 nack(1); //等待应答
167 outbyte(templ); //写地址
168 nack(1);
169 outbyte(wbyte); //写数据
170 nack(1); //等待应答
171 stop(); //停止信号
172 SCL=1;
173 SDA=1;
174 SEN=1;
175 }
176 //=====================================================
177 //FUNCTION:RANDOM READ.'add' IS THE ADDRESS WANT TO READ
178 uchar readbyte (uint add)//add为读地址
179 {
C51 COMPILER V7.50 IIC 12/04/2007 21:53:32 PAGE 4
180 uchar temp,temph,templ;
181 temph=(uchar)(add/256);
182 templ=(uchar)(add%256);
183 if(!STE)
184 return 0XFF;
185 SEN=0;
186 if(!STE)
187 {
188 SCL=1;
189 SDA=1;
190 SEN=1;
191 return 0XFF;
192 }
193 start(); //开始信号
194 outbyte(IIC_WRITE|(temph<<1)); //写命令
195 nack(1); //等待应答
196 outbyte(templ); //写地址
197 nack(1);
198 start(); //开始信号
199 outbyte(IIC_READ|(temph<<1)); //读命令
200 nack(1); //等待应答
201 temp=inbyte(); //读数据
202 nack(0); //无应答
203 stop(); //停止信号
204 SEN=1;
205 SCL=1;
206 SDA=1;
207 return(temp);
208 }
209 */
210 //=================================================
211 //连写函数
212 //add为读起始地址,ptr数据保存指针,writelen为写入数据长度
213 uchar writebyteseq(uint add,uchar *ptr,uint writelen)
214 {
215 1 //uchar temp;
216 1 uchar temph,templ;
217 1 uint i;
218 1 temph=(uchar)(add/256);
219 1 templ=(uchar)(add%256);
220 1 if(!STE)
221 1 return 0XFF;
222 1 SEN=0;
223 1 if(!STE)
224 1 {
225 2 SCL=1;
226 2 SDA=1;
227 2 SEN=1;
228 2 return 0XFF;
229 2 }
230 1 start();
231 1 outbyte(IIC_WRITE|(temph<<1));
232 1 nack(1);
233 1 outbyte(templ);
234 1 nack(1);
235 1 for(i=0;i<writelen;i++)
236 1 {
237 2 outbyte(*(ptr+i));
238 2 nack(1);
239 2 }
240 1
241 1 stop();
C51 COMPILER V7.50 IIC 12/04/2007 21:53:32 PAGE 5
242 1 SCL=1;
243 1 SDA=1;
244 1 SEN=1;
245 1 return 0;
246 1 }
247 //=================================================
248 //连读函数
249 //add为读起始地址,ptr数据保存指针,writelen为读出数据长度
250 uchar readbyteseq(uint add,uchar *ptr,uint readlen)
251 {
252 1
253 1 xdata uchar temph,templ;
254 1 uint i;
255 1 EA=0;
256 1
257 1 temph=(uchar)(add/256);
258 1 templ=(uchar)(add%256);
259 1 if(!STE)
260 1 {
261 2 SCL=1;
262 2 SDA=1;
263 2 SEN=1;
264 2 return 0XFF;
265 2 }
266 1 SEN=0;
267 1 if(!STE)
268 1 {
269 2 SCL=1;
270 2 SDA=1;
271 2 SEN=1;
272 2 return 0XFF;
273 2 }
274 1 start();
275 1 outbyte(IIC_WRITE|(temph<<1));
276 1 nack(1);
277 1 outbyte(templ);
278 1 nack(1);
279 1 start();
280 1 outbyte(IIC_READ|(temph<<1));
281 1 nack(1);
282 1 for(i=0;i<readlen-1;i++)
283 1 {
284 2 *(ptr+i)=inbyte();
285 2 ack();
286 2
287 2 }
288 1 *(ptr+readlen-1)=inbyte();
289 1 nack(0);
290 1 stop();
291 1 SCL=1;
292 1 SDA=1;
293 1 SEN=1;
294 1 return 0;
295 1 }
296 //=======================================================
297 //THIS IS A TEST OPERATION
298
299 void delay10ms(void)
300 {
301 1 xdata int i;
302 1 for(i=0;i<1000;i++)
303 1 ;
C51 COMPILER V7.50 IIC 12/04/2007 21:53:32 PAGE 6
304 1 }
305 //=======================================================
306 //THIS IS A TEST OPERATION
307
308
309
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 527 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 2232 14
PDATA SIZE = ---- ----
DATA SIZE = 1 ----
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 + -