// Display & Row contorl register的功能就是把指定的字符(地址为0x00~0xff)在指定位置上(Row:0~14;Column:0~29),指定的颜色(0x00~0x07)显示,
// Row contorl register只是设定指定的Row的颜色和字体是否双高、双宽。
// 由于MCU是通过IIC/SPI控制MTV018/MTV048的,下面以IIC控制为例:
/***************************************************************************************/
unsigned char data CursorX,CursorY;
typedef unsigned char uchar;
typedef unsigned char BYTE;
#define DataEndFg 0xff
#define MAX_OSD_COLUMN 30 // 最大30列
#define MAX_OSD_ROW 15 // 最大15行
//定义字符在字库中的地址,以下定义仅供参考,MTV018/MTV048的字库地址和以下定义有出入(不同OSD芯片,字库地址不同)
/************************************************************/
#define __ 0x00 // 空格 “ ”
#define _0 0x13 // 字符 “0”
#define _1 0x0a
#define _2 0x0b
#define _3 0x0c
#define _4 0x0d
#define _5 0x0e
#define _6 0x0f
#define _7 0x10
#define _8 0x11
#define _9 0x12
#define _A 0x14 // 字符 “A”
#define _B 0x15
#define _C 0x16
#define _D 0x17
#define _E 0x18
#define _F 0x19
#define _G 0x1a
#define _H 0x1b
#define _I 0x1c
#define _J 0x1d
#define _K 0x1e
#define _L 0x1f
#define _M 0x20
#define _N 0x21
#define _O 0x13
#define _P 0x23
#define _Q 0x24
#define _R 0x25
#define _S 0x26
#define _T 0x27
#define _U 0x28
#define _V 0x29
#define _W 0x2a
#define _X 0x2b
#define _Y 0x2c
#define _Z 0x2d
#define _a 0x41
#define _b 0x42
#define _c 0x43
#define _d 0x44
#define _e 0x45
#define _f 0x46
#define _g 0x47
#define _h 0x48
#define _i 0x49
#define _j 0x4a
#define _k 0x4b
#define _l 0x4c
#define _m 0x4d
#define _n 0x4e
#define _o 0x4f
#define _p 0x50
#define _q 0x51
#define _r 0x52
#define _s 0x53
#define _t 0x54
#define _u 0x55
#define _v 0x56
#define _w 0x57
#define _x 0x58
#define _y 0x59
#define _z 0x5a
/*
//定义颜色
#define BLACK 0
#define BLUE 1
#define GREEN 2
#define CYAN 3
#define RED 4
#define MAGENTA 5
#define YELLOW 6
#define WHITE 7
//*/
enum Color
{
BLACK,
BLUE,
GREEN,
CYAN,
RED,
MEGENTA,
YELLOW,
WHITE,
};
/***********************************************************************/
// 定义字符“Myson ”(注意:字符“n”后面有个空格“ ”)
BYTE code Logo[7]=
{
_M,_y,_s,_o,_n,__,DataEndFg
};
void gotoxy(BYTE x, BYTE y) //指定坐标(x ,y);row 为 y,column 为 x;
{
CursorX = x;
CursorY = y;
}
// 显示一个字符,字符在字库中的地址为fontcode(0x00~0xff),字体颜色为color(0x00~0x07);
void PrintChar(BYTE fontcode ,BYTE color,)
{
uchar buf[3];
buf[0]=0x7a; // MTV018的IIC slave 地址
buf[1]=CursorY|0x80; // 与0x80相或,指定对Address bytes of display reg操作。
//**********************************************************************************************/
buf[2]=CursorX; // 如果OSD字符地址超过0xFF,需要与0x20相与(既是D8),既是buf[2]=CursorX & 0x20;
// buf[2]=CursorX & 0x20;
//**********************************************************************************************/
buf[3]=fontcode;
SendIIC(buf,4); // 将buf[0]~buf[3]送入OSD IC // MTV018
buf[1]|=0xa0; //与0xa0相或,指定对Attribute bytes of display reg操作。
buf[3]=color; // 设置颜色
SendIIC(buf,4);
CursorX++;
if(CursorX >= MAX_OSD_COLUMN) // 地址自动加一,自动换行。
{
CursorX = 0;
CursorY++;
}
if(CursorY >= MAX_OSD_ROW)
{
CursorY = 0;
}
}
// 往MTV018控制寄存器(row,column)送数据
void SendOSDCmd(uchar row, uchar column,uchar value)
{
uchar buf[4];
buf[0]=0x7a;
buf[1]=row|0xa0; //与0xa0相或,指定对Attribute bytes of display reg操作。
buf[2]=column&0x3f; // Mask upper 2 bits
buf[3]=value;
SendIIC(buf,4);
}
// 显示一个字符串,颜色为color
void PrintString(BYTE *string , BYTE color)
{
while((*string) != DataEndFg)
{
PrintChar(*string, color, );
string++;
}
}
// 设置window(大小、颜色)
void SetWindow(BYTE CStart,BYTE CEnd,BYTE RStart,BYTE REnd,BYTE Color,BYTE WinNum)
{
SendOSDCmd(15, WinNum*3, (RStart<<4) | REnd);
SendOSDCmd(15, WinNum*3+1, (CStart<<3| WEN_VAL )&0xfe);//enable window and disable shadow
SendOSDCmd(15, WinNum*3+2, (CEnd<<3) | ( Color& 0x07 ) );
}
void Open_OSD()
{
SendOSDCmd(15,17, 0x80);
}
void Close_OSD()
{
SendOSDCmd(15,17,0x00); // OSDEN = 0
}
void Clear_OSD()
{
SendOSDCmd(15,17,0x06); // OSDEN = 0 ; WENCLR = 1; RAMCLR = 1
}
void CloseOSDWindow(uchar WindowNo) // 关闭指定窗口
{
switch(WindowNo)
{
case 0:
SendOSDCmd(15, 1, 0x00); // Clear WEN bit
break;
case 1:
SendOSDCmd(15, 4, 0x00);
break;
case 2:
SendOSDCmd(15, 7, 0x00);
break;
case 3:
SendOSDCmd(15, 10, 0x00);
break;
default:
break;
}
}
// Myson MCU 通过硬件Master IIC往OSD IC发送数据。
// MBUF为MCU的一个寄存器,往MBUF写值,MCU自动通过硬件IIC(ISCL,ISDA)将数据送出去。
// 也可以用软件IIC实现。
void SendIIC(uchar *buf,uchar n) // transmit IIC data by Myson MCU.
{
uchar i=0;
bit err=0;
MBUF=buf[i]; // First byte of IIC data, MBUF is master IIC receive/transmit data buffer of Myson MCU.
IIC_START();
for(i=1; i<n;i++)
{
IIC_counter=0;
err=wait_IIC(); //Wait a ACK.
if(err==1)
break;
MBUF=buf[i]; // Send next byte, MBUF auto send data to Slave IC.
delay_short(4);
}
IIC_STOP();
}
/***************************************************************************************/
#define VertPosition 0x10
#define HordPosition 0x10
// For Myson OSD Initial
void Initial_OSD()
{
uchar i, j;
uchar buf[4];
SendOSDCmd(15,16,0);
Clear_OSD();
SendOSDCmd(15,12,VertPosition); // 0x0E // VERTD
SendOSDCmd(15,13,HordPosition); // 0x0A // HORD
SendOSDCmd(15,14,0x00); // height
// MTV118/MTV121/MTV130没有HORR这个寄存器,也没有VCO0、VCO1这两个Bit。HORR和VCO这两个控制寄存器是用来控制芯片内部PLL的。
// MTV118/MTV121/MTV130内部没有PLL,而是直接从外部输入XIN时钟(Pin2)。
SendOSDCmd(15,15,HORR); // HORR 范围(36~127),此值需要和VCO搭配,同样频率下,VCO值越小时HORR值范围越小(36,Max < 127)
SendOSDCmd(15,18,0x4c|VCO); // VCO 范围 0x00~0x03 , 低频一般取0x00、0x01 ,高频一般取0x02、0x03
// For MTV048
SendOSDCmd(16,4,0x00); // 如果是MTV048,需要對Row16,Col4的寄存器進行設置,Bit7 :LCD = 0;
// disable CHS , CWS. //禁止字符双高双宽。
buf[0]=0x7a;
buf[2]=30; // Row =(1~14), Column = 30, 双高双宽、颜色控制位
buf[3]=0; //
for(i=0;i<=14;i++) // 0
{ //
buf[1]= ( 0x80 | i ); //0x80 display regedit
SendIIC(buf,4); //
} // Row
//disable Blink; // 禁止字符闪烁。
buf[0]=0x7a;
buf[3]=0;
for(i=0;i<=14;i++)
{
buf[1]= ( 0xa0 | i );
for(j=0;j<=29;j++)
{
buf[2]=