📄 misc.c
字号:
/*
********************************************************************************
*
* LCD控制程序
*
* 不是很方便归类的部分都在这里
*
* 文件名 : MISC.C
* 设计者 : Terry
********************************************************************************
* 功 能 描 述
*
* 1. 不方便归类或者类别不明显的接口函数都放在这一部分
* 2. 与这一部分相关的函数声明放在头文件GLOBAL.H当中
********************************************************************************
*/
#include "global.h"
#include "scalar.h"
#include "osd.h"
void FlashLED(void);
void PowerCtrl(uint8 state);
bit Flg_BackLighPower = 0;
bit Flg_PanelPower = 0;
/*
********************************************************************************
* 函 数 名: Delay
* 功能描述: 延时函数,延时的间隔是1ms
* 输 入: Time :控制延时的间隔
* 返 回: 无
********************************************************************************
*/
void Delay(uint16 Time)
{
uint8 i;
// 需要执行1000个指令周期
#if McuFosc == 12000000L // 时钟频率
while(Time--) {
ClearWatchDog();
i = 100;
// 这一段将执行10个指令周期
while(i--) {
_nop_();
_nop_();
}
}
#endif
// 需要执行2000个指令周期
#if McuFosc == 24000000L // 时钟频率
while(Time--) {
ClearWatchDog();
i = 200;
// 这一段将执行10个指令周期
while(i--) {
_nop_();
_nop_();
}
}
#endif
// 需要执行3000个指令周期
#if McuFosc == 36000000L // 时钟频率
while(Time--) {
ClearWatchDog();
i = 250;
// 这一段将执行12个指令周期
while(i--) {
_nop_();
_nop_();
_nop_();
_nop_();
}
}
#endif
// 需要执行6000个指令周期
#if McuFosc == 72000000L // 时钟频率
while(Time--) {
ClearWatchDog();
i = 250;
// 这一段将执行12个指令周期
while(i--) {
_nop_();
_nop_();
_nop_();
_nop_();
}
i = 250;
// 这一段将执行12个指令周期
while(i--) {
_nop_();
_nop_();
_nop_();
_nop_();
}
}
#endif
}
/*
********************************************************************************
* 函 数 名: PowerLED
* 功能描述: 根据输入的状态,控制电源指示灯的显示
* 输 入: state,指明电源指示灯的状态
* 返 回: 无
********************************************************************************
*/
void PowerLED(POWERSTATE state)
{
#if EN_PLED_INVERSE
switch(state) {
case POWER_NORMAL:
Pin_LEDG_High();
Pin_LEDY_Low();
break;
case POWER_SUSPEND:
case POWER_STADBY:
Pin_LEDG_High();
Pin_LEDY_High();
break;
case POWER_OFF:
Pin_LEDG_Low();
Pin_LEDY_High();
break;
case POWER_CUTOFF:
Pin_LEDG_Low();
Pin_LEDY_Low();
break;
}
#else
switch(state) {
case POWER_NORMAL:
Pin_LEDG_Low();
Pin_LEDY_High();
break;
case POWER_SUSPEND:
case POWER_STADBY:
Pin_LEDG_Low();
Pin_LEDY_Low();
break;
case POWER_OFF:
Pin_LEDG_High();
Pin_LEDY_Low();
break;
case POWER_CUTOFF:
Pin_LEDG_High();
Pin_LEDY_High();
break;
}
#endif
}
/*
********************************************************************************
* 函 数 名: BackLightPower
* 功能描述: 背光灯电源控制
* 输 入: ON/OFF ON:电源打开 OFF:电源关闭
* 返 回: 无
********************************************************************************
*/
void BackLightPower(SWITCHSTATE state)
{
#if EN_BLPOWER_INVERSE
if (state == ON) {
Flg_BackLighPower = 1;
Pin_BLP_High();
}
else {
Flg_BackLighPower = 0;
Pin_BLP_Low();
}
#else
if (state == ON) {
Flg_BackLighPower = 1;
Pin_BLP_Low();
}
else {
Flg_BackLighPower = 0;
Pin_BLP_High();
}
#endif
}
void Flash(uint8 Count)
{
uint8 i;
for (i = 0; i < Count; i++) {
PowerLED(POWER_OFF);
Delay(200);
PowerLED(POWER_NORMAL);
Delay(200);
}
}
/*
********************************************************************************
* 函 数 名: DisplayMute
* 功能描述: 关闭屏幕显示
* 输 入: 无
* 返 回: 无
* 注 意: 如果不关闭背光灯,那么屏幕依然可以看见底光
********************************************************************************
*/
void DisplayMute(uint8 state)
{
if (state==ON) {
SarCapture(OFF);
BackLightPower(OFF);
}
else {
//WrScalarReg(rP159, 0xA0);
SarCapture(ON);
SarDispCtrl(DISP_NORMAL);
Delay(100);
BackLightPower(ON);
}
}
/*
********************************************************************************
* 函 数 名: PanelPower
* 功能描述: Panel电源控制
* 输 入: ON/OFF ON:电源打开 OFF:电源关闭
* 返 回: 无
********************************************************************************
*/
void PanelPower(uint8 state)
{
if (state==ON) {
Pin_PanelPower_High(); // 用MCU控制
Flg_PanelPower = 1;
}
else {
Pin_PanelPower_Low(); // 用MCU控制
Flg_PanelPower = 0;
}
}
/*
********************************************************************************
* 函 数 名: PanelPowerSequence
* 功能描述: Panel的开/关电源的顺序,通常Panel对开关电源都有严格的时序
* 要求,否则对Panel是有损坏的
* 输 入: ON/OFF ON:Panel上电 OFF:Panel断电
* 返 回: 无
********************************************************************************
*/
void PanelPowerSequence(uint8 state)
{
if (state == ON) {// 上电的操作
PanelPower(ON);
Delay(PanelOnOff_T2);
SarDataOut(ON);
SarDispCtrl(DISP_OSD);
SarLVDSPower(ON);
Delay(PanelOnOff_T3);
//BackLightPower(ON);
}
else { // 断电的操作
BackLightPower(OFF);
Delay(PanelOnOff_T4);
SarDispCtrl(DISP_MUTE);
SarDataOut(OFF);
SarLVDSPower(OFF);
Delay(PanelOnOff_T5);
PanelPower(OFF);
}
}
/*
********************************************************************************
* 函 数 名: PowerSaving
* 功能描述: 系统状态复位
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void PowerSaving(void)
{
CtrlOsdReset();
switch (SysState) {
case SYS_OUTOFHLOW:
case SYS_OUTOFVLOW:
PowerLED(POWER_SUSPEND);
break;
case SYS_OUTOFHIGH:
case SYS_OUTOFLOW:
PowerLED(POWER_OFF);
break;
}
PanelPowerSequence(OFF);
SarPower(POWER_STADBY);
#if USE_AUDIO //chen 08-05-22
AudioPowerDown();
#endif
}
bit Flg_FlashLED = 0;
/*
********************************************************************************
* 函 数 名: FlashLED
* 功能描述: 使电源指示灯闪烁
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void FlashLED(void)
{
if (SysPar.Flag & FLAG_POWER) {
Flg_FlashLED = ~Flg_FlashLED;
if (Flg_FlashLED) PowerLED(POWER_OFF);
else PowerLED(POWER_NORMAL);
}
}
/*
********************************************************************************
* 函 数 名: SetBackLight
* 功能描述: 控制背光灯的亮度,这是通过SCALAR输出的PWM来调整,而不是原来的MCU输出
* 输 入: val : 背光灯的亮度值
* 返 回: 无
********************************************************************************
*/
void SetBackLight(uint8 val)
{
val = ((uint16)val * 255)/100;
#if EN_BACKLIGHT_INVERSE
WrScalarReg(rP075, val);
WrScalarReg(rP074, 255 - val);
WrScalarReg(rP077, val);
WrScalarReg(rP076, 255 - val);
#else
WrScalarReg(rP074, val);
WrScalarReg(rP075, 255 - val);
WrScalarReg(rP076, val);
WrScalarReg(rP077, 255 - val);
#endif
}
/*
********************************************************************************
* 函 数 名: PowerOn
* 功能描述: 开电源
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void PowerOn(void)
{
PowerLED(POWER_NORMAL);
LoadAllPar();
SarPostInit();
OsdInit();
SyncInit();
#if EN_LOGO
MenuShowLogo();
OsdInit();
#endif
#if EN_PanelReverse
PanelReverse();
#endif
ModeState = MODE_INIT;
Pin_SysPower = HIGH;
}
/*
********************************************************************************
* 函 数 名: PowerOff
* 功能描述: 关电源
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void PowerOff(void)
{
DisplayMute(ON);
PowerLED(POWER_CUTOFF);
SetTimerEvent(EVENT_MUTEOFF, 0x00);
SetTimerEvent(EVENT_SYSREST, 0x00);
if (GetEventTime(EVENT_SAVEPAR)) SaveAllPar();
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(400);
}
/*
********************************************************************************
* 函 数 名: HexToDisp
* 功能描述: 将16进制数转换成可以显示的OSD字符,并放入制定的缓冲区
* 输 入: Flag : 0表示转成可显示的基本码,1: 表示转成ASCII码
* Hex : 需要转换的16进制数
* Str : 结果存放的目的缓冲区指针
* 返 回: 返回转换的位数
* 注 意: 这里采用的是减法进行转换,另外的方法还有除法转换和循环移位的方法
********************************************************************************
*/
uint8 HexToDisp(uint8 Flag, uint16 Hex, uint8 *Str)
{
uint16 va;
uint8 i;
bit Flg_Inc;
va = 10000;
i = 0;
Flg_Inc = 0;
for (;;) {
if (Flag) Str[i] = '0';
else Str[i] = 1;
while ((Hex >= va) && (va > 9)) {
Hex -= va;
Str[i]++;
Flg_Inc = 1;
}
va /= 10;
if (Flg_Inc) i++;
if (va <= 9) break;
}
if (Flag) Str[i] = Hex + '0';
else Str[i] = Hex + 1;
return (i + 1);
}
/*
********************************************************************************
* 函 数 名: PanelReverse
* 功能描述: 控制Panel左右上下的翻转控制
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
#if EN_PanelReverse
void PanelReverse(void)
{
}
#endif
void ActivePowerSaving(void)
{
SetTimerEvent(EVENT_POWERSAVING, SysPar.PowerSaveTime<<1);
}
uint8 code MenuSource[] = {
SOURCE_VGA,
};
uint8 GetSourceCount(void)
{
return sizeof(MenuSource);
}
/*
********************************************************************************
* 函 数 名: SelVideoInput
* 功能描述: 选择视频信号输入的通道,这里头包括Video Decoder的视频信号通道选择
* 同时也包括Scalar的通道选择。
* 输 入: input : 指定信号的输入源
* 返 回: 无
********************************************************************************
*/
void SelVideoInput(uint8 input)
{
uint8 rp1a7,rp1a8;
#if USE_AUDIO
AudioMute(ON);
#endif
rp1a7 = 0x0A; // 设定同步变化的门限
rp1a8 = 0x26;
SyncSelType(SYNCTYPE_SEPA);
switch (input) {
case SOURCE_VGA:
WrScalarReg(rP008, B0000_0000); // 选择图形口输入,0通道
//WrScalarReg(rP008, B0000_0100); // 选择图形口输入,1通道
WrScalarRegBit(rP020, 0x00, 0x02); // 选择模拟输入
WrScalarReg(rP023, 0x00); // VGA输入
WrScalarReg(rP16E, 0x07);
WrScalarReg(rP060, 0x01);
AdcDigitalContrast(0x90);
SyncInt(ON);
SarSetColorToneMode(CEM_OFF);
SarBF3YCPeaking_Disable();
break;
case SOURCE_DVI_D:
WrScalarReg(rP008, B0000_0000); // 选择图形口输入,0通道
WrScalarRegBit(rP020, 0x02, 0x02); // 选择数字输入
WrScalarReg(rP023, B0010_1000); // 数字输入条件下的一些参数设定
WrScalarReg(rP023, 0x00);
WrScalarReg(rP16E, 0x07);
WrScalarReg(rP060, 0x01);
AdcDigitalContrast(0x90);
SyncInt(ON);
SarSetColorToneMode(CEM_OFF);
SarBF3YCPeaking_Disable();
break;
default:
WrScalarReg(rP008, B0000_1000); // 选择视频口输入
WrScalarRegBit(rP020, 0x00, 0x02); // 选择模拟输入
WrScalarReg(rP023, 0x01); // YPbPr输入
//WrScalarReg(rP16E, 0xC6);
WrScalarReg(rP16E, 0x86);
WrScalarReg(rP040, B0100_0010);
WrScalarReg(rP041, B0000_0000);
WrScalarReg(rP042, B0000_0000);
WrScalarReg(rP060, 0x05);
AdcDigitalContrast(0xB0);
rp1a7 = 0x0A;
rp1a8 = 0x28;
SarSetColorToneMode(CEM_HIGH);
SarBF3YCPeaking_Enable();
WrScalarWord(rP14E, RdScalarWord(rP14C)/2);
break;
}
SarAutoOffset();
WrScalarReg(rP1A7, rp1a7);
WrScalarReg(rP1A8, rp1a8);
}
/*
********************************************************************************
* 4:3 = 1.333 640 x 480, 800 x 600, 1024 x 768, 1400 x 1050, 1600 x 1200
* 5:4 = 1.25 1280 x 1024
* 15:10 = 1.5
* 16:9 = 1.778 1280 x 720, 1366 x 768
* 16:10 = 1.6 1280 x 800, 1440 x 900, 1680 x 1050, 1920 x 1200
* 10:6 = 1.667 800 x 480, 1280 x 768
********************************************************************************
*/
bit IsWidthPanel(void)
{
uint8 scale;
scale = ((uint32)PanelWidth * 100)/PanelHeight;
if (scale > 145) return 1;
else return 0;
}
/*
********************************************************************************
* 文 件 结 束 *
********************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -