📄 vbi_parser.c
字号:
#include "VBI_Parser.h"
#include "reg51.h"
#include "TW803Reg.h"
#include "twowire.h"
#include "OSDDRAW.h"
#include "T803OSD.h"
#ifdef VBI_CC
CC_Content idata cc_char;// kenny 20060315
BOOL VBI_Init(void)
{
cc_char.preByte = 0;
cc_char.Column = 0;
cc_char.Row = 1;
cc_char.Line = 0;
I2CWriteByte(TW803_P0+4, 0x40, 0x05);
I2CWriteByte(TW803_P0+4, 0x51, 0x01);
return 1;
}
BOOL CC_Parsing(void)
{
uCHAR iptByte1, iptByte2;
// iptByte1 = I2CReadByte(TW101+4, 0x61);
// iptByte2 = I2CReadByte(TW101+4, 0x62);
// if ( iptByte1 == 0xC2 || iptByte2 == 0xC2)
// iptByte1 = iptByte2;
if( !(I2CReadByte(TW803_P0+4, 0x65) & 0x01) )
return FALSE;
iptByte1 = I2CReadByte(TW803_P0+4, 0x61);
iptByte2 = I2CReadByte(TW803_P0+4, 0x62);
if ( iptByte1 == 0x42 || iptByte2 == 0x42)
iptByte1 = iptByte2;
if ( iptByte1 & 0x80 )
iptByte1 -= 0x80;
if ( iptByte2 & 0x80 )
iptByte2 -= 0x80;
if ( iptByte1 >= 0x20 )
{
if ( cc_char.preByte == 0 )
{
if ( iptByte2 >=0x20 ) // one-byte char, one-byte char
{
OSDShowCCData(iptByte1,cc_char.Column,cc_char.Row,cc_char.TextAttr);
OSDShowCCData(iptByte2,cc_char.Column+1,cc_char.Row,cc_char.TextAttr);
cc_char.Column += 2;
}
else // one-byte char, 1st byte of two-byte data
{
OSDShowCCData(iptByte1,cc_char.Column,cc_char.Row,cc_char.TextAttr);
cc_char.Column++;
cc_char.preByte = iptByte2;
}
}
else
{
if ( ( cc_char.preByte == 0x11 && iptByte1 < 0x40 && iptByte1 >= 0x30 )
|| ( cc_char.preByte == 0x19 && iptByte1 < 0x40 && iptByte1 >= 0x30 ) )
{
if ( iptByte2 < 0x20 )
{
cc_char.preByte = 0x0F + (iptByte1 - 0x30 + 1 );
OSDShowCCData(cc_char.preByte,cc_char.Column,cc_char.Row,cc_char.TextAttr);
cc_char.Column++;
cc_char.preByte = iptByte2;
}
else
{
cc_char.preByte = 0x0F + (iptByte1 - 0x30 + 1 );
OSDShowCCData(cc_char.preByte,cc_char.Column,cc_char.Row,cc_char.TextAttr);
OSDShowCCData(iptByte2,cc_char.Column,cc_char.Row,cc_char.TextAttr);
cc_char.Column += 2;
cc_char.preByte = 0;
}
}
else if ( ( cc_char.preByte == 0x11 && iptByte1 < 0x30 && iptByte1 >= 0x20 )
|| ( cc_char.preByte == 0x19 && iptByte1 < 0x30 && iptByte1 >= 0x20 ) )
{
if ( iptByte2 < 0x20 )
{
if ( iptByte1 >= 0x20 && iptByte1 < 0x30 )
cc_char.TextAttr = iptByte1 - 0x20;
cc_char.preByte = iptByte2;
}
else
{
OSDShowCCData(iptByte2,cc_char.Column,cc_char.Row,cc_char.TextAttr);
cc_char.Column++;
cc_char.preByte = 0;
} // end of [if ( iptByte2 < 0x20 )]
}// end of [else if ( ( cc_char.preByte == 0x11 && iptByte1 < 0x30 && iptByte1 >= 0x20 )...]
else if ( cc_char.preByte == 0x14 || cc_char.preByte == 0x1C )
{
if ( iptByte2 < 0x20 )
{
switch ( iptByte1 )
{
case 0x20: // pop-on mode
break;
case 0x21: //BS
cc_char.Column--;
break;
case 0x22:
break;
case 0x23:
break;
case 0x24:
break;
case 0x25: // 2-rows roll-up mode
cc_char.Line = 1*FONT_HEIGHT;
break;
case 0x26: // 3-rows roll-up mode
cc_char.Line = 2*FONT_HEIGHT;
break;
case 0x27: // 4-rows roll-up mode
cc_char.Line = 3*FONT_HEIGHT;
break;
case 0x28:
break;
case 0x29: // paint-on mode
break;
case 0x2A:
break;
case 0x2B: // text mode
break;
case 0x2C:
cc_char.Line = 12*FONT_HEIGHT;
cc_char.Column = 0;
cc_char.Row = 1;
break;
case 0x2D: //CR
if ( cc_char.Line > 0 )
{
cc_char.Line -= FONT_HEIGHT;
OSDCfgWr(CHAR_DLY_2,cc_char.Line); //v[7:0] //00
}
cc_char.Column = 0;
cc_char.Row ++;
break;
case 0x2E:
break;
case 0x2F:
break;
}
cc_char.preByte = iptByte2;
}
else
{
OSDShowCCData(iptByte2,cc_char.Column,cc_char.Row,cc_char.TextAttr);
cc_char.Column++;
cc_char.preByte = 0;
}
}
else if ( cc_char.preByte == 0x17 || cc_char.preByte == 0x1F )
{
if ( iptByte2 < 0x20 )
{
switch ( iptByte1 )
{
case 0x21:
cc_char.Column += 1; //TO1
break;
case 0x22:
cc_char.Column += 2; //TO2
break;
case 0x23:
cc_char.Column += 3; //TO3
break;
}
}
else
{
OSDShowCCData(iptByte2,cc_char.Column,cc_char.Row,cc_char.TextAttr);
cc_char.Column++;
cc_char.preByte = 0;
}
}
else if ( cc_char.preByte <= 0x17 && iptByte1 >= 0x40
|| cc_char.preByte <= 0x1F && iptByte1 >= 0x60 )
{
if ( iptByte1 < 0x60 )
cc_char.TextAttr = iptByte2 - 0x40 + 1;
else
cc_char.TextAttr = iptByte2 - 0x60 + 1;
if ( cc_char.preByte == 0x11 )
{
if ( iptByte1 < 0x60 && cc_char.Line == 0)
cc_char.Line = 1*FONT_HEIGHT;
else if ( iptByte1 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 2*FONT_HEIGHT;
}
else if ( cc_char.preByte == 0x12)
{
if ( iptByte1 < 0x60 && cc_char.Line == 0)
cc_char.Line = 3*FONT_HEIGHT;
else if ( iptByte1 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 4*FONT_HEIGHT;
}
else if ( cc_char.preByte == 0x15)
{
if ( iptByte1 < 0x60 && cc_char.Line == 0)
cc_char.Line = 5*FONT_HEIGHT;
else if ( iptByte1 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 6*FONT_HEIGHT;
}
else if ( cc_char.preByte == 0x16)
{
if ( iptByte1 < 0x60 && cc_char.Line == 0)
cc_char.Line = 7*FONT_HEIGHT;
else if ( iptByte1 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 8*FONT_HEIGHT;
}
else if ( cc_char.preByte == 0x17)
{
if ( iptByte1 < 0x60 && cc_char.Line == 0)
cc_char.Line = 9*FONT_HEIGHT;
else if ( iptByte1 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 10*FONT_HEIGHT;
}
else if ( cc_char.preByte == 0x10)
{
if ( cc_char.Line == 0)
cc_char.Line = 11*FONT_HEIGHT;
}
else if ( cc_char.preByte == 0x13)
{
if ( iptByte1 < 0x60 && cc_char.Line == 0)
cc_char.Line = 12*FONT_HEIGHT;
else if ( iptByte1 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 13*FONT_HEIGHT;
}
else if ( cc_char.preByte == 0x14)
{
if ( iptByte1 < 0x60 && cc_char.Line == 0)
cc_char.Line = 14*FONT_HEIGHT;
else if ( iptByte1 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 15*FONT_HEIGHT;
}
}
else
return FALSE;
}
}
else
{
if ( ( iptByte1 == 0x11 && iptByte2 < 0x40 && iptByte2 >= 0x30 )
|| ( iptByte1 == 0x19 && iptByte2 < 0x40 && iptByte2 >= 0x30 ) )
{
iptByte1 = 0x0F + (iptByte2 - 0x30 + 1 );
OSDShowCCData(iptByte1,cc_char.Column,cc_char.Row,cc_char.TextAttr);
cc_char.Column++;
}
// text attributes
else if ( ( iptByte1 == 0x11 && iptByte2 < 0x30 && iptByte2 >= 0x20 )
|| ( iptByte1 == 0x19 && iptByte2 < 0x30 && iptByte2 >= 0x20 ) )
{
if ( iptByte1 >= 0x20 && iptByte1 < 0x30 )
cc_char.TextAttr = iptByte1 - 0x20 + 1;
}
// Command codes
else if ( iptByte1 == 0x14 || iptByte1 == 0x1C )
{
switch ( iptByte2 )
{
case 0x20: // pop-on mode
break;
case 0x21: //BS
cc_char.Column--;
break;
case 0x22:
break;
case 0x23:
break;
case 0x24:
break;
case 0x25: // 2-rows roll-up mode
cc_char.Line = 1*FONT_HEIGHT;
break;
case 0x26: // 3-rows roll-up mode
cc_char.Line = 2*FONT_HEIGHT;
break;
case 0x27: // 4-rows roll-up mode
// cc_char.Line = 12*FONT_HEIGHT;
// OSDCfgWr(CHAR_DLY_2,cc_char.Line);
break;
case 0x28:
break;
case 0x29: // paint-on mode
break;
case 0x2A:
break;
case 0x2B: // text mode
break;
case 0x2C:
cc_char.Line = 12*FONT_HEIGHT;
cc_char.Column = 0;
cc_char.Row = 1;
break;
case 0x2D: //CR
if ( cc_char.Line > 0 )
{
cc_char.Line -= FONT_HEIGHT;
OSDCfgWr(CHAR_DLY_2,cc_char.Line); //v[7:0] //00
}
cc_char.Column = 0;
if ( cc_char.Row < OSD_LINE_NUM )
cc_char.Row ++;
break;
case 0x2E:
break;
case 0x2F:
break;
}
}// Command codes
else if ( iptByte1 == 0x17 || iptByte1 == 0x1F )
{
switch ( iptByte2 )
{
case 0x21:
cc_char.Column += 1; //TO1
break;
case 0x22:
cc_char.Column += 2; //TO2
break;
case 0x23:
cc_char.Column += 3; //TO3
break;
}
}
// PAC
else if ( iptByte1 <= 0x17 && iptByte2 >= 0x40
|| iptByte1 <= 0x1F && iptByte2 >= 0x60 )
{
if ( iptByte2 < 0x60 )
cc_char.TextAttr = iptByte2 - 0x40 + 1;
else
cc_char.TextAttr = iptByte2 - 0x60 + 1;
if ( iptByte1 == 0x11 )
{
if ( iptByte2 < 0x60 && cc_char.Line == 0)
cc_char.Line = 1*FONT_HEIGHT;
else if ( iptByte2 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 2*FONT_HEIGHT;
}
else if ( iptByte1 == 0x12)
{
if ( iptByte2 < 0x60 && cc_char.Line == 0)
cc_char.Line = 3*FONT_HEIGHT;
else if ( iptByte2 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 4*FONT_HEIGHT;
}
else if ( iptByte1 == 0x15)
{
if ( iptByte2 < 0x60 && cc_char.Line == 0)
cc_char.Line = 5*FONT_HEIGHT;
else if ( iptByte2 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 6*FONT_HEIGHT;
}
else if ( iptByte1 == 0x16)
{
if ( iptByte2 < 0x60 && cc_char.Line == 0)
cc_char.Line = 7*FONT_HEIGHT;
else if ( iptByte2 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 8*FONT_HEIGHT;
}
else if ( iptByte1 == 0x17)
{
if ( iptByte2 < 0x60 && cc_char.Line == 0)
cc_char.Line = 9*FONT_HEIGHT;
else if ( iptByte2 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 10*FONT_HEIGHT;
}
else if ( iptByte1 == 0x10)
{
if ( cc_char.Line == 0)
cc_char.Line = 11*FONT_HEIGHT;
}
else if ( iptByte1 == 0x13)
{
if ( iptByte2 < 0x60 && cc_char.Line == 0)
cc_char.Line = 12*FONT_HEIGHT;
else if ( iptByte2 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 13*FONT_HEIGHT;
}
else if ( iptByte1 == 0x14)
{
if ( iptByte2 < 0x60 && cc_char.Line == 0)
cc_char.Line = 14*FONT_HEIGHT;
else if ( iptByte2 >= 0x60 && cc_char.Line == 0)
cc_char.Line = 15*FONT_HEIGHT;
}
}
else
return FALSE;
cc_char.preByte = 0;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -