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