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

📄 service.c

📁 以ST公司CPU为核心的彩色电视机的完整源程序。
💻 C
字号:
#include "tv_glob.h"
#include "st92196.h"
#include "service.h"
#include "command.h"
#include "register.h"
#include "menuctrl.h"
#include "command.h"
#include "control.h"
#include "timer.h"
#include "video.h"
#include "i2c_bus.h"
#include "utility.h"
#include "eeprom.h"
#include "channel.h"
#include "autosrch.h"
#include "display.h"
#include "osddrv.h"
#include "osdutil.h"
#include "osdchar.h"
#include "osdconst.h"
#include "tuning.h"
#include "osdchar.h"
#include "io.h"

#ifdef ST9306
#include "st9306.h"
#endif

/*****************************************************************************
INPUTS     : 
OUTPUTS    : 
DESCRIPTION: 
*****************************************************************************/
void enable_service_mode(void)
{
	unsigned char j;
    display_request_flags = display_request_flags | SERVICE_DISPLAY; 
    menu_page = MENU_SERVICE;           
	menu_item = ITEM_AGC;
	menu_theme =0x00;

	osd_disabled();
	j = misc3 & 0x04;
	if (j == 0)
		write_video_ram_data(BLUE_SCREEN, 0x00);    
}

void disable_service_mode(void)
{
    display_request_flags =0x0;
    menu_page =0xff;
    menu_item =0xff;
	menu_theme=0xff;
	osd_disabled();
}


void adjust_vco_fine_to_centre(void)
{
unsigned char i,j,k;

	do
	{
	vco_fine_high();
	read_video_new();
	i = read_data[2] & 0x07;
	}while(i==0);
	vco_fine--;
	j = vco_fine;
	
	do
	{
		vco_fine_low();
		read_video_new();
		i = read_data[2] & 0x07;
	}while(i==0);
		vco_fine++;
		k = vco_fine;
		vco_fine = (j+k)/2;
		vco_fine_high();
}
/**************************************************************/
void auto_vco_adjust(void)
{
	tuning_flags = tuning_flags | AUTO_VCO_REQUEST;
	vco_coarse = 0;
	write_video_ram_data(PIF_COARSE, vco_coarse);
	vco_fine = 0x3F;
	write_video_eeprom_data(PIF_FINE, (vco_fine * 2));
}


/*****************************************************************************
INPUTS     : 
OUTPUTS    : 
DESCRIPTION: 
*****************************************************************************/
void process_service_command(unsigned char current_command)
{
    if (command_flags & COMMAND_VALID)
    {
  		switch (current_command) 
        {
        
        case COMMAND_CHANNEL_UP:
			menu_item |= MENU_DIRECTION;
        case COMMAND_CHANNEL_DOWN:
           	tuning_flags = tuning_flags & ~AUTO_VCO_REQUEST; 
			menu_item_roll_change_service();
			update_repeat_timer((SERVICE_UP_NORMAL_TIME << 8) | SERVICE_UP_INITIAL_TIME);
		    display_request_flags = display_request_flags | (REFRESH_DISPLAY);
        break;

        case COMMAND_RIGHT:
            menu_item |= MENU_DIRECTION;
        case COMMAND_LEFT:
            tuning_flags = tuning_flags & ~AUTO_VCO_REQUEST;
            next_service_item_left_right(); 
			update_repeat_timer((SERVICE_LEFT_NORMAL_TIME << 8) | SERVICE_LEFT_INITIAL_TIME);
            display_request_flags = display_request_flags | (REFRESH_DISPLAY);
			break;
			
		}
	 }	
    
    if(command_flags & COMMAND_NEW )
    {
		unsigned char i;
  		switch(current_command)
		{
		case COMMAND_SERVICE:            
				update_repeat_timer((MENU_NORMAL_TIME << 8) | MENU_INITIAL_TIME);
	            disable_service_mode();
				tuning_flags = tuning_flags & ~AUTO_VCO_REQUEST;
				misc_store();
		break;
		case COMMAND_OK:
//				if(P0DR & DESIGN)
//				{
					update_repeat_timer((MENU_NORMAL_TIME << 8) | MENU_INITIAL_TIME);
                    menu_page = MENU_DESIGN;           
                    menu_item = ITEM_AGC_GAIN;
//				}
		break;
		
		case COMMAND_MENU:
            if(menu_page == MENU_SERVICE)
                {
                if((menu_item == ITEM_VCO_COARSE)||(menu_item == ITEM_VCO_FINE))
                    {
                    read_video_new();
		            i = read_data[2] & 0x07;
		            if(i == 0)
		                {	
			            adjust_vco_fine_to_centre();
		                }
		            }
	            }
		break;

#ifdef ST9306
        case COMMAND_9 :
			update_repeat_timer((MENU_NORMAL_TIME << 8) | MENU_INITIAL_TIME);
            menu_page = MENU_ST9306;           
            menu_item = ITEM_V_AMP;
            init_st9306();
            
        break;
#endif

		case COMMAND_TV_AV: //feman:It' for vco automatic adjust. 
            if(menu_page == MENU_SERVICE)
            {
    	    if((menu_item == ITEM_VCO_COARSE)||(menu_item == ITEM_VCO_FINE))
	            {		
                auto_vco_adjust();
		        display_request_flags = display_request_flags | (REFRESH_DISPLAY);
		        }
		    }
		break;

		case COMMAND_POWER:            
            disable_service_mode();
			tv_flags = tv_flags ^ ENABLE_POWER;
		break;
        }
	  	display_request_flags = display_request_flags | REFRESH_DISPLAY;
	}
	command_flags = command_flags & ~(COMMAND_NEW | COMMAND_VALID);
}

