iic.lst

来自「台湾联咏NT68663 LCD MONITOR 控制程序(完整版)」· LST 代码 · 共 472 行

LST
472
字号
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 + =
减小字号Ctrl + -
显示快捷键?