📄 iic.lst
字号:
C51 COMPILER V7.09 IIC 08/24/2007 09:33:28 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN IIC.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE IIC.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg51.h>
2 #include"IIC.h"
3
4 //短延时函数:ShortDelay()
5 void nNop(uint i)
6 {
7 1 for(;i>0;i--) ;
8 1 }
9
10 //长延时函数:LongDelay()
11 void LongDelay(uint i)
12 {
13 1 uint j;
14 1 for(;i>0;i--)
15 1 { for(j=1000;j>0;j--);}
16 1 }
17
18 //IC起始信号:
19 void StartIIC(void)
20 {
21 1 PinSDA = 1;
22 1 nNop(20);
23 1 PinSCL = 1;
24 1 nNop(20);
25 1 PinSDA = 0;
26 1 nNop(20);
27 1 PinSCL = 0;
28 1 //nNop(50);
29 1 }
30
31 //IIC停止信号:
32 void StopIIC(void)
33 {
34 1 PinSDA = 0;
35 1 nNop(20);
36 1 PinSCL = 1;
37 1 nNop(20);
38 1 PinSDA = 1;
39 1 nNop(50);
40 1 }
41
42 //读取从机应答信号函数:
43 bit GetACK(void)
44 {
45 1 bit ack;
46 1 PinSDA = 1;
47 1 PinSCL = 1;
48 1 nNop(50);
49 1 ack = PinSDA;
50 1 PinSCL = 0;
51 1 nNop(50);
52 1 return(ack);
53 1 }
54
55 //向IIC总线发出应答信号函数:
C51 COMPILER V7.09 IIC 08/24/2007 09:33:28 PAGE 2
56 void PutACK(bit ack)
57 {
58 1 PinSDA = ack;
59 1 PinSCL = 1;
60 1 nNop(50);
61 1 PinSCL = 0;
62 1 nNop(50);
63 1 }
64
65 //初始化IIC总线函数:
66 void InitIIC(void)
67 {
68 1 PinSCL = 1;
69 1 nNop(10);
70 1 PinSDA = 1;
71 1 nNop(50);
72 1 }
73
74 //功能向IIC总线写一字节数据函数:
75 void IIC_WriteByte(uchar temp)
76 {
77 1 uchar i;
78 1 for(i=0;i<8;i++)
79 1 {
80 2 PinSDA = (bit)(temp & 0x80);
81 2 temp = temp << 1;
82 2 nNop(20);
83 2 PinSCL = 1;
84 2 nNop(20);
85 2 PinSCL = 0;
86 2 //nNop(50);
87 2 }
88 1 }
89
90 //从IIC总线读一字节数据函数:
91 uchar IIC_ReadByte(void)
92 {
93 1 uchar i;
94 1 uchar temp;
95 1 PinSDA = 1;
96 1 for(i=0;i<8;i++)
97 1 {
98 2 temp = temp << 1;
99 2 PinSCL = 1;
100 2 while(PinSDA) temp++;
101 2 PinSCL = 0;
102 2 nNop(20);
103 2 }
104 1 return(temp);
105 1 }
106
107 //向IIC总线上的从机写多字节数据函数:
108 bit IIC_Puts(uchar SlaveAddr, uchar SubAddr, uint size, uchar *dat)
109 {
110 1 uchar i;
111 1
112 1 //确保从机地址最低位是0
113 1 SlaveAddr &= 0xfe;
114 1
115 1 //启动I2C总线
116 1 StartIIC();
117 1
C51 COMPILER V7.09 IIC 08/24/2007 09:33:28 PAGE 3
118 1 //发送从机地址
119 1 IIC_WriteByte(SlaveAddr);
120 1 if ( GetACK() )
121 1 {
122 2 StopIIC();
123 2 return 1;
124 2 }
125 1
126 1 //发送子地址
127 1 IIC_WriteByte(SubAddr);
128 1 if ( GetACK() )
129 1 {
130 2 StopIIC();
131 2 return 1;
132 2 }
133 1
134 1 //发送数据
135 1 for(i=0;i<size;i++)
136 1 {
137 2 IIC_WriteByte(*dat++);
138 2 if ( GetACK() )
139 2 {
140 3 StopIIC();
141 3 return 1;
142 3 }
143 2 }
144 1
145 1 //发送完毕,停止I2C总线,返回
146 1 StopIIC();
147 1 return 0;
148 1 }
149
150 //从IIC总线上的从机读多字节数据函数:
151 bit IIC_Gets(uchar SlaveAddr, uchar SubAddr, uint size, uchar *dat)
152 {
153 1 //确保从机地址最低位是0
154 1 SlaveAddr &= 0xfe;
155 1
156 1 //启动I2C总线
157 1 StartIIC();
158 1
159 1 //发送从机地址
160 1 IIC_WriteByte(SlaveAddr);
161 1 if ( GetACK() )
162 1 {
163 2 StopIIC();
164 2 return 1;
165 2 }
166 1
167 1 //发送子地址
168 1 IIC_WriteByte(SubAddr);
169 1 if ( GetACK() )
170 1 {
171 2 StopIIC();
172 2 return 1;
173 2 }
174 1
175 1 //发送重复起始条件
176 1 StartIIC();
177 1
178 1 //发送从机地址
179 1 SlaveAddr |= 0x01;
C51 COMPILER V7.09 IIC 08/24/2007 09:33:28 PAGE 4
180 1 IIC_WriteByte(SlaveAddr);
181 1 if ( GetACK() )
182 1 {
183 2 StopIIC();
184 2 return 1;
185 2 }
186 1
187 1 //接收数据
188 1 for(;;)
189 1 {
190 2 *dat++ = IIC_ReadByte();
191 2 if ( --size == 0 )
192 2 {
193 3 PutACK(1);
194 3 break;
195 3 }
196 2 PutACK(0);
197 2 }
198 1
199 1 //接收完毕,停止I2C总线,返回
200 1 StopIIC();
201 1 return 0;
202 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 384 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 14
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -