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

📄 venb.c

📁 H.261图像压缩芯片控制软件
💻 C
📖 第 1 页 / 共 4 页
字号:
bit I_Clock( void )
{
	bit bdata sample;

	SCL=HIGH;
	Delay();
	sample=SDA;
	SCL=LOW;
	Delay();
	return (sample);
}


/*****************************************************************************
*  函数名称:void I_SendData(byte I_data)                                     *
*  简要描述:向IIC总线发送8位数据,并请求应答信号                              *
*  输    入:欲发送的数据                                                     *
*  输    出:                                                                 *
*  时    间:2000年1月                                                        *
*****************************************************************************/
bit I_SendData(byte I_data)
{
	register byte data i;

	for (i=0;i<8;i++)       //发送8位数据
	{
		SDA=(bit)(I_data&0x80);
		I_data=I_data<<1;
		I_Clock();
	}

	SDA=HIGH;
	return(~I_Clock());	//返回应答信号
}


/*****************************************************************************
*  函数名称:void SendToSaa7111(byte nAddress,byte nData)                     *
*  简要描述:向SAA7111内部寄存器写入8位数据                                   *
*  输    入:内部寄存器地址,数据                                             *
*  输    出:                                                                 *
*  时    间:2000年1月                                                        *
*****************************************************************************/
void SendToSaa7111(byte nAddress,byte nData)
{
	I_Start();
	while(!I_SendData(SAA7111_WRITE));
	while(!I_SendData(nAddress));
	while(!I_SendData(nData));
	I_Stop();
	return;
}


/*****************************************************************************
*  函数名称:void Delay(void)                                                 *
*  简要描述:提供IIC总线工作时序的延时                                        *
*                                                                            *
*  时    间:2000年1月                                                        *
*****************************************************************************/
void Delay(void)
{
	register byte data i;
	
	for(i=0;i<100;i++);
        return; 
}


/*****************************************************************************
*  函数名称:void ChangeVideoSource(byte nSource)                             *
*  简要描述:设置视频源                                                       *
*                                                                            *
*  时    间:2000年1月                                                        *
*****************************************************************************/
void ChangeVideoSource(byte nSource)
{
	WATCHD=!WATCHD;

	m_nCurrentVideo=nSource;
	
	P1=0xff;
        InitAdg406(nSource);	
	InitLed(nSource);

        return;
}


/*****************************************************************************
*  函数名称:void ChangeVideoP(byte nSource)                                   *
*  简要描述:设置视频源                                                       *
*                                                                            *
*  时    间:2000年1月                                                        *
*****************************************************************************/
void ChangeVideoParameter(byte nParameter)
{
	WATCHD=!WATCHD;

	switch(nParameter)
	{
		case BRIGHT:
		       	SendToSaa7111(0xa,m_nBright); 	    //地址0A,Luminance brightness
			break;
		case CONTRAST:
		       	SendToSaa7111(0xb,m_nContrast);	    //地址0B,Luminance contrast
			break;
		case SATURATION:
		       	SendToSaa7111(0xc,m_nSaturation);   //地址0C,Chroma saturation
			break;
		case HUE:
		       	SendToSaa7111(0xd,m_nHue);	    //地址0D,Chroma hue control
			break;
		default:
			break;
	}

        return;
}


/*****************************************************************************
*  函数名称:void Serial(void)                                                *
*  简要描述:串行口中断服务函数,使用第一组寄存器                              *
*                                                                            *
*  时    间:2000年1月                                                        *
*****************************************************************************/
void Serial(void) interrupt 4 using 2                  
{
        byte data temp;

	WATCHD=!WATCHD;

 	if(RI)
 	{
                RI=0x00;
                temp=SBUF;
               	
               	if(temp==SOI)   //接收到帧头,置标志位
               	{
                        m_bBeginFlag=TRUE;
                        m_nReceiveCount=0;	
                        return;
                }
                if((temp==EOI)&&(m_bBeginFlag==TRUE))
                {       
	                if(m_nReceiveCount==8)   //该帧有效,置标志位
	                {
	         	        m_bEndFlag=TRUE;              //请求处理
                                m_bSwitchFlag=!m_bSwitchFlag; //切换缓冲区 
                                return;
                        }
                        else	//该帧无效
	                {
	                	m_bBeginFlag=FALSE;
	                	return;
	                }
                }
		
		if(m_bBeginFlag==TRUE) 
	        {
                        if(m_nReceiveCount<8)   //接收到数据,写入缓冲区暂存  
                        {
                                m_nReceiveCount++;
                                if(m_bSwitchFlag==0)   //使用接收缓冲区1   
                                {
                                        m_nReceiveBuffer1[m_nReceiveCount]=temp;
		                }
		                else    //使用接收缓冲区2   
                                {
                                        m_nReceiveBuffer2[m_nReceiveCount]=temp;
		                }
		        }
                        else    //有SOI但8byte后无EOI,抛弃该帧
                        {
                                m_bBeginFlag==FALSE; 	
                        }
	        }
	}  

        return;
}


/*****************************************************************************
*  函数名称:void SendToSP(void)                                              *
*  简要描述:从串口将发送缓冲区中的数据发送出去                               *
*                                                                            *
*  时    间:2000年1月                                                        *
*****************************************************************************/
void SendToSP(void)
{
	WATCHD=!WATCHD;

	for(m_nSendCount=0;m_nSendCount<10;m_nSendCount++)
	{
       	        SBUF=m_nSendBuffer[m_nSendCount];	//发送			
		for(;TI==0;);	//等待发送结束
		TI=0;		//清标志
	}

	return;
}


/*****************************************************************************
*  函数名称:void ScanChannel(void)                                           *
*  简要描述:视频扫描设置                                                     *
*                                                                            *
*  时    间:2000年1月                                                        *
*****************************************************************************/
void ScanChannel(void)
{
        //定义临时变量
        long data temp1;
	byte data i;
	long data mask;

	WATCHD=!WATCHD;
	
	switch(m_nScanPeriod)
	{
		case 1:
			temp1=200;	//1秒
			break;
		case 2:
			temp1=1000;	//5秒
			break;
		case 3:
			temp1=2000;	//10秒
			break;
		case 4:
			temp1=6000;	//30秒
			break;
		default:
			return;		//不扫描	
	}
	
	if(m_nScanCount<temp1)
	{
		m_nScanCount++;
	}
	else
	{
		m_nScanCount=0;	
		
		if(m_nScanChannel!=0){
			do{
				m_nCurrentVideo++;
				if(m_nCurrentVideo>12) m_nCurrentVideo=1;
				//将扫描掩码中标志目前视频源的标志位右移到第一位,以利于判断
				mask=m_nScanChannel;
				for(i=1;i<m_nCurrentVideo;i++) mask=mask>>1;       
			}while((mask&0x01)==0);	//如果该标志位为0,则视频源跳到下一路,否则切换到该路
			ChangeVideoSource(m_nCurrentVideo);
		}

	}
	
	return;
}


/*****************************************************************************
*  函数名称:void CheckStatus(void)                                           *
*  简要描述:单板状态检测                                                     *
*                                                                            *
*  时    间:2000年1月                                                        *
*****************************************************************************/
void CheckStatus(void)
{
        //定义临时变量
        byte data temp1;
       
	WATCHD=!WATCHD;

	//按钮状态检测(按钮"按下"一段时间后"释放,视为有效按钮)
	P0=0xff;

	RATE_CS=0;		//按钮译码线,低电平有效
	BUTTON_CS=0;
		
	RD=1;
	RD=0;
	temp1=P0;      		//从P0口读得按钮当前状态,低四位有效
       	RD=1;
        	
       	RATE_CS=1;	        //按钮译码线,高电平无效
        BUTTON_CS=1;
        	
       	temp1=temp1&0x0f;       //低4位有效

       	//解析按钮状态
       	if(temp1==m_nButtonDown)	//按钮保持原状态,计数
       	{
		if(m_nButtonDown!=0x0f)		//有按钮按下
		{
			m_nButtonCount++;	//计数
			if(m_nButtonCount==0xff)//防止上溢
			{
				m_nButtonCount=10;
			}
		}
	}
       	else	//按钮状态改变
       	{
		if(temp1==0x0f)	//全部按钮已释放
		{
			if(m_nButtonCount>10)	//按钮有效
			{
				m_bButtonFlag=TRUE;	
			}
			else			//按钮无效
			{
				m_nButtonDown=0x0f;	//更新当前按钮状态
			}
		}
		else		//仍有部分按钮被按下		
		{
			m_nButtonDown=temp1;	//更新当前按钮状态
		}
		m_nButtonCount=0;	//重新启动计数
	}
	
	
	//处理有效按钮
        if(m_bButtonFlag==TRUE)	//有效按钮
        {
               	switch(m_nButtonDown)
               	{
               		case 0x0e:
               			//按下的是视频1按钮
				if(m_nCurrentVideo!=1)
				{
               				m_bChangeVideo=TRUE;
               				ChangeVideoSource(0x01);
               				
				}
               			break;
               		case 0x0d:
               			//视频递增按钮
				if(m_nCurrentVideo<=0x0b)
				{
               				m_bChangeVideo=TRUE;
               				m_nCurrentVideo=m_nCurrentVideo+1;
               				ChangeVideoSource(m_nCurrentVideo);
               			}
 				else
 				{
 					m_nCurrentVideo=0x0c;
  				}
               			break;
               		case 0x0b:
               			//视频递减按钮
				if(m_nCurrentVideo>=0x02)
				{
               				m_bChangeVideo=TRUE;
               				m_nCurrentVideo=m_nCurrentVideo-1;
               				ChangeVideoSource(m_nCurrentVideo);
               			}
 				else
 				{
 					m_nCurrentVideo=0x01;
 					
 				}
 				
				break;
               		case 0x07:
               			//按下的是视频12按钮
				if(m_nCurrentVideo!=0x0c)
				{
               				m_bChangeVideo=TRUE;
               				ChangeVideoSource(0x0c);
               				
				}
               			break;
               		default:
               			//其他情况保持当前状况不变
               			break;
	      	}

		if(m_bChangeVideo==TRUE)	//通知VTB
		{
			m_bChangeVideo=FALSE;
			m_nSendBuffer[2]=VTBE;			//DestDevice
			m_nSendBuffer[4]=0x0c;			//CmdType/Rtn
			m_nSendBuffer[5]=0x00;			//Para1
			m_nSendBuffer[6]=m_nCurrentVideo;
               		SendToSP();				//发送
		}
		
		//处理完成后初始化按钮状态
		m_nButtonDown=0x0f;
		m_bButtonFlag=FALSE;
        
        }
		
	return;
}


/*****************************************************************************

⌨️ 快捷键说明

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