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

📄 main.c

📁 NT68617源程序代码集合
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
********************************************************************************
*
*	                                LCD控制程序
*
*	                            这是主程序循环模块
*
*	文件名	: MAIN.C
*	设计者	: Terry
********************************************************************************
*                                   功 能 描 述
*
*		1. 主循环处理
*		2. 初始化的主流程
*		3. 定时触发事件的处理
********************************************************************************
*/
#include "global.h"
#include "scalar.h"


/*
********************************************************************************
*	以下放的是全局变量的定义
********************************************************************************
*/
uint8 xdata SCRev;						// SCALAR的版本定义
uint8 SysState = SYS_POWEROFF;			// 定义系统当前所处的状态
uint8 volatile SysTmr = 0;				// 定时计数器,可以用来设置超时间隔
uint8 InputSource;
uint8 xdata ParAdjState = ADJPAR_NONE;
uint8 xdata Language;

//	下面是系统所使用到的全局标志
bit Flg_Factory;					// 工厂模式标志
bit Flg_NonFullScreen;			// 非全屏幕
bit Flg_ParAdj = 0;
bit Flg_EnBurning = 0;				// (0)表示禁止老化, (1)表示允许老化
bit Flg_ModeDetectContinue = 0;		// (0)表示禁止继续检测模式, (1)表示允许继续检测模式

static bit Flg_SysTmrIsr = 0;		// 定时中断0的处理标志


//	以下是可调整的参数,通常保存在EEPROM当中
MODEREL   xdata ModePar;
SYSPAR    xdata SysPar;
ADCPAR    xdata AdcPar;
COLOR	  xdata Color;

//	以下主要是本模块所使用到的变量
static xdata uint8 TimerEventCount[LASTEVENT+1];		// 定时触发事件计数器
uint8 LongTimerEventCount = TMREVENT_TICKS;	// 长定时时间的计数器
uint8 BurnInTmr = BURNIN_PRIO;

//以下是使用DDC CI 通讯时需要用到的变量 08-04-25
#if EN_DDC_CI
	//----------ddcci.c  Adjust -------------------//
	xdata short AdjusterValue = 0;
	//-----------------ram.c---------------------

	uint8 cCmdPointer;
	uint8 cCheckSum;
	xdata unsigned char cReplyLength;
	xdata unsigned char ucActiveControl;
	xdata unsigned char ucNewControl = 0xff;

	uint8 xdata AbusBuffer[40];
	
	bit bCmdReady;
	bit bDeviceReady=FALSE; //device ready work not in DDCCI
	bit bNullMessage=FALSE;
#endif	


uint8 bdata AdjState;

sbit sF_Bit07 = AdjState ^ 7;
sbit sF_Bit06 = AdjState ^ 6;
sbit sF_Bit05 = AdjState ^ 5;
sbit sF_Bit04 = AdjState ^ 4;
sbit sF_Bit03 = AdjState ^ 3;
sbit sF_Bit02 = AdjState ^ 2;
sbit sF_Bit01 = AdjState ^ 1;
sbit sF_Bit00 = AdjState ^ 0;


/*
================================================================================
=	以下的这些数据都会被保存到EEPROM当中,作为EEPROM有没有被初始化的标志,因此
=	如果程序改变这些数据中的一个,而导致校验和与EEPROM不一样时,就会导致在首次
=	上电时,重新初始化EEPROM
================================================================================
*/
uint8 code StrUserName[]	= UserName; //UserName;
uint8 code StrBoard[]   	= ADboardName;
uint8 code StrVersion[] 	= FWVersion;
uint8 code StrPanel[]   	= PanelName;
uint8 code StrRelease[] 	= ReleaseDate;

/*
================================================================================
=	函数的声明
================================================================================
*/
static void Init(void);
static void SysTimer(void);
void InitSysTimer(void);
static void InitMcu(void);
static void PollTimerEvent(void);

#if USE_COMQUEUE
void (code *Comm_Fun_Index)();
static void Init_Command_Queue(void);
static uint16 Pop_Command(void);
#endif


