📄 main.c
字号:
{
case 0: memcpy(g_nParameters,g_nParaCruise,NUMOFPARAMETERS);break;
case 1: memcpy(g_nParameters,g_nParaHSI,NUMOFPARAMETERS);break;
case 2: memcpy(g_nParameters,g_nParaAPR,NUMOFPARAMETERS);break;
case 3: memcpy(g_nParameters,g_nParaFAN,NUMOFPARAMETERS);break;
default: break;
}
temp=(temp>>8)&0xf;
if(temp>=0&&temp<5&&temp!=g_nCurrentChannel)
SoftReset(temp);
return;
}
/*****************************************************************
** 函数名:ClearOutputBuffer
** 输 入: 无
** 输 出: 无
** 功能描述:将输出缓冲区清空,即擦除屏幕上叠加上的字符
** 作 者:
** 日 期:2003.01.22
** 修改人:
** 日 期:2003.05.25
** 版 本:
****************************************************************/
void ClearOutputBuffer(void)
{
g_nNumOfResult=g_nNumOfToBeRotated=g_nNumOfRotatedResult=g_nNumOfHorizontalLine=0;
return;
}
/*****************************************************************
** 函数名:Show
** 输 入: 无
** 输 出: 无
** 功能描述:将生成好的图形写入片外帧缓存
** 作 者:
** 日 期:2003.01.22
** 修改人:
** 日 期:2003.05.25
** 版 本:
****************************************************************/
void Show(void)
{
asm_showhorizontalline();
asm_showresult();
asm_showrotatedresult();
return;
}
/*****************************************************************
** 函数名:IRQ0interrupt
** 输 入: 无
** 输 出: 无
** 功能描述:IRQ0的中断服务子程序,配置DMA11用于FIFO到SRAM的数据输入
** 作 者:
** 日 期:2003.06.25
** 修改人:
** 日 期:2003.06.25
** 版 本:
****************************************************************/
void IRQ0interrupt(int useless)
{
int* pCurrentBufferIn;
asm("#include <def21160.h>");
//关闭双核
asm("BIT CLR MODE1 PEYEN;\
USTAT1=ASTAT; ");
asm("r0=0x4000;\
DM(DMAC11)=r0;");
if(g_bWithoutBG)
{//如果没有背景
//计算当前行在片外输入帧存中的地址
g_pInLineAddress=g_pCurrentBufferIn+g_nCurrentLineIn*WIDTHIN;
asm("r0=dm(_g_pInLineAddress);\
dm(EI11)=r0;\
r0=_g_xBackGroundColor;\
dm(II11)=r0;\
r0=0;\
dm(IM11)=r0;\
R1=2;\
dm(EM11)=r1;\
r0=360;\
dm(C11)=r0;\
dm(EC11)=r0;\
r0=0x405;\
dm(DMAC11)=r0;\
ASTAT=USTAT1;");
}
else
{//如果需要叠加上前级输入的背景
g_pInLineAddress=g_pCurrentBufferIn+g_nCurrentLineIn*WIDTHIN-(WIDTHIN*OFFSETY+OFFSETX);
asm("r0=dm(_g_pInLineAddress);\
R1=2;\
dm(EI11)=r0;\
dm(EM11)=r1;\
r0=360;\
dm(EC11)=r0;\
r0=0xa801;\
dm(DMAC11)=r0;\
BIT SET FLAGS FLG0;\
ASTAT=USTAT1;");
}
//当前行计数器加2,(因为是隔行输入)
if((g_nCurrentLineIn+=2)>HEIGHTIN) g_nCurrentLineIn=1;
//如果到了一帧的结尾,片外的三个帧缓存相互切换。原本输入的变为叠加的,
//原本叠加的变为输出的,输出的变为输入的。g_bBeginCompute=1通知主程序开始计算新的一帧
else if(g_nCurrentLineIn==HEIGHTIN)
{
if((g_nBlinkCounter-=1)<g_nBlinkVanishTime)g_nBlinkCounter=g_nBlinkExistTime;
g_nCurrentLineIn=0;g_bBeginCompute=1;
pCurrentBufferIn=g_pCurrentBufferIn;
g_pCurrentBufferIn=g_pCurrentBufferOut;
g_pCurrentBufferOut=g_pCurrentBufferOutput;
g_pCurrentBufferOutput=pCurrentBufferIn;
g_nCurrentLineOut=0;
}
return;
}
/*****************************************************************
** 函数名:EP1interrupt
** 输 入: 无
** 输 出: 无
** 功能描述:DMA11的中断服务子程序,配置DMA12用于SRAM到FIFO的数据输出
** 作 者:
** 日 期:2003.06.25
** 修改人:
** 日 期:2003.06.25
** 版 本:
****************************************************************/
void EP1interrupt(int useless)
{
asm("#include <def21160.h>");
asm("BIT CLR MODE1 PEYEN;\
USTAT1=ASTAT; ");
//拉低FLAG0,通知CPLD停止发出DMA所需的控制信号
asm("BIT CLR FLAGS FLG0;");
asm("r0=0x4000;\
DM(DMAC12)=r0;");
asm("r0=dm(_g_pOutLineAddress);\
R1=2;\
dm(EI12)=r0;\
dm(EM12)=r1;\
r0=360;\
dm(EC12)=r0;\
r0=0xa805;\
dm(DMAC12)=r0;\
BIT SET FLAGS FLG1;\
ASTAT=USTAT1;");
//当前行在片外输出帧存中的地址向后移一行
g_pOutLineAddress+=WIDTHIN;
//如果到了输出帧存的末尾,则移到输出帧存的开始再输出一遍。
if(++g_nCurrentLineOut>=HEIGHTOUT)
{
g_nCurrentLineOut=0;g_pOutLineAddress=g_pCurrentBufferOut;
}
return;
}
/*****************************************************************
** 函数名:EP2interrupt
** 输 入: 无
** 输 出: 无
** 功能描述:DMA12的中断服务子程序,清除FLAG1标记以结束DMA
** 作 者:
** 日 期:2003.06.25
** 修改人:
** 日 期:2003.06.25
** 版 本:
****************************************************************/
void EP2interrupt(int useless)
{
asm("#include <def21160.h>");
//拉低FLG1通知CPLD向后级的一行数据传送完毕
asm("bit clr FLAGS FLG1;");
return;
}
/*****************************************************************
** 函数名:IRQ2interrupt
** 输 入: 无
** 输 出: 无
** 功能描述:IRQ2的中断服务子程序,每帧产生一次。在正常情况下每次中断时的
g_nCurrentLineIn应相同,如果中断时的g_nCurrentLineIn
有变化,说明有异常情况发生,如视频信号中断或中断后重新接通
,此时将g_bChangeChannel置为1,主程序检测到g_bChangeChannel
为1后会调用SoftReset()重新初始化。
** 全局变量:g_bChangeChannel
** 作 者:
** 日 期:2003.06.25
** 修改人:
** 日 期:2003.06.25
** 版 本:
****************************************************************/
void IRQ2interrupt(int useless)
{
static int nLineInOfFirstTime;
if(g_bChangeChannel)
{
//记录下第一次中断时的g_nCurrentLineIn
nLineInOfFirstTime=g_nCurrentLineIn;
g_bChangeChannel=false;
}
else
{
//如果g_nCurrentLineIn与第一次中断时的不同,将g_bChangeChannel置为1,主程序检测到后会重新初始化
if(nLineInOfFirstTime!=g_nCurrentLineIn)
{
g_bChangeChannel=true;
}
}
return;
}
/*****************************************************************
** 函数名:LP0interrupt
** 输 入: 无
** 输 出: 无
** 功能描述:链路口0的中断服务子程序,配置链路口0以读入下一次的参数
** 作 者:
** 日 期:2003.06.25
** 修改人:
** 日 期:2003.06.25
** 版 本:
****************************************************************/
void LP0interrupt(int useless)
{
asm( "#include <def21160.h>");
asm( "#include <hddamacros.h>");
asm( "BIT CLR MODE1 PEYEN;\
USTAT1=ASTAT; ");
asm(" R0=0X2C688;\
DM(LAR)=R0;\
R0=0;\
dm(LCTL0)=R0; ");
if(!g_bChangeChannel)
g_bCurrentParaBuf=!g_bCurrentParaBuf;
if(g_bCurrentParaBuf)
{
asm("r0=_g_nParaBuf1;");
}
else
{
asm("R0=_g_nParaBuf0;");
}
asm(" DM(II4)=R0;\
R0=1;\
DM(IM4)=R0;\
R0=1;\
DM(C4)=R0;\
R0=0X203;\
DM(LCTL0)=R0;");
asm(" ASTAT=USTAT1;");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -