📄 cat24wc16p.lst
字号:
24 #define uint unsigned int
25
26
27 #define CAT24WC16P_ADDRESS 0xA0 // I2C write address of CAT24WC16P
28
29
30 /*******************************************************************
31 检查CAT24WC16P忙
32 函数原型: bit CAT24WC16P_ready();
33 功能: 检查CAT24WC16P
34 返回0--CAT24WC16P忙
35 返回1--CAT24WC16P准备
36 *******************************************************************/
37
38 bit CAT24WC16P_ready()
39 {
40 1 I2C_GetBus(); /*启动总线*/
41 1
42 1 I2C_Send(CAT24WC16P_ADDRESS); /*发送器件地址,若无应答则返回0*/
43 1 if(S1STA!=0X18)
44 1 {
45 2 S1CON=0XD5;
46 2 return(0);
47 2 }
48 1
49 1 return(1); /*发送器件地址,应答则返回1*/
50 1 }
51
52
53 /*******************************************************************
54 从CAT24WC16P器件随机地址读入N字节数据函数(N<=2048)(地址:0-2047)
55 函数原型: bit fnRead_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data);
56 功能: 从启动总线到发送地址、子地址、读数据、结束总线的全过程,器件
57 数据地址(0-7FF),读入的内容在指向的存储区N个字节。
58 如果返回1,表示操作成功,否则操作有误。
59 ********************************************************************/
60 bit fnRead_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data)
61 {
62 1 uchar i;
63 1 uchar suba_high,suba_low;
64 1
65 1 suba_high = uiAddress/256;
66 1 suba_low = uiAddress%256;
67 1
68 1 suba_high = suba_high << 1;
69 1
70 1 suba_high |= CAT24WC16P_ADDRESS;
71 1
72 1 while(!CAT24WC16P_ready()); //等待CAT24WC16P的准备就绪
73 1
74 1
75 1 I2C_GetBus(); //启动总线
76 1
77 1 I2C_Send(suba_high); //发送器件地址,三位高地址a10,a9,a8, 0 ,若无应答则返回
78 1 if(S1STA!=0X18)
79 1 {
80 2 S1CON=0XD5;
81 2 return(0);
82 2 }
83 1
84 1 I2C_Send(suba_low); //发送器件子地址低字节,若无应答则返回
85 1 if(S1STA!=0X28)
C51 COMPILER V7.07 CAT24WC16P 07/08/2004 05:56:10 PAGE 7
86 1 {
87 2 S1CON=0XD5;
88 2 return(0);
89 2 }
90 1
91 1
92 1 S1CON=0XE5; //重新启动总线
93 1 while(SI==0);
94 1
95 1 I2C_Send(suba_high+1); //发送器件地址,若无应答则返回
96 1 if(S1STA!=0X40)
97 1 {
98 2 S1CON=0XD5;
99 2 return(0);
100 2 }
101 1
102 1 for(i=0;i<ucSize-1;i++)
103 1 {
104 2 S1CON=0XC5; //接收一字节数据并发送应答位
105 2 while(SI==0); //等待接收数据
106 2 if(S1STA!=0X50)
107 2 {
108 3 S1CON=0XD5;
109 3 return(0);
110 3 }
111 2
112 2 *uc_Data = S1DAT; //读取数据
113 2 uc_Data++;
114 2 }
115 1
116 1 S1CON=0XC1; //接收最后一字节数据并发送非应答位
117 1 while(SI==0);
118 1 *uc_Data=S1DAT;
119 1
120 1 S1CON=0XD5; //结束总线
121 1
122 1 return(1);
123 1 }
124
125
126 /*******************************************************************
127 向CAT24WC16P器件页写入N字节数据函数
128 函数原型: bit CAT24WC16P_PageW(uint suba,uchar suba_size,uchar *s)
129 功能: 从启动总线到发送地址、子地址、读数据、结束总线的全过程,器件
130 数据页地址suba(0-FF),写入的内容在s指向的存储区读N个字节。
131 如果返回1,表示操作成功,否则操作有误。
132 ********************************************************************/
133 bit CAT24WC16P_PageW(uint suba,uchar suba_size,uchar *s)
134 {
135 1 uchar i;
136 1 uchar suba_high,suba_low;
137 1
138 1 suba_high = suba/256;
139 1 suba_low = suba%256;
140 1
141 1 suba_high = suba_high << 1;
142 1
143 1 suba_high |= CAT24WC16P_ADDRESS;
144 1
145 1 while(!CAT24WC16P_ready()); //等待CAT24WC16P的准备就绪
146 1
147 1
C51 COMPILER V7.07 CAT24WC16P 07/08/2004 05:56:10 PAGE 8
148 1 I2C_GetBus(); //启动总线
149 1
150 1 I2C_Send(suba_high); //发送器件地址,三位高地址a10,a9,a8, 0 ,若无应答则返回
151 1 if(S1STA!=0X18)
152 1 {
153 2 S1CON=0XD5;
154 2 return(0);
155 2 }
156 1
157 1 I2C_Send(suba_low); //发送器件子地址低字节,若无应答则返回
158 1 if(S1STA!=0X28)
159 1 {
160 2 S1CON=0XD5;
161 2 return(0);
162 2 }
163 1
164 1 for(i=0;i<suba_size;i++)
165 1 {
166 2 I2C_Send(*s); //发送数据,若无应答则返回
167 2 if(S1STA!=0X28)
168 2 {
169 3 S1CON=0XD5;
170 3 return(0);
171 3 }
172 2 s++;
173 2 }
174 1
175 1 S1CON=0XD5; //结束总线
176 1
177 1 return(1);
178 1
179 1
180 1
181 1 }
182
183 /*******************************************************************
184 从CAT24WC16P器件随机地址写入N字节数据函数(N<=16)(地址:0-2047)
185 函数原型: bit fnWrite_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data);
186 功能: 从启动总线到发送地址、子地址、读数据、结束总线的全过程,器件
187 数据地址(0-7FF),写入的内容在指向的存储区N个字节。
188 如果返回1,表示操作成功,否则操作有误。
189 ********************************************************************/
190 bit fnWrite_Eeprom(uint uiAddress,uchar ucSize, uchar *uc_Data)
191 {
192 1 char i;
193 1
194 1 i = (uiAddress%16) + ucSize - 16;
195 1
196 1 if( i > 0 )
197 1 {
198 2 CAT24WC16P_PageW(uiAddress,ucSize - i,uc_Data);
199 2 //CAT24WC16P_PageW(uiAddress + ucSize - i,i,uc_Data);
200 2 //BUG?
201 2 CAT24WC16P_PageW(uiAddress + ucSize - i,i,uc_Data + ucSize - i);
202 2 return(1);
203 2 }
204 1 else
205 1 {
206 2 CAT24WC16P_PageW(uiAddress,ucSize,uc_Data);
207 2 return(1);
208 2 }
209 1
C51 COMPILER V7.07 CAT24WC16P 07/08/2004 05:56:10 PAGE 9
210 1 }
C51 COMPILER V7.07 CAT24WC16P 07/08/2004 05:56:10 PAGE 10
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION CAT24WC16P_ready (BEGIN)
; SOURCE LINE # 38
; SOURCE LINE # 39
; SOURCE LINE # 40
0000 120000 E LCALL I2C_GetBus
; SOURCE LINE # 42
0003 7FA0 MOV R7,#0A0H
0005 120000 E LCALL _I2C_Send
; SOURCE LINE # 43
0008 E5D9 MOV A,S1STA
000A 6418 XRL A,#018H
000C 6005 JZ ?C0001
; SOURCE LINE # 44
; SOURCE LINE # 45
000E 75D8D5 MOV S1CON,#0D5H
; SOURCE LINE # 46
0011 C3 CLR C
0012 22 RET
; SOURCE LINE # 47
0013 ?C0001:
; SOURCE LINE # 49
0013 D3 SETB C
; SOURCE LINE # 50
0014 ?C0002:
0014 22 RET
; FUNCTION CAT24WC16P_ready (END)
; FUNCTION _fnRead_Eeprom (BEGIN)
; SOURCE LINE # 60
0000 8E00 R MOV uiAddress,R6
0002 8F00 R MOV uiAddress+01H,R7
0004 8D00 R MOV ucSize,R5
0006 8B00 R MOV uc_Data,R3
0008 8A00 R MOV uc_Data+01H,R2
000A 8900 R MOV uc_Data+02H,R1
; SOURCE LINE # 61
; SOURCE LINE # 65
000C E500 R MOV A,uiAddress
000E F500 R MOV suba_high,A
; SOURCE LINE # 66
0010 8F00 R MOV suba_low,R7
; SOURCE LINE # 68
0012 E500 R MOV A,suba_high
0014 25E0 ADD A,ACC
0016 F500 R MOV suba_high,A
; SOURCE LINE # 70
0018 4300A0 R ORL suba_high,#0A0H
001B ?C0003:
; SOURCE LINE # 72
001B 120000 R LCALL CAT24WC16P_ready
001E 50FB JNC ?C0003
0020 ?C0004:
; SOURCE LINE # 75
0020 120000 E LCALL I2C_GetBus
; SOURCE LINE # 77
0023 AF00 R MOV R7,suba_high
0025 120000 E LCALL _I2C_Send
; SOURCE LINE # 78
0028 E5D9 MOV A,S1STA
C51 COMPILER V7.07 CAT24WC16P 07/08/2004 05:56:10 PAGE 11
002A 6418 XRL A,#018H
002C 6002 JZ ?C0005
; SOURCE LINE # 79
; SOURCE LINE # 80
; SOURCE LINE # 81
002E 8039 SJMP ?C0033
; SOURCE LINE # 82
0030 ?C0005:
; SOURCE LINE # 84
0030 AF00 R MOV R7,suba_low
0032 120000 E LCALL _I2C_Send
; SOURCE LINE # 85
0035 E5D9 MOV A,S1STA
0037 6428 XRL A,#028H
0039 6002 JZ ?C0007
; SOURCE LINE # 86
; SOURCE LINE # 87
003B ?C0031:
; SOURCE LINE # 88
003B 802C SJMP ?C0033
; SOURCE LINE # 89
003D ?C0007:
; SOURCE LINE # 92
003D 75D8E5 MOV S1CON,#0E5H
0040 ?C0008:
; SOURCE LINE # 93
0040 30DBFD JNB SI,?C0008
0043 ?C0009:
; SOURCE LINE # 95
0043 E500 R MOV A,suba_high
0045 04 INC A
0046 FF MOV R7,A
0047 120000 E LCALL _I2C_Send
; SOURCE LINE # 96
004A E5D9 MOV A,S1STA
004C 6440 XRL A,#040H
004E 6002 JZ ?C0010
; SOURCE LINE # 97
; SOURCE LINE # 98
0050 ?C0032:
; SOURCE LINE # 99
0050 8017 SJMP ?C0033
; SOURCE LINE # 100
0052 ?C0010:
; SOURCE LINE # 102
;---- Variable 'i' assigned to Register 'R7' ----
0052 E4 CLR A
0053 FF MOV R7,A
0054 ?C0011:
0054 E500 R MOV A,ucSize
0056 14 DEC A
0057 FE MOV R6,A
0058 EF MOV A,R7
0059 C3 CLR C
005A 9E SUBB A,R6
005B 502A JNC ?C0012
; SOURCE LINE # 103
; SOURCE LINE # 104
005D 75D8C5 MOV S1CON,#0C5H
0060 ?C0014:
; SOURCE LINE # 105
0060 30DBFD JNB SI,?C0014
C51 COMPILER V7.07 CAT24WC16P 07/08/2004 05:56:10 PAGE 12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -