📄 venb.c
字号:
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 + -