/*
================================================================================
=	主函数从这里开始
=	1、完成初始化之后就进入主循环
=	2、清除看门狗
=	3、定时器的处理以及定时时间的处理,包括按键的扫描等
=	4、完成红外遥控的接受
=	5、完成按键以及遥控输入事件的处理
=	6、完成同步信号的检测和处理,这是整个系统是否可靠的主要流程

=	为了降低调用的深度,需要将一些处理从子程序放到主循环当中,虽然会影响一定的
=	简洁性
================================================================================
*/
void main(void)
{
	Init();

#if EN_BF3ACCMODE
	SarBF3ACCPoll();
#endif	
	while (1)  {
		ClearWatchDog();
		SysTimer();
		CtrlKeyProc();
		if(SysPar.Flag & FLAG_POWER)		SyncDet();		//chen 08-05-08
		
	#if EN_BF3ACCMODE
		SarBF3ACCCheck(1);
	#endif
	
	#if USE_COMQUEUE
		Comm_Fun_Index=(void code *)Pop_Command();
		if (Comm_Fun_Index) (*Comm_Fun_Index)();
	#endif

	#if EN_DDC_CI
		DDC2Bi_Handler();
	#endif
		}
}


/*
********************************************************************************
* 	函 数 名: Init
* 	功能描述: 系统初始化
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
static void Init(void)
{
	InitMcu();						// 对MCU进行初始化
	PanelPower(OFF);

#if USE_COMQUEUE
	Init_Command_Queue();			// 初始化系统命令队列
#endif

	SarPostInit();
	KeyInit();						// 键盘模块初始化
	InitSysTimer();				// 初始化系统定时器
	LoadFlashToBuffer();
	LoadAllPar();
	LoadEdid();

    IP 	= B0000_0000;				// 设定中断优先级
	IT0 = 0;						// 采用低电平触发
	IT1 = 0;						// 采用低电平触发

	ET0 = 1;						// 允许定时中断0
	EX0 = 1;
    EA 	= 1;						// 打开所有中断

//调用PowerOff里面的部分函数// 08-05-10
//因为硬开机的时候会出现PLL的频率变成一半,而软开关机目前没有,
//有待日后确认是否可行
//	DisplayMute(ON);
//	SarCapture(OFF);
//	CtrlOsdReset();
//	PanelPowerSequence(OFF);
//	SarPower(POWER_CUTOFF);
		
//	Flg_Factory = 0;
			
//#if USE_AUDIO
//	AudioPowerDown();
//#endif
	
//	SysState = SYS_POWEROFF;
//	ModeState = MODE_POWEROFF;
//	DisableScalarInt();
//	Flg_SyncInt = 0;
//	Pin_SysPower = LOW;
//	Delay(100);
//结束调用

	if (SysPar.Flag & FLAG_POWER)  PowerOn();
	else  PowerOff();
}


#if MLB0L8
uint8 code McuRegTab[][2] = {
IDX_BANK_SET,	CODE_2BANK,
IDX_INTSC_EN,	0x00,
IDX_PORTA,		0x00,
IDX_PORTB,		0x3F,
IDX_RDPA,		0x00,
IDX_RDPB,		0x3F,
IDX_WDT,		0xAA,
IDX_ADCCON,		0x00,
IDX_ENPWM_HB,	xB_EN_PWM8,
IDX_PWM8,		0x00,

IDX_INT_SRC,	0x00,
IDX_INTEXT_CLR,	0xFF,
IDX_INTEXT_EN,	0x03,
#if EN_NT68167_C || EN_NT68167_B
IDX_LDO_ADJ,	0x8B,	// APLL_PowerUp    enable current adj
IDX_CURR_ADJ2,	0x05,	// set SPI current to minimal
#endif

#if EN_NT68167_C
#if McuFosc == 36000000L
IDX_CPU_CLK,	CPU_CLK_36M,
#elif McuFosc == 72000000L
IDX_CPU_CLK,	CPU_CLK_72M,
#elif McuFosc == 12000000L
IDX_CPU_CLK,	CPU_CLK_12M,
#else
IDX_CPU_CLK,	CPU_CLK_24M,
#endif
//IDX_CPU_CLK,	0x10,
#endif
};
#endif


/*
********************************************************************************
* 	函 数 名: InitMcu
* 	功能描述: 进行MCU初始化
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/
static void InitMcu(void)
{
	uint8 xdata *Addr;
	uint8 i;

	P3 = B1101_1101;
	EA = 0;
//	初始化MCU的寄存器
	for(i = 0; i < sizeof(McuRegTab)/2; i++)  {
		Addr = 0xF000 + McuRegTab[i][0];
		*Addr = McuRegTab[i][1];
		}

MCUREINIT:
//	对SCALAR进行初始化
	i = 100;
	do {
		if (XFR_SC_HW_RST & xB_SC_LOSS) {
			XFR_SC_HW_RST = xB_SC_LOSS | xB_PBUS_EN;
			XFR_SC_HW_RST = xB_PBUS_EN;
			Delay(10);
			}
		else  {
			XFR_SC_HW_RST = xB_PBUS_EN;
			XFR_SC_HW_RST = xB_PBUS_EN | xB_SC_RST;
			break;
			}
		}while(--i);

	WrScalarReg(rP102, 0x60);		// DPLL power & DPLL power
	//SarMPLLPower(ON);
#if EN_NT68167_B
	WrScalarReg(rPB04, 0x02);		//0x02	// MCU PLL by pass	//chen  08-05-19 rPB04.1为MCU CLK方式设置
#else
	WrScalarReg(rPB04, 0x00);		//0x02	// MCU PLL by pass	//chen  08-05-19 rPB04.1为MCU CLK方式设置
#endif
	WrScalarReg(rPB40, 0x04);		// MPLL max. range
#if EN_NT68167_C
	WrScalarReg(rPB41, 0x05);		//08-05-19 update  // 	MPLL control
#endif
	WrScalarReg(rPB43, 0x15);		//0x2A	// MPLL VCO swing

	//if (RdScalarReg(rP102) != 0x60) goto MCUREINIT;
#if EN_NT68167_B
	if (RdScalarReg(rPB04) != 0x02) goto MCUREINIT;
#else
	if (RdScalarReg(rPB04) != 0x00) goto MCUREINIT;
#endif
	if (RdScalarReg(rPB40) != 0x04) goto MCUREINIT;
#if EN_NT68167_C
	if (RdScalarReg(rPB41) != 0x05) goto MCUREINIT;
#endif
	if (RdScalarReg(rPB43) != 0x15) goto MCUREINIT;

}


//	该数组控制按键的读取电压范围
uint8 code KeyInRange[][2] = {
0, 5,
62, 68,
74, 80,
122, 127,
};
//	该数组控制返回的按键代码
uint8 code KeycodeArry[4][4] = {
KEYCODE_POWERMENU,	KEYCODE_NOPRESS,	KEYCODE_NOPRESS,	KEYCODE_POWER,
KEYCODE_NOPRESS,	KEYCODE_INCDEC,		KEYCODE_NOPRESS,	KEYCODE_INCREASE,
KEYCODE_NOPRESS,	KEYCODE_NOPRESS,	KEYCODE_NOPRESS,	KEYCODE_AUTO,
KEYCODE_MENU,		KEYCODE_DECREASE,	KEYCODE_SELECT,		KEYCODE_NOPRESS,
};
/*
********************************************************************************  
* 	函 数 名: KeyGetKeyCode
* 	功能描述: 从键盘缓冲区中读按键代码,如果如果没有按键输入则返回KEYCODE_NOPRESS
* 	输    入: 无
* 	返    回: 按键的代码
********************************************************************************
*/
uint8 KeyGetKeyCode(void)
{
	uint8 i, x, y;
	uint8 Val;

	XFR_ADCCON = xB_STRT_ADC | xB_EN_ADC2 | xB_EN_ADC3;
	do {}while(!(XFR_ADC3 & 0x80));
	Val = XFR_ADC2 & 0x7F;
	x = 3;
	for (i = 0; i < 4; i++) {
		if (Val >= KeyInRange[i][0] && Val <= KeyInRange[i][1]) {
			x = i;
			break;
			}
		}
	//XFR_ADCCON = xB_STRT_ADC | xB_EN_ADC3;
	//do {}while(!(XFR_ADC3 & 0x80));
	Val = XFR_ADC3 & 0x7F;
	y = 3;
	for (i = 0; i < 4; i++) {
		if (Val >= KeyInRange[i][0] && Val <= KeyInRange[i][1]) {
			y = i;
			break;
			}
		}
	
	//XFR_ADCCON = xB_STRT_ADC | xB_EN_ADC2 | xB_EN_ADC3;
	return KeycodeArry[x][y];
}


⌨️ 快捷键说明

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