📄 eepromrw.lst
字号:
C51 COMPILER V7.50 EEPROMRW 05/30/2006 10:29:05 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE EEPROMRW
OBJECT MODULE PLACED IN EEPROMRW.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE EEPROMRW.C LARGE OPTIMIZE(SIZE) DEBUG OBJECTEXTEND
line level source
1 /*————————————————————
2 〖说明〗24LC65 I2C EEPROM字节读写驱动程序,芯片A0-A1-A2要接VCC。
3 现缺页写、页读,和CRC校验程序。以下程序经过50台验证,批量的效果有待考
4 察。
5 为了安全起见,程序中很多NOP是冗余的,希望读者能进一步精简,但必须经过验
6 证。
7 51晶振为11.0592MHz
8 〖文件〗24LC65.c ﹫2001/03/23
9 〖作者〗龙啸九天 c51@yeah.net http://mcs51.yeah.net/
10 〖修改〗修改建议请到论坛公布 http://c51bbs.yeah.net/
11 〖版本〗V1.00A Build 0323
12 —————————————————————*/
13 #include <reg52.h >
14 #include<INTRINS.H>
15 #define SDA P3_5
16 #define SCL P3_4
17 #define uchar unsigned char
18 #define uint unsigned int
19 sbit P3_5 = P3^5;
20 sbit P3_4 = P3^4;
21 /*----------------------------------------------------------------------------
22 调用方式:write_8bit(uchar ch) ﹫2001/03/23
23 函数说明:内函数,私有,用户不直接调用。
24 ------------------------------------------------------------------------------*/
25 write_8bit(uchar ch)
26 {
27 1 uchar i=8;
28 1 SCL=0;
29 1 _nop_();_nop_();_nop_();_nop_();_nop_();
30 1 while (i--)
31 1 {
32 2 SDA=(bit)(ch&0x80);
33 2 _nop_();_nop_();_nop_();_nop_();_nop_();
34 2 ch<<=1;
35 2 SCL=1;
36 2 _nop_();_nop_();_nop_();_nop_();_nop_();
37 2 SCL=0;
38 2 _nop_();_nop_();_nop_();_nop_();_nop_();
39 2 }
40 1 _nop_();_nop_();_nop_();_nop_();_nop_();
41 1 _nop_();_nop_();_nop_();_nop_();_nop_();
42 1
43 1 }
44
45 /*------------------------------------------------------------------------------
46 --
47 调用方式:void ACK(void) ﹫2001/03/23
48 函数说明:内函数,私有,用户不直接调用。
49 --------------------------------------------------------------------------------
50 -*/
51 void ACK(void)
52
53 {
54 1 uchar time_1 ;
55 1 SDA=1;
C51 COMPILER V7.50 EEPROMRW 05/30/2006 10:29:05 PAGE 2
56 1 SCL=0;
57 1 _nop_();_nop_();_nop_();_nop_();_nop_();
58 1 SCL=1;
59 1 time_1=5;
60 1 while(SDA) {if (!(time_1--)) break;} //ACK
61 1 SCL=0;
62 1 _nop_();_nop_();_nop_();_nop_();_nop_();
63 1 }
64
65 /*------------------------------------------------------------------------------
66 --
67 调用方式:void Write24LC65(uint address,uchar ddata) ﹫2001/03/23
68 函数说明:在指定地址address(address<0x2000)写入一个字节ddata
69 --------------------------------------------------------------------------------
70 -*/
71 void Write24LC65(uint address,uchar ddata)//
72 {
73 1 SCL=1;
74 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA
75 1 SDA=0;
76 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
77 1 SCL=0; //START
78 1 write_8bit(0xae); //写从地址
79 1 ACK();
80 1 write_8bit(address>>8);
81 1 ACK();
82 1 write_8bit(address&0x00FF);
83 1 ACK();
84 1 write_8bit(ddata);
85 1 ACK();
86 1 SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_
87 1 ();SDA=1; //STOP
88 1 _nop_();_nop_();_nop_();_nop_();_nop_();
89 1 _nop_();_nop_();_nop_();_nop_();_nop_();
90 1 //delay(10);
91 1 }
92
93 /*------------------------------------------------------------------------------
94 --
95 调用方式:uchar Read24LC65(uint address) ﹫2001/03/23
96 函数说明:读取24LC65指定地址address(address<0x2000)的数据。
97 --------------------------------------------------------------------------------
98 -*/
99 uchar Read24LC65(uint address)
100 {
101 1 uchar ddata=0;
102 1 uchar i=8;
103 1 SDA=0;_nop_();SCL=0; //START
104 1 write_8bit(0xae); //写从地址
105 1 ACK();
106 1 write_8bit(address>>8);
107 1 ACK();
108 1 write_8bit(address&0x00FF);
109 1 ACK();
110 1 //以上是一个“哑”写操作,相当于设置当前地址
111 1
112 1 SCL=1;
113 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Tsu:STA
114 1 SDA=0;
115 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA
116 1 SCL=0; //START
117 1 write_8bit(0xaf); //写从地址,置为读模式
C51 COMPILER V7.50 EEPROMRW 05/30/2006 10:29:05 PAGE 3
118 1 ACK();
119 1 while (i--)
120 1 {
121 2 SDA=1;
122 2 ddata<<=1;
123 2 SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1;
124 2 if (SDA) ddata|=0x01;
125 2 }
126 1
127 1 SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
128 1 SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_
129 1 ();SDA=1; //STOP
130 1 _nop_();_nop_();_nop_();_nop_();_nop_();
131 1 _nop_();_nop_();_nop_();_nop_();_nop_();
132 1 //delay(5);
133 1 return ddata;
134 1 }
135
136
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 266 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -