📄 a.c
字号:
g_VideoFlag = VIDEO_ON;
g_VideoStartLine = VIDEO_START_LINE;
g_SCI0SendVideoImageEnable = OFF;
INTCR_IRQEN = ON;
}
/*********************************************************************
Function Name:SystemStart
Description: Start Sysmtem
Inputs: None
Outputs: None
NOTES:
*********************************************************************/
void SystemStart(void)
{
g_BasicSpeed = 35;
g_HighestSpeed = 60;
EnableInterrupts;
for(;;)
{
}
}
/*********************************************************************
Function Name:IRQ_ISR
Description: IRQ interrupt service function,read CMOS camera
Inputs: None
Outputs: None
NOTES:
*********************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Interrupt section for this module. Placement will be in NON_BANKED area. */
__interrupt void IRQ_ISR(void)
{
INT8U j = 0;
INT8U i = 0;
INT16S l_pulse = 0;
INT16U l_tempPWMDTY45 = 0;
g_BottomValidLine = MAX_VIDEO_LINE - 1;
if(VIDEO_STOP != g_VideoFlag)
{
if(ODD_EVEN_STATUS != g_OddEvenFlag)
{
MovementAdjust = ON;
g_OddEvenFlag = ODD_EVEN_STATUS;
g_VideoFlag = VIDEO_WAIT;
g_VideoLine = 0;
g_VideoImageLine = 0;
}
if(VIDEO_WAIT == g_VideoFlag)
{
g_VideoLine ++;
if(g_VideoLine >= VIDEO_START_LINE)
{
g_VideoLine = 0;
g_VideoImageLine = 0;
g_VideoFlag = VIDEO_SAMPLE;
}
}
else if(VIDEO_SAMPLE == g_VideoFlag)
{
g_VideoLine ++;
if(7 == (g_VideoLine & 0x07))
{
if(g_VideoImageLine >= MAX_VIDEO_LINE)
{
g_VideoFlag = VIDEO_FINISH;
}
else
{
//SAMPLE HERE
for(i = 0;i < MAX_VIDEO_POINT + VIDEO_START_POINT; i ++)
{
g_VideoLineDate[i] = (VIDEO_PORT)
}
}
}
else if(4 == (g_VideoLine & 0x07))
{
if((g_VideoImageLine < MAX_VIDEO_LINE) && (g_VideoLine > 7))
{
for(i = 0; i < MAX_VIDEO_POINT; i ++)
{
g_VideoImageDate[g_VideoImageLine][i] = g_VideoLineDate[i + VIDEO_START_POINT];
}
g_VideoImageLine ++;
if(g_VideoImageLine >= MAX_VIDEO_LINE)
{
g_VideoFlag = VIDEO_FINISH;
}
}
}
}
else if( VIDEO_FINISH == g_VideoFlag)
{
//=====================提取黑线中心位置=========================
//初始化数组
for(n = 0; n < MAX_VIDEO_LINE; n ++)
{
g_BlackPositionCenter[n] = 180;
g_width[n] = 0;
}
//先找最下面有效行,做为以后行的基础
//确定搜索范围
g_SearchStart = g_BottomMiddle - 30;
g_SearchEnd = g_BottomMiddle + 30;
if(g_SearchStart < 0)
{
g_SearchStart = 0;
}
if(g_SearchEnd >= MAX_VIDEO_POINT)
{
g_SearchEnd = MAX_VIDEO_POINT - 1;
}
//找最底的有效行
for(n = MAX_VIDEO_LINE - 1; n > 15; n --)
{
for(k = 0; k < MAX_BLACK_NUM; k ++)
{
g_BlackPoint[0][k] = 180;
g_BlackPoint[1][k] = 0;
}
cnt = 0;
m = g_SearchStart;
while((m < g_SearchEnd) && (cnt < MAX_BLACK_NUM))
{
if(g_VideoImageDate[n][m] < MIDDLE)
{
l_BlackStartDot = m;
while((g_VideoImageDate[n][m + 1] < MIDDLE) && (m < g_SearchEnd))
{
m ++;
}
if(((m - l_BlackStartDot) < 20) && ((m - l_BlackStartDot) > 4))
{
g_BlackPoint[0][cnt] = (l_BlackStartDot + m) / 2;
g_BlackPoint[1][cnt] = m - l_BlackStartDot + 1;
cnt ++;
}
else
{
}
m += 2; //继续扫描
}
else
{
m ++;
}
}
if(g_BlackMiddle[0] == 118)
{
m = 40;
BackLineValidFlag = 1;
while(m < g_SearchStart)
{
if((g_VideoImageDate[n][m] < MIDDLE) && (g_VideoImageDate[n][m + 1] < MIDDLE))
{
BackLineValidFlag = 0;
m = g_SearchStart;
}
else
{
m ++;
}
}
if(1 == BackLineValidFlag)
{
for(k = 0; k < MAX_BLACK_NUM; k ++)
{
if((g_BlackPoint[0][k] >= 90) && (g_BlackPoint[0][k] != 180))
{
g_BottomValidLine = n;
g_BlackPositionCenter[g_BottomValidLine] = g_BlackPoint[0][k];
g_width[g_BottomValidLine] = g_BlackPoint[1][k];
n = 0;
}
else
{
}
}
}
else
{
;
}
}
else if(1 == g_BlackMiddle[0])
{
m = 70;
BackLineValidFlag = 1;
while(m > g_SearchEnd)
{
if((g_VideoImageDate[n][m] < MIDDLE) && (g_VideoImageDate[n][m - 1] < MIDDLE))
{
BackLineValidFlag = 0;
m = g_SearchEnd;
}
else
{
m --;
}
}
if(1 == BackLineValidFlag)
{
for(k = 0; k < MAX_BLACK_NUM; k ++)
{
if(g_BlackPoint[0][k] < 30)
{
g_BottomValidLine = n;
g_BlackPositionCenter[g_BottomValidLine] = g_BlackPoint[0][k];
g_width[g_BottomValidLine] = g_BlackPoint[1][k];
n = 0; // 跳出循环
}
else
{
}
}
}
else
{
;
}
}
else
{
for(k = 0; k < MAX_BLACK_NUM; k ++)
{
if((g_BlackPoint[0][k] < (g_BottomMiddle + LIMIT)) && (g_BlackPoint[0][k] > (g_BottomMiddle - LIMIT)))
{
g_BottomValidLine = n;
g_BlackPositionCenter[g_BottomValidLine] = g_BlackPoint[0][k];
g_width[g_BottomValidLine] = g_BlackPoint[1][k];
n = 0; // 跳出循环
}
else
{
}
}
}
}//已经搜索过了最底部有效行
//======如果底部有效行上面的以行无效则使其中心与底部有效行相同 ,保证有有效行
if(g_BlackPositionCenter[g_BottomValidLine - 1] == 180)
{
g_BlackPositionCenter[g_BottomValidLine - 1] = g_BlackPositionCenter[g_BottomValidLine];
g_width[g_BottomValidLine - 1] = g_width[g_BottomValidLine];
}
else
{
;
}
}
if(1 == NextFlag)
{
for(n = g_BottomValidLine - 2; n >= 0; n --) //(n必须为有符号的)
{
for(k = 0;k < MAX_BLACK_NUM;k ++)
{
g_BlackPoint[0][k] = 180;
g_BlackPoint[1][k] = 0;
}
k = n + 1;
while(g_BlackPositionCenter[k] == 180)
{
k ++ ;
}
k2 = k + 1;
while(g_BlackPositionCenter[k2] == 180)
{
k2 ++;
}
//动态改变黑线宽度的下限和上限
if(g_width[k2] >= g_width[k])
{
g_WidthError = g_width[k2] - g_width[k] + 6;
g_MinWidth = g_width[k] - g_WidthError; //(有可能为负)
if(g_MinWidth < 2)
{
g_MinWidth = 2;
}
g_MaxWidth = g_width[k] + g_WidthError;
if(g_MaxWidth > 25)
{
g_MaxWidth = 25;
}
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -