内置OSD控制器基本寄存器设置流程示例
Step_1:OSD字体大小配置
1、选择字体宽度为12或者16 -0x300(位4)
2、设置字体高度 -0x390(位4-0)
3、设置字体总数 -0x391(位6-0)
Step_2: OSD窗口配置
Window#1 (0x310~0x31F),Window#2 (0x320~0x32F),
Window#3 (0x330~0x33F),Window#4 (0x340~0x34F),
Window#5 (0x350~0x35F),Window#6 (0x360~0x36F),
Window#7 (0x370~0x37F),Window#8 (0x380~0x38F)
Step_3: OSD颜色属性、字设置
1、启动OSD RAM访问 -0x304(位0=0)
2、设置多色开始地址 -0x305(w3-1),0x30B(w7-0),0x393(w7-0),0x394(w7-0)
3、OSD RAM地址 -0X305(w0),0x306(w7-0)第一个地址是step_1_23窗口内容的起始地址
4、OSD RAM数据端口高(字体地址) -0x307数据自动写入上述地址、0x304(位5=0)选择低于256个字符(位5=1)选择高于256个字符
5、OSD RAM数据端口位18(边界效应)、位17(闪烁效应)、位16(高|低256字符) -0x304位4、位7和位5数据自动写入到上述地址
6、OSD RAM数据端口低(颜色属性) -0x308数据自动写入上述地址
7、重复3,4,5和6 -地址应该增加一个
Step_4: 颜色查找表设置
1、选择颜色查找表写入地址
-0x30C(位5-0)
-BIT[5:0]这6位指定查找表中的64个条目之一,每个条目的内容都是16位的RGB颜色
-有65536中颜色可供选择,对于单色字体,OSD控制器在特定的时间只能访问其中的16个
2、颜色查找表控制位设置
-0x30D(高字节),0x30E(低字节)
-查找表的数据通过0x30D和0x30E访问
3、重复1和2来编程查找表的每个条目
Step_5: FONT_RAM_DATA设置(字体RAM)
1、启动FONT RAM访问
2、字体RAM地址设置 -9位(h000-h1FF),-0x304(w5),0x309(w7-0)
-h000-h1FF:单个字体RAM(最多379个可编程字符)
3、字体RAM数据端口 -0x30A数据自动写入上述地址
4、对一个FONT RAM数据重复(3)27次 -内部地址自动增加1
5、新的FONT RAM地址设置 -9位
6、重复3/4/5 -字体RAM地址应该增加一个
注意:对于字体RAM配置和字体位映射,请参阅详细描述第30页
Step_6: OSD设置结束并启用OSD
1、OSD开启、关闭
启动控制 0:开;1:关 -0x30C(位6 = 0)
2、OSD窗口使能 -0x310(w7=1)窗口1使能
此处提供我个人写的win1 OSD叠加显示汉字“森鹏”的窗口程序:
void InitWinno1(void)
{
int8u j;
WaitVBlank(1);
FOsdWinEnable(1,OFF) ;
FOsdSetFontWidthHeight(16,16);
FOsdWinInit(1);
FOsdWinScreenXY(1,20,20);
FOsdWinScreenWH(1,2,2);
FOsdWinZoom(1,1,1);
FOsdWinSetOsdRamStartAddr(1, 0);
FOsdWinAlphaPixel(1,4,8);
FOsdWinMulticolor(1,OFF);
FOsdRamMemset(0,0,0x40,1);
FOsdRamMemset(1,1,0x73,1);
FOsdRamMemset(2,0,0x37,1);
FOsdRamMemset(3,1,0x04,1);
for(j = 0;j < 32;j = j+4)
{ /*字模数组转换
FosdGetFontRamTable[j] =( (FOsdSetFontRamTable[j]&0x0F)<<4 )+( FOsdSetFontRamTable[j+1]&0x0F);
FosdGetFontRamTable[j+1] =( FOsdSetFontRamTable[j+2]&0x0F )+( FOsdSetFontRamTable[j+3]&0x0F) ;
FosdGetFontRamTable[j+2] =( FOsdSetFontRamTable[j]&0xF0 )+( FOsdSetFontRamTable[j+1] >> 4);
FosdGetFontRamTable[j+3] =( FOsdSetFontRamTable[j+2]&0xF0 )+( FOsdSetFontRamTable[j+3] >> 4);
*/
FosdGetFontRamTable[j] =( FOsdSetFontRamTable[j]>>4 )+( FOsdSetFontRamTable[j+2]&0xF0);
FosdGetFontRamTable[j+1] =( FOsdSetFontRamTable[j]&0x0F )+( FOsdSetFontRamTable[j+2]<<4);
FosdGetFontRamTable[j+2] =( FOsdSetFontRamTable[j+3]&0xF0 )+( FOsdSetFontRamTable[j+1] >> 4);
FosdGetFontRamTable[j+3] =( FOsdSetFontRamTable[j+1]&0x0F )+( FOsdSetFontRamTable[j+3] << 4);
FosdGetFontRamTable1[j] =( FOsdSetFontRamTable1[j]>>4 )+( FOsdSetFontRamTable1[j+2]&0xF0);
FosdGetFontRamTable1[j+1] =( FOsdSetFontRamTable1[j]&0x0F )+( FOsdSetFontRamTable1[j+2]<<4);
FosdGetFontRamTable1[j+2] =( FOsdSetFontRamTable1[j+3]&0xF0 )+( FOsdSetFontRamTable1[j+1] >> 4);
FosdGetFontRamTable1[j+3] =( FOsdSetFontRamTable1[j+1]&0x0F )+( FOsdSetFontRamTable1[j+3] << 4);
}
FOsdDownloadFontBySerial(0,FosdGetFontRamTable,32,1);
FOsdDownloadFontBySerial(1,FosdGetFontRamTable1,32,1);
FOsdOnOff(ON,1);
FOsdWinEnable(1,ON);
}