eeprom2.lst
来自「自己的平时一些制作 现在整理一下 与大家一起分享」· LST 代码 · 共 271 行
LST
271 行
C51 COMPILER V7.20 EEPROM2 06/19/2007 13:41:10 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE EEPROM2
OBJECT MODULE PLACED IN eeprom2.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE eeprom2.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /***********************************************************************************
3 此程序包括对24XX系列EEPROM的字节、页读写操作
4 DataBuff为读写数据输入/输出缓冲区的首址
5 ByteQuantity 为要读写数据的字节数量
6 Address 为EEPROM的片内地址
7 ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
8 表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;
9 EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256;
10 函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;
11 ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1
12 SDA和SCL由用户自定义,这里暂定义为P0^1和P0^0;
13
14 ***********************************************************************************/
15
16 #pragma ot(5,SIZE)
17 #include <reg51.h>
18 #include <intrins.h>
19 #define ERRORCOUNT 10
20 sbit SDA=P3^3;
21 sbit SCL=P3^5;
22 enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
23 enum eepromtype EepromType; /* 器件类型枚举变量取值为0-8 */
24
25 /***********************************************************************************/
26 bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
27 unsigned char ControlByte,enum eepromtype EepromType)
28 {
29 1 void Delay(unsigned char DelayCount);
30 1 void IICStart(void);
31 1 void IICStop(void);
32 1 bit IICRecAck(void);
33 1 void IICNoAck(void);
34 1 void IICAck(void);
35 1 unsigned char IICReceiveByte(void);
36 1 void IICSendByte(unsigned char sendbyte);
37 1 unsigned char data j,i=ERRORCOUNT;
38 1 bit errorflag=1; /* clr errorflag */
39 1 while(i--) /* 启动IIC总线并发送EEPROM从器件地址 */
40 1 {
41 2 IICStart(); /* 启动IIC总线 */
42 2 IICSendByte(ControlByte&0xfe); /* 发送EEPROM地址 */
43 2 if(IICRecAck()) /* 接收EEPROM应答信号 */
44 2 continue; /* 接收EEPROM应答信号,为1重新启动 */
45 2 if(EepromType>M2416) /* EEPROM为24C32以上器件内地址为2字节 */
46 2 {
47 3 IICSendByte((unsigned char)(Address>>8));/* 先发送高字节,参考硬件相关说明 */
48 3 if(IICRecAck())
49 3 continue;
50 3 }
51 2 IICSendByte((unsigned char)Address);/* 再发送低字节或单字节地址 */
52 2 if(IICRecAck())
53 2 continue;
54 2 if(!(ControlByte&0x01)) /* 以下为写操作 */
55 2 {
C51 COMPILER V7.20 EEPROM2 06/19/2007 13:41:10 PAGE 2
56 3 j=ByteQuantity; /* ByteQuantity为写入字节数 */
57 3 errorflag=0;
58 3 while(j--)
59 3 {
60 4 IICSendByte(*DataBuff++); /* DataBuff写操作缓冲区 */
61 4 if(!IICRecAck())
62 4 continue;
63 4 errorflag=1;
64 4 break;
65 4 }
66 3 if(errorflag==1)
67 3 continue;
68 3 break;
69 3 }
70 2 else /* 以下为读操作 */
71 2 {
72 3 IICStart(); /* 重新启动IIC总线并发送EEPROM从器件地址 */
73 3 IICSendByte(ControlByte);
74 3 if(IICRecAck())
75 3 continue;
76 3 while(--ByteQuantity) /* 每次读一字节,共ByteQuantity字节 */
77 3 {
78 4 *DataBuff++=IICReceiveByte(); /*读1字节并存入DataBuff为指针的存储单元 */
79 4 IICAck(); /* 发送应答信号 */
80 4 }
81 3 *DataBuff=IICReceiveByte(); /*read last byte data*/
82 3 IICNoAck(); /* 读入最后一字节无须发送应答信号 */
83 3 errorflag=0;
84 3 break;
85 3 }
86 2 }
87 1 IICStop(); /* 停止IIC总线信号 */
88 1 if(!(ControlByte&0x01)) /* 写入操作需延时,确保足够长写入时间 */
89 1 {
90 2 Delay(255);
91 2 Delay(255);
92 2 Delay(255);
93 2 Delay(255);
94 2 }
95 1 return(errorflag);
96 1 }
97
98 /*******************
99 以下是对IIC操作子程序
100 *******************/
101 /*******************
102 启动IIC
103 *******************/
104 void IICStart(void)
105 {
106 1 SCL=0;
107 1 SDA=1;
108 1 SCL=1;
109 1 _nop_();
110 1 _nop_();
111 1 _nop_();
112 1 SDA=0;
113 1 _nop_();
114 1 _nop_();
115 1 _nop_();
116 1 _nop_();
117 1 SCL=0;
C51 COMPILER V7.20 EEPROM2 06/19/2007 13:41:10 PAGE 3
118 1 SDA=1;
119 1 }
120 /*****************
121 停止IIC总线
122 *****************/
123 void IICStop(void)
124 {
125 1 SCL=0;
126 1 SDA=0;
127 1 SCL=1;
128 1 _nop_();
129 1 _nop_();
130 1 _nop_();
131 1 SDA=1;
132 1 _nop_();
133 1 _nop_();
134 1 _nop_();
135 1 SCL=0;
136 1 }
137 /**************
138 检查应答位
139 **************/
140 bit IICRecAck(void)
141 {
142 1 SCL=0;
143 1 SDA=1;
144 1 SCL=1;
145 1 _nop_();
146 1 _nop_();
147 1 _nop_();
148 1 _nop_();
149 1 CY=SDA; /* 应答位返回值在CY中,0有效 */
150 1 SCL=0;
151 1 return(CY);
152 1 }
153 /***************
154 对IIC总线产生应答
155 ***************/
156
157 void IICAck(void)
158 {
159 1 SDA=0;
160 1 SCL=1;
161 1 _nop_();
162 1 _nop_();
163 1 _nop_();
164 1 _nop_();
165 1 SCL=0;
166 1 _nop_();
167 1 SDA=1;
168 1 }
169
170 /*****************
171 不对IIC总线产生应答
172 *****************/
173 void IICNoAck(void)
174 {
175 1 SDA=1;
176 1 SCL=1;
177 1 _nop_();
178 1 _nop_();
179 1 _nop_();
C51 COMPILER V7.20 EEPROM2 06/19/2007 13:41:10 PAGE 4
180 1 _nop_();
181 1 SCL=0;
182 1 }
183
184 /*******************
185 向IIC总线写数据
186 *******************/
187 void IICSendByte(unsigned char sendbyte)
188 {
189 1 unsigned char data j=8;
190 1 for(;j>0;j--)
191 1 {
192 2 SCL=0;
193 2 sendbyte<<=1; /* 发送字节变量sendbyte左移1位,CY=sendbyte^7,并回存 */
194 2 SDA=CY;
195 2 SCL=1;
196 2 }
197 1 SCL=0;
198 1 }
199
200 /********************
201 从IIC总线读数据子程序
202 ********************/
203 unsigned char IICReceiveByte(void)
204 {
205 1 register receivebyte,i=8;
206 1 SCL=0;
207 1 while(i--)
208 1 {
209 2 SCL=1;
210 2 receivebyte=(receivebyte<<1)|SDA;
211 2 SCL=0;
212 2 }
213 1 return(receivebyte);
214 1 }
215
216 /***************
217 延时程序
218 ***************/
219 void Delay(unsigned char DelayCount)
220 {
221 1 while(DelayCount--);
222 1 }
223
224 /****************
225 应用举例
226 ****************/
227 main()
228 {
229 1 unsigned char str1[6]="abcdef";
230 1 unsigned char str2[6]="";
231 1 /* 设置待写入数据 */
232 1 RW24XX(str1,6,0x0010,0xa0,6); /*把0x30开始的 待写入数据存储指针,写入字节数 */
233 1 /* 写入器件内首地址,写入控制字,器件类型 */
234 1 RW24XX(str2,6,0x0010,0xa1,6);
235 1
236 1
237 1 Delay(50); /* 检查内部数据区0x30-0x39与0x40-0x49应完全相同 */
238 1 }
239
C51 COMPILER V7.20 EEPROM2 06/19/2007 13:41:10 PAGE 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 446 ----
CONSTANT SIZE = 12 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 24
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?