/*****************************************************************************
INPUTS     : 
OUTPUTS    : 
DESCRIPTION: Service Menu
*****************************************************************************/
void next_service_item_left_right(void)
{
    switch (menu_page)
	{
    case MENU_SERVICE:
		if (menu_item & MENU_DIRECTION)
		{
			menu_item = menu_item &~MENU_DIRECTION;
			switch(menu_item)
			{
			case ITEM_AGC:
				agc_high();				
			break;
			case ITEM_RED_GAIN:
				red_gain_high();
			break;
			case ITEM_R_CUTOFF_PAL:
				red_cutoff_pal_high();
			break; 
			case ITEM_GREEN_GAIN:
				green_gain_high();
			break;
			case ITEM_G_CUTOFF_PAL:
				green_cutoff_pal_high();
			break;
			case ITEM_BLUE_GAIN:
				blue_gain_high();				
			break;
			case ITEM_H_POSITION:
				h_position_high();				
			break;
			case ITEM_V_POSITION:
				v_position_high();				
			break;
			case ITEM_V_POSITION_60:
				v_position_60_high();				
			break;

			case ITEM_V_AMP_50:
				v_amp_50_high();				
			break;
			case ITEM_V_AMP_60:
				v_amp_60_high();				
			break;
			case ITEM_VCO_COARSE:
				write_video_ram_data(LL_SELECTION, 0x00);
				vco_coarse_high();				
			break;
			case ITEM_VCO_FINE:
				write_video_ram_data(LL_SELECTION, 0x00);
				vco_fine_high();
			break;
			}
		}
		else
		{
			switch(menu_item)
			{
			case ITEM_AGC:
				agc_low();				
			break;
			case ITEM_RED_GAIN:
				red_gain_low();
			break;
			case ITEM_R_CUTOFF_PAL:
				red_cutoff_pal_low();
			break; 
			case ITEM_GREEN_GAIN:
				green_gain_low();
			break;
			case ITEM_G_CUTOFF_PAL:
				green_cutoff_pal_low();
			break;
			case ITEM_BLUE_GAIN:
				blue_gain_low();				
			break;
			case ITEM_H_POSITION:
				h_position_low();				
			break;
			case ITEM_V_POSITION:
				v_position_low();				
			break;
			case ITEM_V_POSITION_60:
				v_position_60_low();				
			break;


			case ITEM_V_AMP_50:
				v_amp_50_low();				
			break;
			case ITEM_V_AMP_60:
				v_amp_60_low();				
			break;
			case ITEM_VCO_COARSE:
				write_video_ram_data(LL_SELECTION, 0x00);
				vco_coarse_low();				
			break;
			case ITEM_VCO_FINE:
				write_video_ram_data(LL_SELECTION, 0x00);
				vco_fine_low();				
			break;
			}
		}
	break;

   case MENU_DESIGN:
		if (menu_item & MENU_DIRECTION)
		{
			menu_item = menu_item &~MENU_DIRECTION;
			switch(menu_item)
			{
			case ITEM_AGC_GAIN:
				agc_gain_high();				
			break;
			case ITEM_MISC1:
				misc1_high();
			break;
			case ITEM_MISC2:
				misc2_high();				
			break;
			case ITEM_MISC3:
				misc3_high();				
			break; 
			case ITEM_HPOS_OSD:
				hpos_osd_high();				
			break; 
			case ITEM_VPOS_OSD:
				vpos_osd_high();				
			break; 

			}
		}
		else
		{
			switch(menu_item)
			{
			case ITEM_AGC_GAIN:
				agc_gain_low();				
			break;
			case ITEM_MISC1:
				misc1_low();
			break;
			case ITEM_MISC2:
				misc2_low();				
			break;
			case ITEM_MISC3:
				misc3_low();				
			break; 
			case ITEM_HPOS_OSD:
				hpos_osd_low();				
			break; 
			case ITEM_VPOS_OSD:
				vpos_osd_low();				
			break; 

			}
		}
	break;

#ifdef ST9306
	case MENU_ST9306 :
	     st9306_left_right();
	break;
#endif

	}
}


/*****************************************************************************
INPUTS     : 
OUTPUTS    : 
DESCRIPTION: 
*****************************************************************************/
void menu_item_roll_change_service(void)
{
    unsigned char tmp=0;
    switch(menu_page)
    {
        case MENU_SERVICE:
            tmp = ITEM_SERVICE1;
        break;
        
        case MENU_DESIGN:
            tmp = ITEM_DESIGN1;
        break;
#ifdef  ST9306
        case MENU_ST9306 :
            tmp = ITEM_EW_TRAP;
        break;
#endif
    }
    menu_item_roll_change(tmp);    
    menu_item &=~MENU_DIRECTION;
}

void display_service(unsigned char display_serv)
{
	unsigned char tmphigh,tmp=0;
		switch(display_serv)
		{
			case ITEM_AGC:
			tmp=agc;
			break;

			case ITEM_RED_GAIN:
			tmp=red_drive;
			break;  

			case ITEM_R_CUTOFF_PAL:
			tmp=red_cut_pal;
			break;  

			case ITEM_GREEN_GAIN:
			tmp=green_drive;
			break;  

			case ITEM_G_CUTOFF_PAL:
			tmp=green_cut_pal;
			break;  

			case ITEM_BLUE_GAIN:
			tmp=blue_drive;
			break;  

			case ITEM_H_POSITION:
			tmp=h_position;
			break;  

			case ITEM_V_POSITION:
			tmp=v_position;
			break;  

			case ITEM_V_POSITION_60:
			tmp=v_pos_60;
			break;  

			case ITEM_V_AMP_50:
			tmp=v_amp_50;
			break;  

			case ITEM_V_AMP_60:
			tmp=v_amp_60;
			break;  

			case ITEM_VCO_COARSE:
			tmp=vco_coarse;
			break;  

			case ITEM_VCO_FINE:
			tmp=vco_fine;
			break;  

		}
		
if(display_serv == ITEM_VCO_FINE)
    {
        tmphigh = convert_to_ASCII(HUNDREDS, tmp);
        fill_char_in_line(display_serv,14,tmphigh,1);
    }
display_value(display_serv,15,tmp);

}

void show_theme_service(void)
{
unsigned char i;
 	for(i=0; i<=ITEM_SERVICE1; i++)
		{
    	 display_service(i);      
		}

if((menu_item == ITEM_VCO_COARSE || menu_item == ITEM_VCO_FINE))
			{
			write_video_ram_data(LL_SELECTION, 0x00);
			write_video_ram_data(PIF_FINE, (vco_fine * 2));
			write_video_ram_data(PIF_COARSE, vco_coarse);
			read_video_new();
			i = read_data[2] & 0x07;
            fill_string_in_line(menu_item,18,(unsigned char *)AFC_STATUS[i]);
			}

}


void show_service_menu(void)
{   
unsigned char i;
reset_current_screen();
for(i=0;i<=ITEM_SERVICE1;i++)
   {
   append_line_to_buffer(&block_service[i]);
   }
for(i=0;i<=ITEM_SERVICE1;i++)
   {
   fill_string_in_line(i,0x2,(unsigned char *)SERVICE_STRING[i]); 
   }
display_request_flags = display_request_flags & ~( STATUS_DISPLAY | PROGRAM_DISPLAY);

fill_char_in_line(menu_item,0,0xd0,1); 
show_theme_service();
set_current_screen();
osd_enabled();//FOR DISPLAY GLOBAL
}


void display_design(unsigned char display_des)
{
unsigned char tmp=0,tmphigh;
		switch(display_des)
		{
			case ITEM_AGC_GAIN:
			tmp = agc_gain;
			break;

			case ITEM_MISC1:
			tmp = misc1;
			break;  

			case ITEM_MISC2:
			tmp = misc2;
			break;  

			case ITEM_MISC3:
			tmp = misc3;
			break;

			case ITEM_HPOS_OSD:
			tmp = hpos_osd;
			break;  

			case ITEM_VPOS_OSD:
			tmp = vpos_osd;
			break;
		 }
if(display_des == ITEM_HPOS_OSD)
    {
        tmphigh = convert_to_ASCII(HUNDREDS, tmp);
        fill_char_in_line(display_des,14,tmphigh,1);
    }
display_value(display_des,15,tmp);
}

/*****************************/
void show_theme_design(void)
{
unsigned char i;
 for(i=0; i<=ITEM_DESIGN1; i++)
	{
     display_design(i);      
	}
}


/*****************************************************************************
INPUTS     : 
OUTPUTS    : 
DESCRIPTION:  Service related Display routine.
*****************************************************************************/
void show_design_menu(void)
{   
unsigned char i;
reset_current_screen();
for(i=0;i<=ITEM_DESIGN1;i++)
   {
   append_line_to_buffer(&block_service[i]);
   }
for(i=0;i<=ITEM_DESIGN1;i++)
   {
   fill_string_in_line(i,0x2,(unsigned char *)DESIGN_STRING[i]); 
   }
fill_char_in_line(menu_item,0,0xD0,1); 

show_theme_design();
set_current_screen();
osd_enabled();
}


void show_service(void)
{
    switch(menu_page)
        {
        case MENU_SERVICE :
            tv_flags = tv_flags & ~FORCE_NICAM_STD ;
            show_service_menu();
        break;

        case MENU_DESIGN :
            show_design_menu();
        break;
#ifdef ST9306
        case MENU_ST9306 :
            show_st9306_menu();
        break;
#endif
        }
}

void update_display_vco_stat(void)
{
if (display_request_flags & SERVICE_DISPLAY)
    if ((menu_page == MENU_SERVICE) && (menu_item == ITEM_VCO_COARSE || menu_item == ITEM_VCO_FINE ))
				show_theme_service();
}
/***********************************************************/

void update_auto_vco_adjust(void)
{
    unsigned char i,j;                                                        
	if((tuning_flags & AUTO_VCO_REQUEST) &&(menu_page==MENU_SERVICE))
	{
        display_request_flags = display_request_flags & ~(STATUS_DISPLAY|PROGRAM_DISPLAY);
        display_request_flags = display_request_flags | REFRESH_DISPLAY;
        if((menu_item == ITEM_VCO_COARSE)||(menu_item == ITEM_VCO_FINE))
            {
			read_video_new();
			i = read_data[2] & 0x07;
			switch (i)
			    {
				case 2:
				case 3:
					vco_coarse_high();
					break ;

				case 4:
				case 5:
					vco_fine_low();
					read_video_new();
					j = read_data[2] & 0x07;
					if (j ==0)
					{
					adjust_vco_fine_to_centre();
					tuning_flags = tuning_flags & ~AUTO_VCO_REQUEST;
					}
                    break ;
			    }
            }
    }
}

⌨️ 快捷键说明

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