📄 comram.lst
字号:
C51 COMPILER V7.50 COMRAM 03/17/2008 11:03:29 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE COMRAM
OBJECT MODULE PLACED IN ComRam.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE ComRam.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /****************************************************************************************
2 File: ComRam.c
3 Description:用来读写公共RAM的IIC程序。
4 Author: ganzi535@qq.com Joehill.Net@qq.com
5 Date: September,2007
6 ****************************************************************************************/
7 #include<string.h>
8 #include <SM89516A.h>
9 #include<intrins.h>
10 #include"SerialPort.h"
11
12 #define uchar unsigned char
13 #define uint unsigned int
14
15 #define WRITE 0xa0
16 #define READ 0xa1
17 #define DELAY 5
18
19 /*端口位定义*/
20 sbit SCL=P0^0; /*模拟I2C时钟控制位*/
21 sbit SDA=P0^1; /*模拟I2C数据传送位*/
22
23 bit AckCom; /*应答标志位*/
24
25
26 /****************************************************************************************
27 功能:ComStart,起动总线函数.
28 描述:启动I2C总线,即发送I2C起始条件.
29 参数:无
30 返回:无
31 ****************************************************************************************/
32 void ComStart()
33 {
34 1 SDA=1; /*发送起始条件的数据信号*/
35 1 Delay(DELAY);
36 1
37 1 SCL=1; /*起始条件建立时间大于4.7us,延时*/
38 1 Delay(DELAY);
39 1
40 1 SDA=0; /*发送起始信号*/ /* 起始条件锁定时间大于4μs*/
41 1 Delay(DELAY);
42 1
43 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
44 1 Delay(DELAY);
45 1 }
46
47 /****************************************************************************************
48 功能:ComStop,结束总线函数.
49 描述:结束I2C总线,即发送I2C结束条件.
50 参数:无
51 返回:无
52 ****************************************************************************************/
53 void ComStop()
54 {
55 1 SDA=0; /*发送结束条件的数据信号*/
C51 COMPILER V7.50 COMRAM 03/17/2008 11:03:29 PAGE 2
56 1 Delay(DELAY);
57 1
58 1 SCL=1; /*结束条件建立时间大于4μs*/
59 1 Delay(DELAY);
60 1
61 1 SDA=1; /*发送I2C总线结束信号*/
62 1 Delay(DELAY);
63 1 }
64
65 /****************************************************************************************
66 功能:ComSendByte,字节数据传送函数.
67 描述:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答
68 或者非应答都使ack=0 假)发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
69 参数:c---需要发送的字符。
70 返回:无
71 ****************************************************************************************/
72 void ComSendByte(uchar c)
73 {
74 1 uchar BitCnt;
75 1
76 1 for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
77 1 {
78 2 if((c<<BitCnt)&0x80) //判断发送位*/
79 2 SDA=1;
80 2 else
81 2 SDA=0;
82 2
83 2 Delay(DELAY);
84 2 SCL=1; //置时钟线为高,通知被控器开始接收数据位保证时钟高电平周期大于4μ
85 2
86 2 Delay(DELAY);
87 2 SCL=0;
88 2 }
89 1
90 1 Delay(DELAY);
91 1 SDA=1; //8位发送完后释放数据线,准备接收应答位
92 1 Delay(DELAY);
93 1
94 1 SCL=1;
95 1 Delay(DELAY);
96 1
97 1 if(SDA==1) //判断是否接收到应答信号
98 1 AckCom=0;
99 1 else
100 1 AckCom=1;
101 1
102 1 SCL=0;
103 1 Delay(DELAY);
104 1 }
105
106 /****************************************************************************************
107 功能:ComRcvByte,字节数据传送函数。
108 描述:用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数。
109 参数:无
110 返回:无
111 ****************************************************************************************/
112 uchar ComRcvByte()
113 {
114 1 uchar retc;
115 1 uchar BitCnt;
116 1
117 1 retc=0;
C51 COMPILER V7.50 COMRAM 03/17/2008 11:03:29 PAGE 3
118 1 SDA=1; //置数据线为输入方式
119 1
120 1 for(BitCnt=0;BitCnt<8;BitCnt++)
121 1 {
122 2 Delay(DELAY);
123 2 SCL=0; //置时钟线为低,准备接收数据位,时钟低电平周期大于4.7μs
124 2 Delay(DELAY);
125 2
126 2 SCL=1; //置时钟线为高使数据线上数据有效
127 2 Delay(DELAY);
128 2
129 2 retc=retc<<1;
130 2
131 2 if(SDA==1)
132 2 retc=retc+1; //读数据位,接收的数据位放入retc中
133 2 Delay(DELAY);
134 2 }
135 1
136 1 SCL=0;
137 1 Delay(DELAY);
138 1
139 1 return(retc);
140 1 }
141
142 /****************************************************************************************
143 功能:ComAck,应答子函数。
144 描述:主控器进行应答信号,(可以是应答或非应答信号)。
145 参数:a---应答与否,a==1应答,a==0不应答。
146 返回:无
147 ****************************************************************************************/
148 void ComAck(bit a)
149 {
150 1
151 1 if(a==0) //在此发出应答或非应答信号
152 1 SDA=0;
153 1 else
154 1 SDA=1;
155 1
156 1 Delay(DELAY);
157 1
158 1 SCL=1; //时钟低电平周期大于4μs
159 1 Delay(DELAY);
160 1
161 1 SCL=0; //清时钟线,钳住I2C总线以便继续接收
162 1 Delay(DELAY);
163 1 }
164
165 /****************************************************************************************
166 功能:ComWriteOneByte,向有子地址器件发送字节数据函数。
167 描述:从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.如果返回1表示操作成功,否
168 则操作有误,使用前必须已结束总线。
169 参数:sla---器件地址;c---发送的字符。
170 返回:无
171 ****************************************************************************************/
172 bit ComWriteOneByte(uint sla,uchar c)
173 {
174 1 ComStart(); //启动总线
175 1
176 1 ComSendByte(WRITE);
177 1 if(AckCom==0)return(0); //发送器件地址
178 1
179 1 ComSendByte(sla>>8);
C51 COMPILER V7.50 COMRAM 03/17/2008 11:03:29 PAGE 4
180 1 if(AckCom==0)return(0); //高address
181 1
182 1 ComSendByte(sla);
183 1 if(AckCom==0)return(0); //low address
184 1
185 1 ComSendByte(c);
186 1 if(AckCom==0)return(0); //发送数据
187 1
188 1 ComStop(); //结束总线
189 1 return(1);
190 1 }
191
192 /****************************************************************************************
193 功能:ComWriteBytes,向有子地址器件发送多字节数据函数。
194 描述:从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址sla,子地址suba,发送
195 内容是s指向的内容,发送no个字节。 如果返回1表示操作成功,否则操作有误。使用前必须已
196 结束总线。
197 参数:suba---子地址,s---指向发送的内容,no---发送字符个数。
198 返回:写成功则返回1,否则返回0.
199 ****************************************************************************************/
200 bit ComWriteBytes(uint suba,uchar *s,uchar no)
201 {
202 1 uchar i;
203 1
204 1 ComStart();
205 1
206 1 ComSendByte(WRITE);
207 1 if(AckCom==0)return(0);
208 1
209 1 ComSendByte(suba>>8);
210 1 if(AckCom==0)return(0);
211 1
212 1 ComSendByte(suba);
213 1 if(AckCom==0)return(0);
214 1
215 1 for(i=0;i<no;i++)
216 1 {
217 2 ComSendByte(*s);
218 2 if(AckCom==0)return(0);
219 2 s++;
220 2 }
221 1
222 1 ComStop();
223 1 return(1);
224 1 }
225
226 /****************************************************************************************
227 功能:ComReadOneByte,向无子地址器件读字节数据函数。
228 描述:从启动总线到发送地址,读数据,结束总线的全过程,从器件地址sla,返回值在c.如果返回1表
229 示操作成功,否则操作有误。使用前必须已结束总线。
230 参数:sla---器件地址。
231 返回:返回读取的字符。
232 ****************************************************************************************/
233 uchar ComReadOneByte(uint sla)
234 {
235 1 uchar x;
236 1 ComStart(); //启动总线
237 1
238 1 ComSendByte(WRITE);
239 1 if(AckCom==0)return(0); //发送器件地址
240 1
241 1 ComSendByte(sla>>8);
C51 COMPILER V7.50 COMRAM 03/17/2008 11:03:29 PAGE 5
242 1 if(AckCom==0)return(0); //高address
243 1
244 1 ComSendByte(sla);
245 1 if(AckCom==0)return(0); //low address
246 1
247 1 ComStart();
248 1
249 1 ComSendByte(READ);
250 1 if(AckCom==0)return(0);
251 1
252 1 x=ComRcvByte();
253 1 return x;
254 1
255 1 }
256
257 /****************************************************************************************
258 功能:ComReadBytes,向有子地址器件读取多字节数据函数。
259 描述:从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址sla,子地址suba,读
260 出的内容放入s指向的存储区,读no个字节。使用前必须已结束总线。
261 参数:suba---子地址,s---指向发送的内容,no---发送字符个数。
262 返回:如果返回1表示操作成功,否则操作有误。
263 ****************************************************************************************/
264 bit ComReadBytes(uint suba,uchar *s,uchar no)
265 {
266 1 uchar i;
267 1
268 1 ComStart();
269 1
270 1 ComSendByte(WRITE);
271 1 if(AckCom==0)return(0);
272 1
273 1 ComSendByte(suba>>8);
274 1 if(AckCom==0)return(0);
275 1
276 1 ComSendByte(suba);
277 1 if(AckCom==0)return(0);
278 1
279 1 ComStart();
280 1
281 1 ComSendByte(READ);
282 1 if(AckCom==0)return(0);
283 1
284 1 for(i=0;i<no-1;i++)
285 1 {
286 2 *s=ComRcvByte();
287 2 ComAck(0);
288 2 s++;
289 2 }
290 1
291 1 *s=ComRcvByte();
292 1 ComAck(1);
293 1
294 1 ComStop();
295 1 return(1);
296 1 }
297
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 597 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
C51 COMPILER V7.50 COMRAM 03/17/2008 11:03:29 PAGE 6
PDATA SIZE = ---- ----
DATA SIZE = ---- 23
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -