vfd_drv_nec16312.c

来自「OSD显示,单片机实现,ICCAVR! 代码风格严谨,为高人所写.我仅为了上传换」· C语言 代码 · 共 1,064 行 · 第 1/2 页

C
1,064
字号
/*
history:
2004-7-19 14:43
         wanghaoying move the following functions for nec16312 here
2004-7-7 14:25  
        lijd
        Process 16312sw use for:
        1. extern pannel key
        2. volume button 
        note: need define NEC16312SW in cust_def.h
*/

/*
** FUNCTION
** reset_vfd
**
** DESCRIPTION
** setup VFD.  Should only called at power-up or emergency.
*/
#ifdef HK_ORITRON_PANNEL//lijd 2005-5-26 14:01
void SendDataToSM1623LED(void)
{	
	int i;
	for(i=0;i<VFD_DISPLAY_SIZE;i+=4)        
		{
		    regs0->iop_data[VFD_CMD] = (0xc0 | i);   // transfer  address   
		    if((VFD_DISPLAY_SIZE-i)<=4)//modefied by wangfeng,2003-11-24 10:41
		       {
		        	regs0->iop_data[VFD_DAT0] = vfd_mem[i + 1] << 8 | vfd_mem[i];
		        	regs0->iop_data[0] = (regs0->iop_data[0] & VFD_DATLEN_MASK) |
		        		                     (FUN_VFD_WRITE | VFD_DAT_LEN2);
		       }
		     else
		       {
		        	regs0->iop_data[VFD_DAT0] = vfd_mem[i + 1] << 8 | vfd_mem[i];
		        	regs0->iop_data[VFD_DAT1] = vfd_mem[i + 3] << 8 | vfd_mem[i + 2];
		        	regs0->iop_data[0] = (regs0->iop_data[0] & VFD_DATLEN_MASK) |
		        		                     (FUN_VFD_WRITE | VFD_DAT_LEN4);
		       }		
		            WaitIopFunRdy(IOP_RDY_WAIT);
		}		      
}
#endif//#ifdef ORITRON_PANNEL//lijd 2005-5-26 14:01
void reset_vfd(void)
{

	UINT16 nIndex = 0;

	
	#ifdef HK_ORITRON_PANNEL//lijd 2005-5-26 14:01
     int i;
	 for(i = 0; i < 14; i++)				
		vfd_mem[i] = 0x00;	
				
	    SendDataToSM1623LED();	
	#else
	init_vfd_clear();
	#endif	

	/* display mode ? 13d15s or 6d16s add by chichang 2001/6/6 */
	
	
#ifndef TEST_VFD								//shawn modify at 910131
	regs0->iop_data[VFD_CMD] = VFDC_SET_DISP | VFD_DISPLAY_MODE;	//2001/10/23
#else
	regs0->iop_data[VFD_CMD] = VFDC_SET_DISP | COMMAND_MODE;	//2002/01/31
#endif

	regs0->iop_data[0] = (regs0->iop_data[0] & VFD_DATLEN_MASK) |
		(FUN_VFD_WRITE | VFD_DAT_LEN0);
	
	//erase_vfd_mem();
	
	WaitIopFunRdy(IOP_RDY_WAIT);
	
#ifdef USE_VFD_LED_POWER
    #if defined(USE_VFD_LED_POWER_LOW)&&!defined(VFD_SHOW_LOAD_TOGGLE)
	write_vfd_led(0x0f);
    #elif defined(PROVIEW_DV_509)	
	write_vfd_led(4);
    #else
    write_vfd_led(0);
    #endif
#endif

#ifdef TONIC_DVD//20040206
	write_vfd_led(0);
#endif//TONIC_DVD

	vfd_set_idle_state(nIndex);
	WaitIopFunRdy(IOP_RDY_WAIT);
#ifdef SHOW_HELLO_ON_VFD_WHEN_POWERON//zxb 2005-5-8 13:52
	vfd_set_str(0, "HELLO");	
#endif
#ifdef HK_ORITRON_PANNEL//lijd 2005-5-26 14:01     
		vfd_set_str(0, "ON");	
#endif	 
}

//
//    LED: 
//
//    MSB   LSB
//    ---- 0000  turn on all led
//    ---- 1111  turn off all led
//
void write_vfd_led(UINT8 led_id)
{
	regs0->iop_data[VFD_CMD] = 0x41;
	regs0->iop_data[VFD_DAT0] = 0xff00 | led_id;
	regs0->iop_data[0] = (regs0->iop_data[0] & VFD_DATLEN_MASK) | (FUN_VFD_WRITE | VFD_DAT_LEN1);
	WaitIopFunRdy(IOP_RDY_WAIT);
}


#ifdef NEC16312SW
#define USE_16312SW_EXTEND_KEY
//#define USE_16312SW_VOLUME_BUTTON


#ifdef  USE_16312SW_EXTEND_KEY
#define SW_KEY1     31
#define SW_KEY2     35
#endif

#ifdef USE_16312SW_VOLUME_BUTTON
    #define VFD_SW_SPEED 3
#endif

void polling_vfdsw(void)
{
#ifdef  USE_16312SW_EXTEND_KEY   
    BYTE key_datasw;
#ifdef THAKRAL_USE_SW_KEY
	static BYTE flag=0;
	static BYTE pre_key_datasw;
   	key_datasw= (BYTE)regs0->iop_data[7];

//    psprintf(RegionValStr[REGION1], "KEY %02x ", key_datasw);
//    PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
    
    #ifdef VFD_KEY_TEST
    if(key_datasw != 0xF0)
    {
        key_datasw>>=4;
        key_datasw+=24;

        {
			  printf("data=%d\n",key_datasw);
			  psprintf(RegionValStr[REGION1], "KEY %02d F:%d", key_datasw,
				  vfd_keycode[key_datasw - 1]);
			  PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
        }
        regs0->iop_data[7] = 0xF0;            
     } 
    #endif
    
    if(key_datasw != 0xf0)
    {
        pre_key_datasw = key_datasw;
        flag = 1;
    }
    
    if((key_datasw==0xf0)&&(flag==1))
    {
        flag = 0;


        //pre_key_datasw>>=4;
        //pre_key_datasw+=24;

        save_srn_start_t = get_rtc_val();
        
        #if defined(SW1_POWER)
        if(pre_key_datasw==0x70)
            call_ir_func(IRC_POWER);
        else if(pre_key_datasw==0xb0)
            call_ir_func(IRC_EJECT);
        #elif defined(SW4_POWER)
        if(pre_key_datasw==0x70)
            call_ir_func(IRC_ONLY_PAUSE);
        else if(pre_key_datasw==0xb0)
            call_ir_func(IRC_PLAY_RESUME);
        else if(pre_key_datasw==0xd0)
            call_ir_func(IRC_STOP);
        else if(pre_key_datasw==0xe0)
            call_ir_func(IRC_POWER);
        #else
        call_ir_func(vfd_keycode[key_datasw-1]);
        #endif 
//        pre_key_datasw = key_datasw;

    }
    
//	if((key_datasw&0x80)==0)
//    { 
//		flag=1;
//	}
//	if(((key_datasw&0x80)==0x80)&&(flag==1))
//	{
//		flag=0;
//		//call_ir_func(vfd_keycode[key_datasw - 1]);
//		call_ir_func(IRC_POWER);
//	}
#else
    key_datasw= (BYTE)regs0->iop_data[7];
    
    if(key_datasw != 0xF0)
    {
        key_datasw>>=4;
        key_datasw+=24;

	#ifdef FUSS_SW
        if( (key_datasw == SW_KEY1) || (key_datasw == SW_KEY2) )
    #endif
        {
    #ifdef VFD_KEY_TEST
			  printf("data=%d\n",key_datasw);
			  psprintf(RegionValStr[REGION1], "KEY %02d F:%d", key_datasw,
				  vfd_keycode[key_datasw - 1]);
			  PrintOsdMsg(STR_OS_SPACE, REGION1, 1, 1);
    #else
			  save_srn_start_t = get_rtc_val();
			  call_ir_func(vfd_keycode[key_datasw - 1]);
    #endif
        }
        regs0->iop_data[7] = 0xF0;            
     } 
#endif    //#ifdef THAKRAL_USE_SW_KEY
#endif    //#ifdef  USE_16312SW_EXTEND_KEY   

#ifdef USE_16312SW_VOLUME_BUTTON
    BYTE key_datasw;
    static BYTE prev = 0;
    BYTE updown = 0;
    static BYTE up_cnt = 0;
    static BYTE down_cnt = 0;
    
    key_datasw= (BYTE)regs0->iop_data[7];  
    
    if(prev != key_datasw)
    {
    
        switch(prev)
        {
        case 0x00:
            if (key_datasw == 0x80)
                updown = 2;    
            else if(key_datasw == 0x40)
                updown = 1;    
            break;
    
        case 0x80:
            if(key_datasw == 0xc0)
                updown = 2;
            else if (key_datasw == 0x00)
                updown = 1;    
            break;
        
        case 0xc0:
            if(key_datasw == 0x40)
                updown = 2;
            else if (key_datasw == 0x80)
                updown = 1;    
            break;
        
        case 0x40: 
            if(key_datasw == 0x00)
                updown = 2;
            else if (key_datasw == 0xc0)
                updown = 1;    
            break;   
       
       default:
            updown = 0;
            break;     
        }
        
        if(updown == 1)
        {
            down_cnt++;
            up_cnt = 0;     
            if(down_cnt >VFD_SW_SPEED )
            {
                down_cnt = 0;               
                ircmd_volume_up();   
            }
        }
        
        if(updown == 2)
        {
            up_cnt++;
            down_cnt = 0;    
            if(up_cnt >VFD_SW_SPEED )
            {
                up_cnt = 0;               
                ircmd_volume_down(); 
            }
    
        }
        prev = key_datasw;  
    }
#endif      //#ifdef USE_16312SW_VOLUME_BUTTON
}
#endif      //#ifdef NEC16312SW

/*
** FUNCTION
** polling_vfdr
**
** DESCRIPTION
** check if polling-ready
*/

#ifdef QISHENG_DVD
int standby_cnt=0;
#endif 

#ifdef AUTO_INTO_STANDBY    //oujx for tonic dvd//20040206
int auto_standby_timer=0;
#endif

#ifdef SUPPORT_GPIO_P_SCAN
BYTE PscanPortStatus=0;
BYTE PscanStatus=0;
BYTE PscanCount=0;
#endif

#if defined(TWO_FUN_IN_ONE_VFD_KEY) || defined(TWO_FUNC_IN_LEFT_RIGHT_KEY)//xyy add for Oritron 2004-11-10 
BYTE num_add_flag = 0;
BYTE command_flag = 1;
#endif

#ifdef PUSH_TRAY_IN   //LYC 05/04/13 
  #define TRAY_IS_OUT_NUM  18  //because   #define TRAY_IS_OUT_GPIO	18
  BYTE tray_in_flag=0;
#endif

void polling_vfdr(void)  //nec16321 type vfd
{
    
#ifdef SUPPORT_SPI_QSI
  //not use
#endif


#ifndef  SUPPORT_SPI_QSI

  
    
#ifdef SUPPORT_VFD

	UINT8   i;
	UINT32  temp;
	UINT32  key_data;
	static UINT8 count = 0;
	static UINT32 key_previ = 0;
	
	static BYTE bWriteState=0;
	
#ifdef TWO_FUN_IN_ONE_VFD_KEY
	static UINT32 key_previ_temp = 0;
	static UINT16 key_press_time_count = 0;
#endif //TWO_FUN_IN_ONE_VFD_KEY
	
#ifdef TWO_FUNC_IN_LEFT_RIGHT_KEY//xyy add for Oritron 2004-11-10
	static UINT32 uPrevKey = 0;
	static UINT16 uTimeCount = 0;
#endif	
	
	
    #ifdef KENLOON_PANEL3
	write_vfd_led(0xe);
	#endif
	
	#if defined(SUPPORT_VFD_SHOW_P_SCAN)&&defined(TONIC_DVD)//20040206
	if(vfd_intr_timer)
	    vfd_intr_timer--;	
	#endif
	
	UINT32 *VfdReadData;

	#ifdef GET_5BYTES_KEY_DATA//lijd 2005-5-30 13:54
	UINT32 *VfdReadData1;
	UINT32  key_data_5byte;
	static UINT32 key_previ_5byte = 0;
	#endif

#ifdef  SUPPORT_SPI
    return;
#endif

    #ifdef SUPPORT_GPIO_P_SCAN    //oujx for tonic only
    if(full_scrn==0&&(system_state==SYSTEM_READ_TITLE||system_state==SYSTEM_SETUP_BROWSER||system_state==SYSTEM_BROWSE||system_state==SYSTEM_OPEN||play_state==VCD_STATE_STOP||system_state==SYSTEM_NODISC))	
    {
    	if(PscanStatus==0)
    	{
    	
    		if(GPIO_I_GET(36)==0)
    		    PscanPortStatus=0;
    		else
    		    PscanPortStatus=1;
    		    
    		PscanCount=0;
    		PscanStatus=1;
    	}
    	else
    	if(PscanStatus==1)
    	{
    		PscanCount++;
    		if(PscanCount>50)
    		{
    			if(GPIO_I_GET(36)==PscanPortStatus)
    			{
    				if(PscanPortStatus==0)
    		            ircmd_p_scan_only();
    		        else
    		            ircmd_yuv_only();
    		
    	        }
    			PscanStatus=0;
    		}
    	}
    }		
	#endif//#ifdef SUPPORT_GPIO_P_SCAN    //oujx for tonic only
	
	if(regs0->iop_data[0] & FUN_MASK)
		return;
       
#ifdef PUSH_TRAY_IN   //LYC 05/04/13 
    if(GPIO_I_GET(TRAY_IS_OUT_NUM)==0)
       tray_in_flag=1;
    if((tray_in_flag)&&(GPIO_I_GET(TRAY_IS_OUT_NUM)))
      {
      	play_state = VCD_STATE_CLOSE;
      	tray_in_flag=0;
      	update_vfd_data();
     }	
#endif     

	if(vfd_state == VFD_READ)
	{
#ifndef USE_C_IOP//2004-2-12 12:08 lijd
		//update_vfd_data();//nono 2003-7-24 0:41 mark

		#ifdef  SUPPORT_RECEIVER  //huziqin 2004-4-27
		VfdReadData = ((UINT32 *) (SDRAM_BASE_UNCACHED + regs0->iopya * 1024 + 0x588));
		#elif defined( SPHE8202)
		VfdReadData = ((UINT32 *) (SDRAM_BASE_UNCACHED + regs0->iopya * 1024 + 0x588));//for 8202 2004-3-31 16:47 lijd	
		#elif defined(TWINHAN_8222_PANNEL)  //haoy 2005/03/31 16:17 for twinhan led
		VfdReadData =((UINT32 *) (SDRAM_BASE_UNCACHED + regs0->iopya * 1024 + 0x5E8));
		#elif defined(XINGQIU_RECEIVER_PANNEL)
		VfdReadData = ((UINT32 *) (SDRAM_BASE_UNCACHED + regs0->iopya * 1024 + 0x588));
		#else
		VfdReadData = ((UINT32 *) (SDRAM_BASE_UNCACHED + regs0->iopya * 1024 + 0x5b8));		//gerry,2004-3-24 12:53		
		#endif
		
		#ifdef GET_5BYTES_KEY_DATA
		VfdReadData1 = ((UINT32 *) (SDRAM_BASE_UNCACHED + regs0->iopya * 1024 + 0x5bc));		//gerry,2004-3-24 12:53	
		#endif
		
		//current is read 3 byte on io
        #ifdef GET_5BYTES_KEY_DATA
        key_data_5byte= *VfdReadData1 & 0x000000ff;    
        key_data = *VfdReadData & 0xffffffff;      
        #else
		key_data = *VfdReadData & 0x00ffffff;
        #endif
		*VfdReadData = 0; // Robert 030313
#else//USE_C_IOP
		key_data =(regs0->iop_data[3]);
#endif//USE_C_IOP

        #ifdef GET_5BYTES_KEY_DATA
        if((key_data == 0xffffff)||(key_data_5byte == 0xff))
			return;
        #endif
		if(key_data == 0xffffff)
			return;

        #ifdef USE_VFD_LED_TO_KEY_SOUND_INDICATE		//gerry for PANDA6950,3-8-23 17:17
		write_vfd_led(0xf);
        #elif defined(USE_VFD_LED_TO_KEY_SOUND_INDICATE_HI_ON)		//NONO 2003-10-15 16:14
		write_vfd_led(0x0);
        #endif

#ifdef TWO_FUN_IN_ONE_VFD_KEY
		if((vfd_keycode[keycode_to_num(key_data)-1]==IRC_NEXT)||(vfd_keycode[keycode_to_num(key_data)-1]==IRC_PREV))
		{
			key_press_time_count++;
		    printf("key_press_time_count= %d \n",key_press_time_count);   
		}
		    
		if(key_press_time_count>=15)
		{
			if(vfd_keycode[keycode_to_num(key_data)-1]==IRC_NEXT)
			{
				call_ir_func(IRC_VFD_NEXT);
			    key_press_time_count=0;
			    num_add_flag = 1;
			}
			else if(vfd_keycode[keycode_to_num(key_data)-1]==IRC_PREV)
			{
				call_ir_func(IRC_VFD_PREV);
			    key_press_time_count=0;
			    num_add_flag = 1;
			}
		}
		
#endif //TWO_FUN_IN_ONE_VFD_KEY 

#ifdef TWO_FUNC_IN_LEFT_RIGHT_KEY//xyy add for Oritron 2004-11-10
		if((vfd_keycode[keycode_to_num(key_data)-1]==IRC_LEFT)||(vfd_keycode[keycode_to_num(key_data)-1]==IRC_RIGHT))
		{
			uTimeCount++;
		    printf("uTimeCount= %d \n",uTimeCount);   
		}
		    
		if(uTimeCount>=20)
		{
			if(vfd_keycode[keycode_to_num(key_data)-1]==IRC_LEFT)
			{
				call_ir_func(IRC_VFD_LEFT);
			    uTimeCount=0;
			    num_add_flag = 1;
			}
			else if(vfd_keycode[keycode_to_num(key_data)-1]==IRC_RIGHT)
			{
				call_ir_func(IRC_VFD_RIGHT);
			    uTimeCount=0;
			    num_add_flag = 1;
			}

⌨️ 快捷键说明

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