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

📄 main.c

📁 CRT显示器的运行程序
💻 C
字号:
#include <reg52.h>
#include "MTV212MN32.h"
#include "comm.h"
#include "osd.h"
#include "gen.h"
#include "eeprom.h"
#include "intpro.h"
#include "Ic_ctrl.h"
#include "I2C.h"




volatile unsigned char pdata GlobalBuf[48]					_at_ 0xd0;	//系统共用的存储区
/******************   全局字节变量定义(需要初试化)  **********************/
unsigned int data old_hfre_count=0;		//显示模式稳定后,水平同步频率的记数值
unsigned int data old_vfre_count=0;		//显示模式稳定后,垂直同步频率的记数值
unsigned int data hfre_range=300;		//水平同步频率的变动门限值
unsigned char data vfre_range=30;		//垂直同步频率的变动门限值
unsigned char data Hfre=0;				//当前显示模式的水平频率
unsigned char data Vfre=0;				//当前显示模式的垂直频率
unsigned char data HVpol=0;				//当前显示模式的水平和垂直同步极性
bit Flg_Key_Lock=0;  //等于1时其按键操作为up,down,exit;
                       //等于0时分别为Bright,Contrast,及Degauss;
                       //等于2时为exit;
bit Flg_Burnin_State=0;	// =1时,表示进入老化测试状态
bit Flg_Factory=0;			//=1时,表示进入工厂调试
bit Flg_BriCon_Shortcut=0;
bit Flg_SoftStart=0;		// =1时,表示需要对TDA4841/TDA4856进行软启动

//	系统配置字节的定义,该字节保存在EEPROM中
unsigned char bdata SysConfigByte;
sbit Flg_PowerSwitch_Type=SysConfigByte^7;	// 1:物理电源开关; 0:逻辑电源开关
sbit Flg_PowerState=SysConfigByte^6;		// 1:电源开; 0:电源关
sbit Flg_EnBurnIn=SysConfigByte^5;			// 1:允许产生老化信号; 0:禁止老化信号

//	关于老化代码的定义
unsigned char bdata Burnin_Code;
sbit Flg_Burnin_Hsize	=Burnin_Code^7;		// =1:水平幅度最大; =0:水平幅度最小
sbit Flg_Burnin_Self	=Burnin_Code^5;		// =1:允许产生自测信号
sbit Flg_Burnin_STF1	=Burnin_Code^4;		
sbit Flg_Burnin_STF0	=Burnin_Code^3;
sbit Flg_Burnin_RT1	=Burnin_Code^2;
sbit Flg_Burnin_RT0	=Burnin_Code^1;
sbit Flg_Burnin_STE	=Burnin_Code^0;		// =1:允许自测信号输出


/*************************定义全局位变量(不需要初始化)*************************/
bit Flg_Hfre_Lower;			//=1时,表示水平同步频率低于下限值
bit Flg_Vfre_Lower;			//=1时,表示垂直同步频率低于下限值
bit Flg_HVfre_Over;			//=1时,表示水平或者垂直同步频率高于上限值
bit Flg_Par_Adjustment;		//=1时,表示正在进行参数调节
bit Flg_VGA350;				//=1时,表示当前显示模式是350线
bit Flg_EnAutoSave;			//=1时,表示正在请求参数自动保存
bit Flg_SyncType;				//=1时,表示当前的同步信号类型是复合同步信号
bit Flg_AL_Proc;				//=1适,请求进行自动调整处理
bit Flg_OnLine=0;			//=1时,表示进入联机自动调整状态

unsigned char data Burnin_Clock;		// 老化的时钟计数器
unsigned char data Burnin_Min;			// 老化时钟的分
unsigned int data Burnin_Hours;		// 老化时钟的小时

void Select_Sync(void);
void Key_Process(void);
void Mode_Detect(void);
void Set_Burnin_Timing(void);
extern void Init(void);
//extern void System_State_Reset(void);
void main (void)
{
   Init();
   while(1)
   { 
     Select_Vync_Source();
     Key_Process();
     Mode_Detect();
    }
}

/****************************************************************************
*******************功能:模式检测,检测当前状态下显示模式**********************
*****************************************************************************/
void Mode_Detect(void)
{
    unsigned int data hfre_count,vfre_count;
    register unsigned char i,hvpol;
    
    if (!Flg_PowerState)  return;     //如果处于关电源的状态,则直接退出
    
    hfre_count=Get_hfre_count();
    vfre_count=Get_vfre_count();
    hvpol=Get_hv_pol();
    
    if (hvpol!=HVpol || hfre_count<old_hfre_count-hfre_range || 
    	hfre_count>old_hfre_count+hfre_range || 
    	vfre_count<old_vfre_count-vfre_range || 
    	vfre_count>old_vfre_count+vfre_range)  {
      
      // 发生显示模式变化时,关掉屏幕显示并使所有的S校正电容接通
     	Mute_ON();
        PIN_CS1=0;PIN_CS2=0;PIN_CS3=0;		
      	System_State_Reset();
      	Flg_Burnin_State=0;
      
        for (i=0;i<7;i++)  {
    		hfre_count=Get_hfre_count();
    		vfre_count=Get_vfre_count();
    		hvpol=Get_hv_pol();
    		if (hvpol!=HVpol || 
    			hfre_count<old_hfre_count-2 || hfre_count>old_hfre_count+2 ||
    			vfre_count<old_vfre_count-2 || vfre_count>old_vfre_count+2) {
    			i=0;
    			old_hfre_count=hfre_count;
    			old_vfre_count=vfre_count;
    			HVpol=hvpol;
    			}
        	Delay(50);
        	}

    	CloseOsd();		//清除osd显示

    	if (Flg_EnAutoSave)  {	//该条件成立,说明在显示模式改变之前有请求参数保存
    		if (Flg_Factory)  Save_Parameter();
    		else {
				sEvent_SavePar(0);
				Flg_EnAutoSave=0;}
    		}

    	//设置一些需要设置的参数
    	sEvent_SysReset(0);
		sEvent_PowerSaving(0);

    	old_hfre_count=Get_hfre_count(); 
    	old_vfre_count=Get_vfre_count();       
    	HVpol=Get_hv_pol();
    	Hfre=128000L/(old_hfre_count+1);
    	Vfre=62500L/old_vfre_count;
		    	
    	//下面将判断水平和垂直同步频率有无超出范围
    	Flg_HVfre_Over=0;
		if (Hfre>Max_Hfre || Vfre>C_FV_UPPER)  {
			Flg_HVfre_Over=1;
			Show_HVfre_InfoPat();
			sEvent_PowerSaving(40);		//20秒之后进入节能
			return;
			}

		//下面将判断同步频率是否低于下限值
    	Flg_Hfre_Lower=0;
    	Flg_Vfre_Lower=0;
    	
    	if (Hfre<C_FH_LOWER) Flg_Hfre_Lower=1;
    	if (Vfre<C_FV_LOWER) Flg_Vfre_Lower=1;
    	if (Flg_Hfre_Lower || Flg_Vfre_Lower)  {
			if (Flg_Hfre_Lower && Flg_Vfre_Lower && Flg_EnBurnIn)  {
                  	//进入产生老化测试信号的处理
			/*if (Flg_Hfre_Lower && Flg_Vfre_Lower)  {	//进入产生老化测试信号的处理*/
				Flg_Burnin_State=1;
				Burnin_Clock=0;
				Burnin_Min=0;
				Burnin_Hours=0;
				Burnin_Code=0x21;	// 00100001B
				Set_Burnin_Timing();
				Show_BurninInfo_Pat();
				return;
				}
			
			else  {		//进入节能处理
				XFR_HVCTR2=0x21;	//#00100001B
				sEvent_PowerSaving(6);
				return;
				}
    		}

    	XFR_HVCTR2=0;       //禁止产生自测画面 
    	Delay(30);
    	//old_hfre_count=get_hfre_count(); 
    	//old_vfre_count=get_vfre_count();       
    	//HVpol=get_hv_pol();
    	//Hfre=128000/(old_hfre_count+1);
    	//Vfre=62500/old_vfre_count;
    	    
		//	设置水平和垂直同步信号频率计数值变化的门限值
		//hfre_range=old_hfre_count/1000;
		//vfre_range=old_vfre_count/100;
		hfre_range=((unsigned long)old_hfre_count*old_hfre_count)/(128000L-old_hfre_count);
		vfre_range=((unsigned long)old_vfre_count*old_vfre_count)/(62500L-old_vfre_count);
	
    	Set_CS_switch(Hfre);
    	Get_Mode_Num();
    	Get_Mode_Data();
//    	Set_V_Blank(Hfre);
//    	Set_Osd_Par();
    	Set_Vsize();
    	Out_All_Parameter();
    	CloseOsd();
		sEvent_DisplayMuteOFF(50);
    	}
}  



/********************************************************************  
* 	函 数 名: Set_Burnin_Timing
* 	功能描述: 在老化状态时,切换老化的模式(主要是时序)
* 	输    入: 无
* 	返    回: 无
***********************************************************************/
void Set_Burnin_Timing(void)
{
	Mute_ON();
	sEvent_PowerSaving(0);
	sEvent_SysReset(0);
	CloseOsd();
	XFR_HVCTR2=Burnin_Code&0x3f;
	Set_pLED_Normal();
	Set_Power_Normal();

	Flg_VGA350=0;				// 非350线模式
	//Flg_Osd_v_Position=1;		// 设置OSD垂直位置的范围
	Vfre=60;

	CurrentModel=1;
	Hfre=31;
	//OsdHpos_Bias=12;				// 设置OSD水平位置的范围
	//OsdHpos_Divisor=22;
	if (Flg_Burnin_STF1)  {
		CurrentModel=9;
		Hfre=64;
		//OsdHpos_Bias=29;			// 设置OSD水平位置的范围
		//OsdHpos_Divisor=26;
		}
	
    Set_CS_switch(Hfre);
    Get_Mode_Data();
    //Set_LM1237_PLL(Hfre);
    //Set_V_Blank(Hfre);

    //	设置与OSD显示相关的参数
    //Write_LM1237_Reg(0x04,130);		// 设置OSD窗口高度
    Write_TDA4886_Reg(0x01,0xff);
    Write_TDA4886_Reg(0x02,0xff);
    if (Flg_Burnin_Hsize)  Write_TDA48XX_Reg(0x00,0xff);
    else  Write_TDA48XX_Reg(0x00,0x00);
	Out_All_Parameter();
    sEvent_DisplayMuteOFF(50);		// 设定取消MUTE的时间
}


⌨️ 快捷键说明

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