⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcu.c

📁 NOVATEK公司的LCD_CONTROLLER源代码 液晶显示器驱动板源代码NT68521
💻 C
字号:
#include "stdio.h"
#include "8051.H"
#include "RAM.H"
#include "MCU.H"
#include "MyDef.H"
#include "IIC.H"
#include "F63REG.H"
#include "UserAdj.H"
#include "Scaler.H"
#include "AutoAdj.H"
#include "OSD.H"
#include "ModeHandle.H"
#include "sRGB.H"

code unsigned char KeyTab[]={
	0x00,0x20,0x40,0x60,0x7f
};

code unsigned char SystemRegTab[]={
	0xff,	// PortA
	0xff,	// PortB
#if PanelPowerActive == High
	0x6c,	// PortC
#else
	0xee,	// PortC
#endif
	0x6e,	// PortD
	0x55,	// CLRWDT
	0x98,	// ADC_CON
	0x00,	// ADC0_REG
	0x00,	// ADC1_REG
	0x00,	// ADC2_REG
	0x00,	// ADC3_REG
	0x02,	// PWM1  Enable
	0x80,	// PWM15 Enable
	0x00,	// PWM0
	0x00,	// PWM1 Volume
	0x00,	// PWM2
	0x00,	// PWM3 
	0x00,	// PWM4 
	0x00,	// PWM5
	0x00,	// PWM6
	0x00,	// PWM7
	0x00,	// PWM8
	0x00,	// PWM9
	0x00,	// PWM10
	0x00,	// PWM11 
	0x00,	// PWM12 
	0x00,	// PWM13 
	0x00,	// PWM14 
	0x00,	// PWM15 Brightness
	0x8A,	// DDC_CTRL
	0x00,	// DDC_REG
	0x40,	// DDC_ADDR
	0xFF,	// INTIIC0_FLG/CLR
	0x1F,	// INTIIC0_EN	
	NOVATEK_Addr,	// IIC0_ADDR
	0xFF,	// IIC0_TXDAT
	0x00,	// IIC0_CON
	0xF0,	// IIC0_CLK
	0xFF,	// INTIIC1_FLG/CLR
	0x00,	// INTIIC1_EN
	0x00,	// IIC1_ADDR
	0xFF,	// IIC1_TXDAT
	0x00,	// IIC1_CON
	0xF3,	// IIC1_CLK
	0x00,	// INT_SRC
	0x00,	// INTEXT_FLG/CLR
	0x00,	// INTEXT_EN
	0x00,	// INTHV_FLG/CLR
	0x00,	// INTHV_EN 
	0x60,	// SYNC_REG
	0x08,	// HVO_REG
	0xE0,	// HVI_REG
	0x00,	// HPW_REG
	0x00,	// HFLT_REG
	0x0E,	// CLMP_REG
	0x20,	// PAT_LT
	0x20,	// PAT_RT
	0x20,	// PAT_UP
	0x20,	// PAT_DN
	0x0f,	// HVCNT_CTRL
	0x00,	// HCNT_LB
	0x00,	// HCNT_HB
	0x00,	// VCNT_LB
	0x00,	// VCNT_HB
	0xc8,	// DCNT_LB
	0x00,	// DCNT_HB --> 12M/60KHz = 0x00c8
	0x20,	// LCNT_LB
	0x03,	// LCNT_HB --> 60KHz/75Hz = 0x0320
	0x40,	// MUTE_CTRL
	0x00,	// ISP_REG
	0xFF,	// FLASH_BUF
	0x1f,	// RDPA_REG
	0xff,	// RDPB_REG 
	0x04,	// RDPC_REG
	0x64,	// RDPD_REG
};	

void InitMCU(void)
{
unsigned char *p;
unsigned char i;
//	P2 = 0xF0;
	p = &PortA;
	for(i=0; i<0x4A; i++){
		*p = SystemRegTab[i];
		p++;
	}
	
// set timer 0
	TMOD &= 0xf0;
	TMOD |= 0x02;
	TL0 = -250;
	TH0 = -250;
	TCON &= 0xcf;
	TCON |= 0x10;

// set timer 1
	TMOD &= 0x0f;
	TMOD |= 0x20;
	TL1 = 0xf3;		//0xf3;
	TH1 = 0xf3;		//0xf3;
	TCON &= 0x3f;
	TCON |= 0x40;

	SCON = 0x52;
	PCON |= 0x80;

// set interrupt
	CmdTxPtr1 = 0;
	CmdTxPtr2 = 0;
	CmdRxPtr1 = 0;
	CmdRxPtr2 = 0;
	T0_INT_CNT = 0;
	rwbuf = 0;
	abuf = 0;
	dbuf = 0;
	IE = 0x86;
#ifdef Debug
	flag3 = 4;
#else
	flag3 = 0;
#endif

	Sleep(50);
	PowerStatus = 0xff;
	IIC_BaudRate = 0x02;
	LoadDDCData(1);
}

void Timer0(void) interrupt 1 using 2
{
	if(++T0_INT_CNT >= 4){
		T0_INT_CNT = 0;
		if(Timer1 != 0)			// 1ms
			Timer1--;
		if(++Timer10ms >= 10){	// 10ms
			CLRWDT = 0x55;
			Timer10ms = 0;
			if(Timer2 != 0)
				Timer2--;
			if(Timer3 != 0)
				Timer3--;
			if(Timer4 != 0)
				Timer4--;
			if(RepeatTimer != 0)
				RepeatTimer--;
			if(PoSvTimer != 0)
				PoSvTimer--;
		}
	}
}

void Sleep(unsigned short time)
{
	Timer1 = time;			/* timeout n ms */
	while(Timer1 != 0){
	}
}

void WaitSetup(unsigned short time)
{
	Timer1 = time;			/* timeout n ms */
	while(Timer1 != 0){
		CheckModeChange();
	}
}

void ScanKeyPad(void)
{
//unsigned char i,j,k;
	unsigned char Temp;
	Timer1 = 0;
/*
	do{
		while((ADC_REG[3] & BIT_7) == 0){};
		KeyPad1 = ADC_REG[0] & 0x7f;
		KeyPad2 = ADC_REG[1] & 0x7f;
		if((ADC_REG[2] & 0x7f) < 0x38){
			flag1 |= BIT_7;
			return;
		}
		ADC_CON = 0x17;		//Channel;  // Start AD Convert
		ADC_CON = 0x97;		//Channel;  // Start AD Convert
//check adc0
		if(KeyPad1 > KeyTemp1){
			if((KeyPad1 - KeyTemp1 ) >  5){
				KeyTemp1 = KeyPad1;
				flag1 |= BIT_2;
				Timer1 = KeyStabTime;
			}
		}
		else{
			if((KeyTemp1 - KeyPad1 ) >  5){
				KeyTemp1 = KeyPad1;
				flag1 |= BIT_2;
				Timer1 = KeyStabTime;
			}
		}
//check adc1
		if(KeyPad2 > KeyTemp2){
			if((KeyPad2 - KeyTemp2 ) >  5){
				KeyTemp2 = KeyPad2;
				flag1 |= BIT_2;
				Timer1 = KeyStabTime;
			}
		}
		else{
			if((KeyTemp2 - KeyPad2 ) >  5){
				KeyTemp2 = KeyPad2;
				flag1 |= BIT_2;
				Timer1 = KeyStabTime;
			}
		}

//check power key
		if(((PortC & BIT_6) == 0)&&((flag3 & BIT_5) != 0)){
			flag3 &= ~BIT_5;
			flag1 |= BIT_2;
			Timer1 = KeyStabTime;
		}
		if(((PortC & BIT_6) != 0)&&((flag3 & BIT_5) == 0)){
			flag3 |= BIT_5;
			flag1 |= BIT_2;
			Timer1 = KeyStabTime;
		}
	}while(Timer1 != 0);
//change key
	if((flag1 & BIT_2) != 0x00){
		flag1 &= ~BIT_2;
		if((flag3 & BIT_2) != 0x00){
			printf("KEY1 = %x\r\n",(unsigned short)KeyTemp1);
			printf("KEY2 = %x\r\n",(unsigned short)KeyTemp2);
		}
		for(i=0; i<5; i++){
			if(KeyTemp1 > KeyTab[i])
				j = KeyTemp1 - KeyTab[i];
			else
				j = KeyTab[i] - KeyTemp1;
			if(j < 16){
				j = i;
				break;
			}
		}
		for(i=0; i<5; i++){
			if(KeyTemp2 > KeyTab[i])
				k = KeyTemp2 - KeyTab[i];
			else
				k = KeyTab[i] - KeyTemp2;
			if(k < 16){
				k = i;
				break;
			}
		}
		KeyBuffer = k << 4;
		KeyBuffer |= j;
*/

	Temp=PortA;
	Timer1=10;
	while(Timer1);
	Temp&=PortA;
	Timer1=10;
	while(Timer1);
	KeyBuffer=(~Temp)&0x1F;
	switch(KeyBuffer){
		case 0x10:
			  KeyBuffer=PowerKey;
			  break;
		case 0x08:
			  KeyBuffer=RightKey;
			  break;
		case 0x04:
			  KeyBuffer=LeftKey;
			  break;
		case 0x02:
			  KeyBuffer=DownKey;
			  break;
		case 0x01:
			  KeyBuffer=UpKey;
			  break;
		default:
			KeyBuffer=0xff;
			break;
		}
	if(KeyBuffer==KeyTemp1){flag1 &=~BIT_2;KeyTemp1=KeyBuffer;KeyBuffer=0xff;}
	else {flag1 |= BIT_2;	KeyTemp1=KeyBuffer;}		
	


    if((flag1 & BIT_2) != 0x00){/*
		if((flag3 & BIT_5) == 0){
			if(KeyBuffer == DownKey){
				flag3 |= BIT_0;
				flag2 &= ~BIT_5;
				Write24C16(0xcd,0x01);
				if((flag3 & BIT_2) != 0x00)
					printf("Entry Factory mode\r\n");
			}
			else{
				flag3 &= ~BIT_0;
				k = Read24C16(0xe1);
				k = ColorTab[k];
				if(k == 0)
					flag2 &= ~BIT_5;
				else
					flag2 |= BIT_5;
				Write24C16(0xcd,0x00);
				if((flag3 & BIT_2) != 0x00)
					printf("Release Factory mode\r\n");
			} 
			flag2 &= 0xf3;		//clear display flag
			KeyBuffer = PowerKey;
		}*/
		if((flag3 & BIT_2) != 0x00)
			printf("KeyBuffer = %x\r\n",(unsigned short)KeyBuffer);
// set repeat timer
		Repeat = KeyBuffer;
		RepeatTimer = KeyHoldTime;
	}
	else{
		if((RepeatTimer == 0)&&((OSD_Type > 0x00)||(OSD_Type < 0x04))){
			switch(Repeat){
			case LeftKey:
				KeyBuffer = Repeat;
				RepeatTimer = KeyRepeatTime;
				break;
			case RightKey:
				KeyBuffer = Repeat;
				RepeatTimer = KeyRepeatTime;
				break;
			}
		}
	}
}

void CheckKey(void)
{
//unsigned char k;
	ScanKeyPad();

//out of range
//power saving
	if((PowerStatus & BIT_7) == 0){
		if(KeyBuffer == RightKey){
			ModePoint = 0xff;
		}
		if(KeyBuffer == LeftKey){
			ModePoint--;
		}
		if(KeyBuffer != PowerKey){
			KeyBuffer = 0xff;
		}
	}

#if PanelPowerActive == High
	else if(((PortC & BIT_7) == 0)||((flag3 & BIT_1) != 0)){
#else
	else if(((PortC & BIT_7) != 0)||((flag3 & BIT_1) != 0)){
#endif
		if((KeyBuffer != PowerKey)&&(KeyBuffer != SourceKey)){
			KeyBuffer = 0xff;
		}
	}  
//
	switch(KeyBuffer){
	case PowerKey:		//POWER
		KeyBuffer = 0xff;
		if((PowerStatus & BIT_7) == 0){
			PowerStatus |= BIT_7;	//normal
			Write24C16(0xcc,PowerStatus);
			flag1 &= ~BIT_0;
			if((flag1 & BIT_3) == 0){
				flag1 |= BIT_3;
				ForceToBackground(0);	//Set fource to background
				PoSvTimer = 500;
			}
			if(ModePoint == 0xfc){
				LED_RedOn();
				InitEEPROM();
				LED_RedOff();
				LoadModeIndependentSettings();
				LoadADC_Gain();
				SetBrightness();
				sRGB();
				SetSharpness();
			}
			ScalerPowerUp();
			DVI_On();
			SourceSelect();
		}
	    else{
			OSD_OFF();
			PowerStatus &= ~BIT_7;	//power off
			Write24C16(0xcc,PowerStatus);
			if((flag3 & BIT_0) != 0){
				Write24C16(0xcd,0x00);	//disable burn in mode
				flag3 &= ~BIT_0;
			}
			PowerSaving();
			DIG_Off();
			DIV_PWND();
			LED_RedOff();
			LED_GrnOff();
		}
		break;
	case DownKey:		//MENNU
		if(PowerStatus == 0x80){
			NodeToggle=0;
			MainMenu();
		}
		else
			VideoMenu();
		Timer2 = (unsigned short)OSD_Timer * 100;
		break;
	case LeftKey:		//LEFT
	       if(NodeToggle==1){
		    if(PowerStatus == 0x80)
		       ValueDown();
		    else
			VideoValueDown();
	       }
		else{
			if(OSD_Type == 1){
			    if(PowerStatus == 0x80)
				  SelectItem();
			    else
			         VideoSelectItem();
			}                   
		}			
		Timer2 = (unsigned short)OSD_Timer * 100;
		break;
	case RightKey:		//RIGHT
	       if(NodeToggle==1){
		    if(PowerStatus == 0x80)
		       ValueUp();
		    else
			VideoValueUp();
	       }
		else{
			if(OSD_Type == 1){
			    if(PowerStatus == 0x80)
				  SelectItem();
			    else
			         VideoSelectItem();
			}                   
		}
		Timer2 = (unsigned short)OSD_Timer * 100;
		break;
	case UpKey:			//Select
		if((PowerStatus == 0x80)&&(SyncMode != 3)&&((flag1 & BIT_1) == 0)){
			if(OSD_Type == 0){
				ShowAutoAdj();
				AutoTune();
				OSD_OFF();
			}
		}
		if(OSD_Type == 1){
			NodeToggle=~NodeToggle;
			/*if(PowerStatus == 0x80)
				SelectItem();
			else
				VideoSelectItem();
			Timer2 = (unsigned short)OSD_Timer * 100; ljj*/
		}
		else if((OSD_Type == 6)||(OSD_Type == 3)){
				OSD_OFF();
		}
		KeyBuffer = 0xff;
		break;
	case SourceKey:
		if((DeviceFlag & BIT_0) != 0){		// video version
			if(++PowerStatus > 0x82){
				PowerStatus = 0x80;
			}
			Write24C16(0xcc,PowerStatus);
			SourceSelect();
		}
		KeyBuffer = 0xff;
		break;
	}
}

void LED_GrnOn(void)
{
unsigned char port;
	port = PortD;
	port |= RDPD_REG;
	port |= BIT_1;
	PortD= port;
}

void LED_GrnOff(void)
{
unsigned char port;
	port = PortD;
	port |= RDPD_REG;
	port &= ~BIT_1;
	PortD= port;
}

void LED_RedOn(void)
{
unsigned char port;
	port = PortD;
	port |= RDPD_REG;
	port |= BIT_0;
	PortD= port;
}

void LED_RedOff(void)
{
unsigned char port;
	port = PortD;
	port |= RDPD_REG;
	port &= ~BIT_0;
	PortD= port;
}

void BackLightOn(void)
{
unsigned char port;
	port = PortC;
	port |= RDPC_REG;
	port &= ~BIT_6;
	PortC = port;
	MuteTimer = 0;
	printf("on\n");
}

void BackLightOff(void)
{
unsigned char port;
	port = PortC;
	port |= RDPC_REG;
	port |= BIT_6;
	PortC = port;
	printf("off\n");

}
#if PanelPowerActive == High
void PanelPowerOn(void)
{
unsigned char port;
/*
//+3V3
	port = PortC;
	port |= RDPC_REG;
	port |= BIT_1;
	PortC = port;
	Sleep(5);
//+12V
	port |= BIT_7;
	PortC = port;*/
//+5v
	port = PortC;
	port |= RDPC_REG;
	port |= BIT_7;
	PortC= port;
	Sleep(5);
		
}

void PanelPowerOff(void)
{
unsigned char port;
/*
//+12V
	port = PortC;
	port |= RDPC_REG;
	port &= ~BIT_7;
	PortC = port;
//+3V3
	port &= ~BIT_1;
	PortC = port;*/
//+5V
	port = PortC;
	port |= RDPC_REG;
	port &= ~BIT_7;
	PortC= port;
}
#else
void PanelPowerOff(void)
{
unsigned char port;
	port = PortC;
	port |= RDPC_REG;
	port |= BIT_7;
	//port |= 0x82;
	PortC= port;
}

void PanelPowerOn(void)
{
unsigned char port;
	port = PortC;
	port |= RDPC_REG;
	port &= ~BIT_7;
	//port &= 0x7d;
	PortC= port;
}
#endif
void ResetOff(void)
{
unsigned char port;
	port = PortC;
	port |= RDPC_REG;
	port |= BIT_5;
	PortC = port;
}

void ResetOn(void)
{
unsigned char port;
	port = PortC;
	port |= RDPC_REG;
	port &= ~BIT_5;
	PortC = port;
}

void AUDIO_MUTE(void)
{
unsigned char port;
	port = PortC;
	port |= RDPC_REG;
	port |= BIT_3;
	PortC = port;
}

void AUDIO_On(void)
{
unsigned char port;
	port = PortC;
	port |= RDPC_REG;
	port &= ~BIT_3;
	PortC = port;
}

void AMP_STBY(void)
{/*
unsigned char port;
	port = PortC;
	port |= RDPC_REG;
	port |= BIT_5;
	PortC = port;*/
}

void AMP_On(void)
{/*
unsigned char port;
	port = PortC;
	port |= RDPC_REG;
	port &= ~BIT_5;
	PortC = port;*/
}

void DIG_SEL(void)
{
}

void DIG_Off(void)
{
}

void DVI_On(void)
{
}

void DIV_PWND(void)
{
}

void VideoEnable(void)
{/*
unsigned char port;
	port = PortD;
	port |= RDPD_REG;
	port |= BIT_1;
	PortD = port;*/
}

void VideoDisable(void)
{/*
unsigned char port;
	port = PortD;
	port |= RDPD_REG;
	port &= ~BIT_1;
	PortD = port;*/
}

void IntGroup1(void) interrupt 2 using 3
{
unsigned char i,DataBuf;
//	P2 = 0xF0;
	if((INT_SRC & INTIIC0_IRQ) != 0){
		i = INTIIC0_FLG;
		if(i & INTA){
			DataBuf = IIC0_DATA;
			INTIIC0_FLG = (INTA | INTRX);
			if((DataBuf & 0xFE) == NOVATEK_Addr){
				if(IIC0_CON & SRW){  // Slave Addr || 0x01 ==> Read
					IIC0_DATA = CmdTxBuffer[0];
/*
					IIC0_DATA = CmdTxBuffer[CmdTxPtr1++];
					if(CmdTxPtr1 > 63)
						CmdTxPtr1 = 0;
*/
				}
				else{  // Slave Addr ==> Write
//					CmdPtr1 = 0;
//					CmdPtr2 = 0;
				}
			}
			flag3 |= BIT_6;
		}
		else if(i & INTTX){
			if(CmdTxPtr1 != CmdTxPtr2){
				i = CmdTxBuffer[CmdTxPtr1++];
				checksum ^= i;
				IIC0_DATA = i;
			}
			else{
				IIC0_DATA = checksum;
			}
			INTIIC0_FLG = INTTX;
/*
				IIC0_DATA = CmdTxBuffer[CmdTxPtr1++];
				if(CmdTxPtr1 > 63)
					CmdTxPtr1 = 0;
*/
		}
		else if(i & INTRX){
			CmdRxBuffer[CmdRxPtr1++] = IIC0_DATA;
			if(CmdRxPtr1 > 63)
				CmdRxPtr1 = 2;
			INTIIC0_FLG = INTRX;
		} 
		else if(i & INTNAK){
			INTIIC0_FLG = INTNAK;
		}
		else if(i & INTSTOP){
			INTIIC0_FLG = INTSTOP;
			flag3 |= BIT_7;
			flag3 &= ~BIT_6;
		}
	}

}
/*
void CheckDDC2Bi(void)
{
unsigned char cmd;//,i,j;
	if((flag3 & BIT_7) != 0){
		CmdTxBuffer[0] = 0;
		while(CmdRxPtr1 != CmdRxPtr2){
			cmd = CmdRxBuffer[CmdRxPtr2++];
			if(CmdRxPtr2 > 63)
				CmdRxPtr2 = 0;
			CheckCmd(cmd);
		}
		flag3 &= ~BIT_7;
	}
}
*/
void CheckDDC2Bi(void)
{
unsigned char cmd;
	if((flag3 & BIT_7) != 0){
		checksum = 0;
		while(CmdRxPtr1 != CmdRxPtr2){
			cmd = CmdRxBuffer[CmdRxPtr2++];
			checksum ^= cmd;
			if(CmdRxPtr2 > 15)
				CmdRxPtr2 = 2;
//			printf("%x ",(unsigned short)cmd);
		}
//		printf("\r\n");
		CmdTxPtr1 = 0;
		CmdTxPtr2 = 0;
		CmdRxPtr1 = 0;
		CmdRxPtr2 = 0;
//		Check2BiCmd();
		flag3 &= ~BIT_7;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -