📄 main.c
字号:
/*
********************************************************************************
*
* 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 + -