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