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