Разбираюсь с генерацией OSD. Из даташита на MX88V462 http://radiokot.ru/forum/download/file.php?id=186737
128 fixed characters and 64 programmable characters
Display 128 characters in valid display area. ??????
Composition of a character: 18 x 12 dots
Не могу понять, как в RAM хранятся символы? Как сослаться на символ встроенного шрифта?
Интуитивно представляю FONT TABLE RAM как массив бит 18 строк на (12*(128+64)) столбцов, но не вижу подтверждения в исходнике. Что задает массив m_RamFontTab?
Вот кусок:
Спойлер
Код: Выделить всё
На стр 112 даташита:
EXT REG ADRESS_L 0xF2[D5-0] CHAR CODEOF FONT TABLE RAM
EXT REG ADRESS_H 0xF3[D4-0] SCAN LINE OF THE FONT APPOINTED BY REG 0xA0 (0 - 0x11)
EXT REG DATA_L 0xF4[D7-0] DATA FONT TABLE RAM
EXT REG DATA_H 0xF5[D7-0] DATA FONT TABLE RAM
unsigned char m_RamFontTab[]=
{
0xFF,0x0F,0xFF,0x0F,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x7F,0x0C,0x7F,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,//LT
0xFF,0x0F,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//T
0xFF,0x0F,0xFF,0x0F,0x03,0x00,0x03,0x00,0x03,0x00,0xE3,0x0F,0xE3,0x0F,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,//RT
0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,//R
0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0xE3,0x0F,0xE3,0x0F,0x03,0x00,0x03,0x00,0x03,0x00,0xFF,0x0F,0xFF,0x0F,//RB
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xFF,0x0F, //B
0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x7F,0x0C,0x7F,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0xFF,0x0F,0xFF,0x0F,//LB
0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C//L
};
#define MXIC_CHAR_COUNT_PER_LINE 16
#define MXIC_CHAR_LINE_COUNT 8
#define OSD_ADDRESS_L 0xF2
#define OSD_ADDRESS_H 0xF3
#define OSD_DATA_L 0xF4
#define OSD_DATA_H 0xF5
unsigned char MXIC_OSDReg_Write(unsigned char m_Target,unsigned int m_Address,unsigned char *m_Data,unsigned int m_Count)
{
int i,m_Offset=0;
int j;
unsigned char m_Address_H;
unsigned char m_Address_L;
MXIC_WriteExternalReg(OSD_RW_CTRL,m_Target|0x80);//Burst Mode Write
m_Address_H=(unsigned char)(m_Address/0x100);
m_Address_L=(unsigned char)(m_Address-OSD_ADDRESS_H*0x100);
MXIC_WriteExternalReg(OSD_ADDRESS_H,m_Address_H);
MXIC_WriteExternalReg(OSD_ADDRESS_L,m_Address_L);
switch(m_Target)
{
case OSD_CTRL_REG:
for(i=0;i<m_Count;i++)
{
MXIC_WriteExternalReg(OSD_DATA_L,m_Data[i]);
}
break;
case OSD_FONT_RAM:
for(i=0,m_Offset=0;i<m_Count;i++)
{
for(j=0;j<18;j++)
{
MXIC_WriteExternalReg(OSD_DATA_L,m_Data[m_Offset]);
MXIC_WriteExternalReg(OSD_DATA_H,m_Data[m_Offset+1]);
m_Offset+=2;
}
}
break;
case OSD_CODE_BUFFER:
for(i=0,m_Offset=0;i<m_Count;i++,m_Offset+=2)
{
MXIC_WriteExternalReg(OSD_DATA_L,m_Data[m_Offset]);
MXIC_WriteExternalReg(OSD_DATA_H,m_Data[m_Offset+1]);
}
break;
case OSD_ATTR_REG:
for(i=0,m_Offset=0;i<m_Count;i++,m_Offset+=2)
{
MXIC_WriteExternalReg(OSD_DATA_L,m_Data[m_Offset]);
MXIC_WriteExternalReg(OSD_DATA_H,m_Data[m_Offset+1]);
}
break;
}
MXIC_WriteExternalReg(OSD_RW_CTRL,0x04);//Disable OSD Read_Write Mode
return 1;
}
unsigned char OSD_AutoLoadRamFont(void)
{
return MXIC_OSDReg_Write(OSD_FONT_RAM,0x00,m_RamFontTab,8);
}
unsigned char MXIC_OSD_ShowText(unsigned char *m_Str,unsigned char m_Count,unsigned char m_RowVal,unsigned char m_ColVal)
{
unsigned char m_DisplayBuffer[MXIC_CHAR_COUNT_PER_LINE*2]={' '};
unsigned char m_AttributeBuffer[MXIC_CHAR_COUNT_PER_LINE*2]={' '};
int i,j;
for(i=0,j=0;i<m_Count;j+=2,i++)
{
m_DisplayBuffer[j]=ASCII_TO_FONTIndex(m_Str[i]);
m_DisplayBuffer[j+1]=0x04;
}
MXIC_OSDReg_Write(OSD_CODE_BUFFER,(m_RowVal*OSD_COL_COUNT+m_ColVal),m_DisplayBuffer,m_Count);
return 1;
}


