📄 comram.lst
字号:
C51 COMPILER V7.50 COMRAM 03/17/2008 20:43:15 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 bit Ack2; /*应答标志位*/
23
24
25 /****************************************************************************************
26 功能:ComStart,起动总线函数.
27 描述:启动I2C总线,即发送I2C起始条件.
28 参数:无
29 返回:无
30 ****************************************************************************************/
31 void ComStart()
32 {
33 1 SDA=1; /*发送起始条件的数据信号*/
34 1 Delay(DELAY);
35 1
36 1 SCL=1; /*起始条件建立时间大于4.7us,延时*/
37 1 Delay(DELAY);
38 1
39 1 SDA=0; /*发送起始信号*/ /* 起始条件锁定时间大于4μs*/
40 1 Delay(DELAY);
41 1
42 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
43 1 Delay(DELAY);
44 1 }
45
46 /****************************************************************************************
47 功能:ComStop,结束总线函数.
48 描述:结束I2C总线,即发送I2C结束条件.
49 参数:无
50 返回:无
51 ****************************************************************************************/
52 void ComStop()
53 {
54 1 SDA=0; /*发送结束条件的数据信号*/
55 1 Delay(DELAY);
C51 COMPILER V7.50 COMRAM 03/17/2008 20:43:15 PAGE 2
56 1
57 1 SCL=1; /*结束条件建立时间大于4μs*/
58 1 Delay(DELAY);
59 1
60 1 SDA=1; /*发送I2C总线结束信号*/
61 1 Delay(DELAY);
62 1 }
63
64 /****************************************************************************************
65 功能:ComSendByte,字节数据传送函数.
66 描述:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答
67 或者非应答都使ack=0 假)发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
68 参数:c---需要发送的字符。
69 返回:无
70 ****************************************************************************************/
71 void ComSendByte(uchar c)
72 {
73 1 uchar BitCnt;
74 1
75 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
76 1 {
77 2 if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
78 2 else SDA=0;
79 2
80 2 Delay(DELAY);
81 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位保证时钟高电平周期大于4μs*/
82 2
83 2 Delay(DELAY);
84 2 SCL=0;
85 2 }
86 1
87 1 Delay(DELAY);
88 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
89 1 Delay(DELAY);
90 1
91 1 SCL=1;
92 1 Delay(DELAY);
93 1
94 1 if(SDA==1) /*判断是否接收到应答信号*/
95 1 Ack2=0;
96 1 else
97 1 Ack2=1;
98 1
99 1 SCL=0;
100 1 Delay(DELAY);
101 1 }
102
103 /****************************************************************************************
104 功能:ComRcvByte,字节数据传送函数。
105 描述:用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数。
106 参数:无
107 返回:无
108 ****************************************************************************************/
109 uchar ComRcvByte()
110 {
111 1 uchar retc,BitCnt;
112 1
113 1 retc=0;
114 1 SDA=1; /*置数据线为输入方式*/
115 1
116 1 for(BitCnt=0;BitCnt<8;BitCnt++)
117 1 {
C51 COMPILER V7.50 COMRAM 03/17/2008 20:43:15 PAGE 3
118 2 Delay(DELAY);
119 2 SCL=0; /*置时钟线为低,准备接收数据位*/ /*时钟低电平周期大于4.7μs*/
120 2 Delay(DELAY);
121 2
122 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
123 2 Delay(DELAY);
124 2
125 2 retc=retc<<1;
126 2
127 2 if(SDA==1) /*读数据位,接收的数据位放入retc中 */
128 2 retc=retc+1;
129 2 Delay(DELAY);
130 2 }
131 1
132 1 SCL=0;
133 1 Delay(DELAY);
134 1
135 1 return(retc);
136 1 }
137
138 /****************************************************************************************
139 功能:ComAck,应答子函数。
140 描述:主控器进行应答信号,(可以是应答或非应答信号)。
141 参数:a---应答与否,a==1应答,a==0不应答。
142 返回:无
143 ****************************************************************************************/
144 void ComAck(bit a)
145 {
146 1
147 1 if(a==0)
148 1 SDA=0; /*在此发出应答或非应答信号 */
149 1 else
150 1 SDA=1;
151 1 Delay(DELAY);
152 1
153 1 SCL=1; /*时钟低电平周期大于4μ*/
154 1 Delay(DELAY);
155 1
156 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
157 1 Delay(DELAY);
158 1 }
159
160 /****************************************************************************************
161 功能:ComWriteOneByte,向有子地址器件发送字节数据函数。
162 描述:从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.如果返回1表示操作成功,否
163 则操作有误,使用前必须已结束总线。
164 参数:sla---器件地址;c---发送的字符。
165 返回:无
166 ****************************************************************************************/
167 bit ComWriteOneByte(uint sla,uchar c)
168 {
169 1 ComStart(); //启动总线
170 1
171 1 ComSendByte(WRITE); if(Ack2==0)return(0); //发送器件地址
172 1 ComSendByte(sla>>8); if(Ack2==0)return(0); //高address
173 1 ComSendByte(sla); if(Ack2==0)return(0); //low address
174 1 ComSendByte(c); if(Ack2==0)return(0); //发送数据
175 1
176 1 ComStop(); /*结束总线*/
177 1 return(1);
178 1 }
179
C51 COMPILER V7.50 COMRAM 03/17/2008 20:43:15 PAGE 4
180 /****************************************************************************************
181 功能:ComWriteBytes,向有子地址器件发送多字节数据函数。
182 描述:从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址sla,子地址suba,发送
183 内容是s指向的内容,发送no个字节。 如果返回1表示操作成功,否则操作有误。使用前必须已
184 结束总线。
185 参数:suba---子地址,s---指向发送的内容,no---发送字符个数。
186 返回:写成功则返回1,否则返回0.
187 ****************************************************************************************/
188 bit ComWriteBytes(uint suba,uchar *s,uchar no)
189 {
190 1 uchar i;
191 1
192 1 ComStart();
193 1
194 1 ComSendByte(WRITE);
195 1 if(Ack2==0)return(0);
196 1
197 1 ComSendByte(suba>>8);
198 1 if(Ack2==0)return(0);
199 1
200 1 ComSendByte(suba);
201 1 if(Ack2==0)return(0);
202 1
203 1 for(i=0;i<no;i++)
204 1 {
205 2 ComSendByte(*s);
206 2 if(Ack2==0)return(0);
207 2 s++;
208 2 }
209 1
210 1 ComStop();
211 1 return(1);
212 1 }
213
214 /****************************************************************************************
215 功能:ComReadOneByte,向无子地址器件读字节数据函数。
216 描述:从启动总线到发送地址,读数据,结束总线的全过程,从器件地址sla,返回值在c.如果返回1表
217 示操作成功,否则操作有误。使用前必须已结束总线。
218 参数:sla---器件地址。
219 返回:返回读取的字符。
220 ****************************************************************************************/
221 uchar ComReadOneByte(uint sla)
222 {
223 1 uchar x;
224 1 ComStart(); /*启动总线*/
225 1
226 1 ComSendByte(WRITE);
227 1 if(Ack2==0)return(0); //发送器件地址
228 1
229 1 ComSendByte(sla>>8);
230 1 if(Ack2==0)return(0); //高address
231 1
232 1 ComSendByte(sla);
233 1 if(Ack2==0)return(0); //low address
234 1
235 1 ComStart();
236 1
237 1 ComSendByte(READ);
238 1 if(Ack2==0)return(0);
239 1
240 1 x=ComRcvByte();
241 1 return x;
C51 COMPILER V7.50 COMRAM 03/17/2008 20:43:15 PAGE 5
242 1 }
243
244 /****************************************************************************************
245 功能:ComReadBytes,向有子地址器件读取多字节数据函数。
246 描述:从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址sla,子地址suba,读
247 出的内容放入s指向的存储区,读no个字节。使用前必须已结束总线。
248 参数:suba---子地址,s---指向发送的内容,no---发送字符个数。
249 返回:如果返回1表示操作成功,否则操作有误。
250 ****************************************************************************************/
251 bit ComReadBytes(uint suba,uchar *s,uchar no)
252 {
253 1 uchar i;
254 1
255 1 ComStart();
256 1
257 1 ComSendByte(WRITE);
258 1 if(Ack2==0)return(0);
259 1
260 1 ComSendByte(suba>>8);
261 1 if(Ack2==0)return(0);
262 1
263 1 ComSendByte(suba);
264 1 if(Ack2==0)return(0);
265 1
266 1 ComStart();
267 1
268 1 ComSendByte(READ);
269 1 if(Ack2==0)return(0);
270 1
271 1 for(i=0;i<no-1;i++)
272 1 {
273 2 *s=ComRcvByte();
274 2 ComAck(0);
275 2 s++;
276 2 }
277 1
278 1 *s=ComRcvByte();
279 1 ComAck(1);
280 1
281 1 ComStop();
282 1 return(1);
283 1 }
284
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 597 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
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 + -