📄 rw24xx.lst
字号:
C51 COMPILER V7.04 RW24XX 10/23/2004 13:20:46 PAGE 1
C51 COMPILER V7.04, COMPILATION OF MODULE RW24XX
OBJECT MODULE PLACED IN rw24xx.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE rw24xx.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #pragma ot(6,SIZE)
2 #include <reg52.h>
3 #include <intrins.h>
4 #define ERRORCOUNT 10
5 sbit SDA=P1^3;
6 sbit SCL=P1^2;
7 enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
8
9 //DataBuff为读写数据输入/输出缓冲区的首址
10 //ByteQuantity 为要读写数据的字节数量
11 //Address 为EEPROM的片内地址
12 //ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
13 //表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;
14 //EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256;
15 //函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
16 //ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1
17 //SDA和SCL由用户自定义,这里暂定义为P0^0和P0^1;
18 //其余的用户不用管,只要把只子程序放在你的程序中并调用它就可以了;
19
20
21 /***********************************************************************************/
22 bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
23 unsigned char ControlByte,enum eepromtype EepromType)
24 {
25 1 void Delay(unsigned char DelayCount);
26 1 void IICStart(void);
27 1 void IICStop(void);
28 1 bit IICRecAck(void);
29 1 void IICNoAck(void);
30 1 void IICAck(void);
31 1 unsigned char IICReceiveByte(void);
32 1 void IICSendByte(unsigned char sendbyte);
33 1 unsigned char data j,i=ERRORCOUNT;
34 1 bit errorflag=1;
35 1 while(i--)
36 1 {
37 2 IICStart();
38 2 IICSendByte(ControlByte&0xfe);
39 2 if(IICRecAck())
40 2 continue;
41 2 if(EepromType>M2416)
42 2 {
43 3 IICSendByte((unsigned char)(Address>>8));
44 3 if(IICRecAck())
45 3 continue;
46 3 }
47 2 IICSendByte((unsigned char)Address);
48 2 if(IICRecAck())
49 2 continue;
50 2 if(!(ControlByte&0x01))
51 2 {
52 3 j=ByteQuantity;
53 3 errorflag=0; //********clr errorflag
54 3 while(j--)
55 3 {
C51 COMPILER V7.04 RW24XX 10/23/2004 13:20:46 PAGE 2
56 4 IICSendByte(*DataBuff++);
57 4 if(!IICRecAck())
58 4 continue;
59 4 errorflag=1;
60 4 break;
61 4 }
62 3 if(errorflag==1)
63 3 continue;
64 3 break;
65 3 }
66 2 else
67 2 {
68 3 IICStart();
69 3 IICSendByte(ControlByte);
70 3 if(IICRecAck())
71 3 continue;
72 3 while(--ByteQuantity)
73 3 {
74 4 *DataBuff++=IICReceiveByte();
75 4 IICAck();
76 4 }
77 3 *DataBuff=IICReceiveByte(); //read last byte data
78 3 IICNoAck();
79 3 errorflag=0;
80 3 break;
81 3 }
82 2 }
83 1 IICStop();
84 1 if(!(ControlByte&0x01))
85 1 {
86 2 Delay(255);
87 2 Delay(255);
88 2 Delay(255);
89 2 Delay(255);
90 2 }
91 1 return(errorflag);
92 1 }
93
94
95 /*****************以下是对IIC总线的操作子程序***/
96 /*****************启动总线**********************/
97 void IICStart(void)
98 {
99 1 SCL=0; //
100 1 SDA=1;
101 1 SCL=1;
102 1 _nop_();
103 1 _nop_();
104 1 _nop_();
105 1 SDA=0;
106 1 _nop_();
107 1 _nop_();
108 1 _nop_();
109 1 _nop_();
110 1 SCL=0;
111 1 SDA=1; //
112 1 }
113
114 /*****************停止IIC总线****************/
115 void IICStop(void)
116 {
117 1 SCL=0;
C51 COMPILER V7.04 RW24XX 10/23/2004 13:20:46 PAGE 3
118 1 SDA=0;
119 1 SCL=1;
120 1 _nop_();
121 1 _nop_();
122 1 _nop_();
123 1 SDA=1;
124 1 _nop_();
125 1 _nop_();
126 1 _nop_();
127 1 SCL=0;
128 1 }
129
130 /**************检查应答位*******************/
131 bit IICRecAck(void)
132 {
133 1 SCL=0;
134 1 SDA=1;
135 1 SCL=1;
136 1 _nop_();
137 1 _nop_();
138 1 _nop_();
139 1 _nop_();
140 1 CY=SDA; //因为返回值总是放在CY中的
141 1 SCL=0;
142 1 return(CY);
143 1 }
144
145 /***************对IIC总线产生应答*******************/
146 void IICACK(void)
147 {
148 1 SDA=0;
149 1 SCL=1;
150 1 _nop_();
151 1 _nop_();
152 1 _nop_();
153 1 _nop_();
154 1 SCL=0;
155 1 _nop_();
156 1 SDA=1;
157 1 }
158
159 /*****************不对IIC总线产生应答***************/
160 void IICNoAck(void)
161 {
162 1 SDA=1;
163 1 SCL=1;
164 1 _nop_();
165 1 _nop_();
166 1 _nop_();
167 1 _nop_();
168 1 SCL=0;
169 1 }
170
171 /*******************向IIC总线写数据*********************/
172 void IICSendByte(unsigned char sendbyte)
173 {
174 1 unsigned char data j=8;
175 1 for(;j>0;j--)
176 1 {
177 2 SCL=0;
178 2 sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
179 2 SDA=CY;
C51 COMPILER V7.04 RW24XX 10/23/2004 13:20:46 PAGE 4
180 2 SCL=1;
181 2 }
182 1 SCL=0;
183 1 }
184
185 /**********************从IIC总线上读数据子程序**********/
186 unsigned char IICReceiveByte(void)
187 {
188 1 register receivebyte,i=8;
189 1 SCL=0;
190 1 while(i--)
191 1 {
192 2 SCL=1;
193 2 receivebyte=(receivebyte<<1)|SDA;
194 2 SCL=0;
195 2 }
196 1 return(receivebyte);
197 1 }
198
199 /***************一个简单延时程序************************/
200 void Delay(unsigned char DelayCount)
201 {
202 1 while(DelayCount--);
203 1 }
204
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 322 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -