?? iic.lst
字號:
C51 COMPILER V6.12 IIC 03/05/2008 14:11:10 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN .\BIN\IIC.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE .\SRC\IIC.C OPTIMIZE(9,SIZE) DEFINE(X17,TW2600XW02) DEBUG OBJECTEXTEND PRIN
-T(.\LST\IIC.lst) OBJECT(.\BIN\IIC.obj)
stmt level source
1 #include "stdio.h"
2 #include "8051.H"
3 #include "RAM.H"
4 #include "IIC.H"
5 #include "MCU.H"
6 #include "ROM_MAP.H"
7 #include "MyDef.H"
8 #include "F63XREG.H"
9 #include "F63XDEF.H"
10 #include "INTRINS.H"
11 void DDC2(void)
12 {
13 1 ISCL = 0;
14 1 ISCL = 1;
15 1 }
16
17 void IIC_Start(void)
18 {
19 1 ISDA = 0;
20 1 ISCL = 0;
21 1 }
22
23 void IIC_Stop(void)
24 {
25 1 ISDA = 0;
26 1 ISCL = 1;
27 1 ISDA = 1;
28 1 }
29
30 void CheckIIC(void)
31 {
32 1 ISCL = 1;
33 1 ISDA = 1;
34 1 while(!ISDA || !ISCL) //waiting for IIC released
35 1 {
36 2 ISCL = 0;
37 2 IIC_Stop();
38 2 }
39 1 }
40
41 Byte IIC_Tx(Byte Data)
42 { //subroutine total time 630us
43 1 Byte AckLoop,Ack;
44 1
45 1 #if SOFTWAREIIC_220K == 0
46 1 Byte i;
47 1 for(i=0;i<8;i++)
48 1 {
49 2 ISCL = 0;
50 2 ISDA = (Data & 0x80);
51 2 _nop_();
52 2 _nop_();
53 2 ISCL = 1;
54 2 _nop_();
C51 COMPILER V6.12 IIC 03/05/2008 14:11:10 PAGE 2
55 2 _nop_();
56 2 Data <<= 1;
57 2 }
58 1 #else
ISCL = 0;
ISDA = (Data & 0x80);
ISCL = 1;
ISCL = 0;
ISDA = (Data & 0x40);
ISCL = 1;
ISCL = 0;
ISDA = (Data & 0x20);
ISCL = 1;
ISCL = 0;
ISDA = (Data & 0x10);
ISCL = 1;
ISCL = 0;
ISDA = (Data & 0x08);
ISCL = 1;
ISCL = 0;
ISDA = (Data & 0x04);
ISCL = 1;
ISCL = 0;
ISDA = (Data & 0x02);
ISCL = 1;
ISCL = 0;
ISDA = (Data & 0x01);
ISCL = 1;
#endif
84 1 //
85 1 ISCL = 0;
86 1 ISDA = 1;
87 1 ISCL = 1;
88 1 Ack = NACK;
89 1 for(AckLoop=0;AckLoop<20;AckLoop++) //260us
90 1 {
91 2 if(!ISDA)
92 2 {
93 3 Ack = ACK;
94 3 break;
95 3 }
96 2 }
97 1 ISCL = 0;
98 1 return Ack; //return success=0 / failure=1
99 1 }
100 /*
101 Byte IIC_TxV(Byte Data)
102 { //subroutine total time 630us
103 Byte AckLoop,Ack;
104 Byte i;
105 for(i=0;i<8;i++)
106 {
107 ISCL = 0;
108 if(i == 7)
109 WaitVblank();
110 ISDA = (Data & 0x80);
111 ISCL = 1;
112 Data <<= 1;
113 }
114 ISCL = 0;
115 ISDA = 1;
116 ISCL = 1;
C51 COMPILER V6.12 IIC 03/05/2008 14:11:10 PAGE 3
117 Ack = NACK;
118 for(AckLoop=0;AckLoop<20;AckLoop++) //260us
119 {
120 if(!ISDA)
121 {
122 Ack = ACK;
123 break;
124 }
125 }
126 ISCL = 0;
127 return Ack; //return success=0 / failure=1
128 }
129 */
130 Byte IIC_Rx(Bit Ack)
131 {
132 1 Byte Data;
133 1 Byte i;
134 1 Data = 0;
135 1 for(i=0;i<8;i++)
136 1 {
137 2 Data <<= 1;
138 2 ISCL = 0;
139 2 ISDA = 1;
140 2 ISCL = 1;
141 2 if(ISDA)
142 2 Data |= 1;
143 2 else
144 2 Data &= 0xfe;
145 2 }
146 1 ISCL = 0;
147 1 ISDA = Ack;
148 1 ISCL = 1;
149 1 ISCL = 0;
150 1 return Data;
151 1 }
152
153 void WaitEEprom(void)
154 {
155 1 Byte i,ack;
156 1 for(i=0;i<100;i++) //10ms
157 1 {
158 2 IIC_Start();
159 2 ack = IIC_Tx(0xa0); //polling ACKnowledge
160 2 IIC_Stop();
161 2 if(ack == ACK)
162 2 break;
163 2 CLRWDT = 0x55;
164 2 }
165 1 }
166
167 void WriteIIC(Byte device,Byte addr,Byte ch)
168 {
169 1 IIC_Start();
170 1 IIC_Tx(device);
171 1 IIC_Tx(addr);
172 1 IIC_Tx(ch);
173 1 IIC_Stop();
174 1 }
175 /*
176 void WriteWordIIC(unsigned char device,unsigned char addr,unsigned short value)
177 {
178 IIC_Start();
C51 COMPILER V6.12 IIC 03/05/2008 14:11:10 PAGE 4
179 IIC_Tx(device);
180 IIC_Tx(addr);
181 IIC_Tx((Byte)value);
182 IIC_Tx((Byte)(value>>8));
183 IIC_Stop();
184 }
185 */
186 void WriteIIC563(unsigned short addr,unsigned char ch)
187 {
188 1 CheckRegPage(addr);
189 1 IIC_Start();
190 1 IIC_Tx(SCALER_ADDR);
191 1 IIC_Tx(addr);
192 1 IIC_Tx(ch);
193 1 IIC_Stop();
194 1 }
195
196 void WriteWordIIC563(unsigned short addr,unsigned short value)
197 {
198 1 CheckRegPage(addr);
199 1 IIC_Start();
200 1 IIC_Tx(SCALER_ADDR);
201 1 IIC_Tx((Byte)addr);
202 1 IIC_Tx((Byte)value);
203 1 IIC_Tx((Byte)(value>>8));
204 1 IIC_Stop();
205 1 }
206
207 Byte ReadIIC(Byte device,Byte addr)
208 {
209 1 Byte value;
210 1 IIC_Start();
211 1 IIC_Tx(device);
212 1 IIC_Tx(addr);
213 1 ISDA = 1; //repeat start
214 1 ISCL = 1;
215 1 ISDA = 0;
216 1 ISCL = 0;
217 1 IIC_Tx(device+1);
218 1 value = IIC_Rx(NACK); //nack
219 1 IIC_Stop();
220 1 return value;
221 1 }
222
223 unsigned char ReadIIC563(unsigned short addr)
224 {
225 1 Byte value;
226 1 CheckRegPage(addr);
227 1 IIC_Start();
228 1 IIC_Tx(SCALER_ADDR);
229 1 IIC_Tx(addr);
230 1 ISDA = 1; //repeat start
231 1 ISCL = 1;
232 1 ISDA = 0;
233 1 ISCL = 0;
234 1 IIC_Tx(SCALER_ADDR+1);
235 1 value = IIC_Rx(NACK); //nack
236 1 IIC_Stop();
237 1 return value;
238 1 }
239
240 unsigned short ReadWordIIC563(unsigned short addr)
C51 COMPILER V6.12 IIC 03/05/2008 14:11:10 PAGE 5
241 {
242 1 Byte temp;
243 1 Word value;
244 1 CheckRegPage(addr);
245 1 IIC_Start();
246 1 IIC_Tx(SCALER_ADDR);
247 1 IIC_Tx(addr);
248 1 ISDA = 1; //repeat start
249 1 ISCL = 1;
250 1 ISDA = 0;
251 1 ISCL = 0;
252 1 IIC_Tx(SCALER_ADDR+1);
253 1 temp = IIC_Rx(ACK);
254 1 value = IIC_Rx(NACK); //nack
255 1 value <<= 8;
256 1 value += temp;
257 1 IIC_Stop();
258 1 return value;
259 1 }
260 unsigned char Read24C16(unsigned short addr16)
261 {
262 1 Byte ch;
263 1 Byte device,addr;
264 1 addr = addr16 & 0x0ff;
265 1 device = (addr16 >> 7) & 0x0e;
266 1 device |= EEPROM;
267 1 ch = ReadIIC(device,addr);
268 1 return ch;
269 1 }
270
271 void CheckRegPage(unsigned short addr)
272 {
273 1 Byte page;
274 1 IIC_Start();
275 1 IIC_Stop();
276 1 page = (Byte)((addr/256) & 0x003);
277 1 if(page != RegPage)
278 1 {
279 2 RegPage = page;
280 2 WriteIIC(SCALER_ADDR,0xff,RegPage);
281 2 }
282 1 }
283
284 void InitEEPROM(void)
285 {
286 1 unsigned short addr;
287 1 #if PRINT_MESSAGE
printf("Initial EEPROM.\n");
#endif
290 1 LED_GrnOff();
291 1 LED_RedOn();
292 1 //Dsub EDID
293 1 for(addr=0;addr<0x80;addr++)
294 1 Write24C16(ep_DDC_Analog+addr,DsubEdidTab[addr]);
295 1 //Dvi EDID
296 1 for(addr=0;addr<0x80;addr++)
297 1 Write24C16(ep_DDC_DVI+addr,DviEdidTab[addr]);
298 1 //Geo
299 1 LED_RedOff();
300 1 for(addr=0;addr<0x45;addr++)
301 1 Write24C16(0x200+addr,EEP_GeoMap[addr]);
302 1 //Mode
C51 COMPILER V6.12 IIC 03/05/2008 14:11:10 PAGE 6
303 1 LED_RedOn();
304 1 for(addr=0;addr<UserModeSt*4;addr++)
305 1 Write24C16(0x300+addr,EEP_FreqMap[addr]);
306 1 LED_RedOff();
307 1 for(;addr<ModeNum*4;addr++)
308 1 Write24C16(0x300+addr,0xff);
309 1 //Sync
310 1 LED_RedOn();
311 1 for(addr=0;addr<UserModeSt*8;addr++)
312 1 Write24C16(0x500+addr,EEP_SyncMap[addr]);
313 1 LED_RedOff();
314 1 for(;addr<ModeNum*8;addr++)
315 1 Write24C16(0x500+addr,0xff);
316 1 Write24C16(ep_FirmWare_Ver,Version);
317 1 Write24C16(ep_FirmWare_Rev,Reversion);
318 1 LED_GrnOn();
319 1 }
320
321 void Write24C16(unsigned short k,unsigned char ch)
322 {
323 1 unsigned char device,addr;
324 1 addr = (unsigned char)k;
325 1 device = (unsigned char)((k>>7)&0x0e);
326 1 device |= EEPROM;
327 1 WriteIIC(device,addr,ch);
328 1 WaitEEprom();
329 1 }
330 /*
331 void WritePage24C16(unsigned short addr1,unsigned short addr2,unsigned char *p)
332 {
333 unsigned char i,ch;
334 IIC_Start();
335 i = (unsigned char)((addr1 >>7 ) & 0x0e);
336 i |= EEPROM;
337 IIC_Tx(i);
338 IIC_Tx((Byte)addr1);
339 for(i=0; i<16; i++)
340 {
341 ch = p[addr2 + i];
342 IIC_Tx(ch);
343 }
344 IIC_Stop();
345 WaitEEprom();
346 }
347 */
348 void LoadDDCData()
349 {
350 1 Byte xdata *DDCptr;
351 1 Byte i;
352 1 DDC_CTL0 = 0; //disable DDC
353 1 DDC_CTL1 = 0; //disable DDC
354 1 DDCptr = 0xf800;
355 1 for(i=0;i<128;i++)
356 1 {
357 2 CLRWDT = 0x55;
358 2 *DDCptr++ = Read24C16(ep_DDC_DVI+i);
359 2 }
360 1 DDCptr = 0xf900;
361 1 for(i=0;i<128;i++)
362 1 {
363 2 CLRWDT = 0x55;
364 2 *DDCptr++ = Read24C16(ep_DDC_Analog+i);
C51 COMPILER V6.12 IIC 03/05/2008 14:11:10 PAGE 7
365 2 }
366 1 DDC_CTL0 = (EN_DDC|CLR_UPD|CLR_PTR);
367 1 DDC_CTL1 = (EN_DDC|CLR_UPD|CLR_PTR);
368 1 }
369
370 void SaveDDCData(Bit Channel)
371 {
372 1 Byte xdata *DDCptr;
373 1 Byte i,ptr;
374 1 DDC_CTL0 = 0; //disable DDC
375 1 DDC_CTL1 = 0; //disable DDC
376 1 if(Channel == 0)
377 1 {
378 2 DDCptr = 0xf800;
379 2 for(i=0;i<16;i++)
380 2 {
381 3 IIC_Start();
382 3 IIC_Tx(0xa2);
383 3 IIC_Tx(i*8);
384 3 for(ptr=0;ptr<8;ptr++) //page write 8bytes(16bytes max)
385 3 IIC_Tx(*DDCptr++);
386 3 IIC_Stop();
387 3 WaitEEprom(); //polling acknowledge
388 3 CLRWDT = 0x55;
389 3 }
390 2 }
391 1 else
392 1 {
393 2 DDCptr = 0xf900;
394 2 for(i=0;i<16;i++)
395 2 {
396 3 IIC_Start();
397 3 IIC_Tx(0xa0);
398 3 IIC_Tx(i*8);
399 3 for(ptr=0;ptr<8;ptr++) //page write 8bytes(16bytes max)
400 3 IIC_Tx(*DDCptr++);
401 3 IIC_Stop();
402 3 WaitEEprom(); //polling acknowledge
403 3 CLRWDT = 0x55;
404 3 }
405 2 }
406 1 DDC_CTL0 = (EN_DDC|CLR_UPD|CLR_PTR);
407 1 DDC_CTL1 = (EN_DDC|CLR_UPD|CLR_PTR);
408 1 if(!Channel)
409 1 SaveDDC0 = 0;
410 1 else
411 1 SaveDDC1 = 0;
412 1 }
413
414 void CheckVersion()
415 {
416 1 Byte i,Ver1,Ver2;
417 1 for(i=0;i<10;i++)
418 1 {
419 2 Ver1 = Read24C16(ep_FirmWare_Ver);
420 2 Ver2 = Read24C16(ep_FirmWare_Rev);
421 2 if(Ver1 == Version && Ver2 == Reversion)
422 2 break;
423 2 Sleep(10);
424 2 }
425 1 if(i==10)
426 1 {
C51 COMPILER V6.12 IIC 03/05/2008 14:11:10 PAGE 8
427 2 #if PRINT_MESSAGE
printf("Version error.\n");
#endif
430 2 InitEEPROM();
431 2 }
432 1 }
433
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1040 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 18
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -