標題:
字符芯片D6453單片機驅動程序 OSD顯示模塊
[打印本頁]
作者:
335218864
時間:
2017-8-17 09:11
標題:
字符芯片D6453單片機驅動程序 OSD顯示模塊
字符芯片D6453驅動程序,采用stc12c芯片來驅動的.
單片機源程序如下:
/****************OSD顯示模塊********************/
#include "STC12C5Ax.h"
#include "main.h"
sbit MCLK = P1^1;
sbit MCS = P1^2;
sbit MDATA = P1^3;
/************送一個字節(jié)到OSD************/
void OsdICSendOneByte(uchar osdbyte)
{
uchar i;
uchar j;
//EA=0;
MCS=0;
MDATA=1;
MCLK=0;
for(i = 0; i < 8; i++)
{
if((osdbyte & 0x80)>0)
{
MCLK=0;
MDATA=1;
j++;
j++;
j++;
j++;
j++;
MCLK=1;
}
else
{
MCLK=0;
MDATA=0;
j++;
j++;
j++;
j++;
j++;
MCLK=1;
}
osdbyte = osdbyte<<1;
}
j = 150;
while((--j) > 0);
MCS=1;
//EA=1;
}
/************送一個字到OSD************/
void OsdICSendTwoByte(int osdword)
{
uchar i;
uchar j;
MCS=0;
MDATA=1;
MCLK=0;
for(i = 0;i < 8; i++)
{
if((osdword & 0x8000)>0)
{
MCLK=0;
MDATA=1;
j++;
j++;
j++;
j++;
j++;
MCLK=1;
}
else
{
MCLK=0;
MDATA=0;
j++;
j++;
j++;
j++;
j++;
MCLK=1;
}
osdword = osdword<<1;
}
j = 150;
while((--j) > 0);
for(i = 0;i < 8; i++)
{
if((osdword & 0x8000)>0)
{
MCLK=0;
MDATA=1;
j++;
j++;
j++;
j++;
j++;
MCLK=1;
}
else
{
MCLK=0;
MDATA=0;
j++;
j++;
j++;
j++;
j++;
MCLK=1;
}
osdword = osdword<<1;
}
j = 150;
while((--j) > 0);
MCS=1;
}
/*****************清屏********************/
void OsdICInitRam(void)
{
OsdICSendOneByte(0x34); //Video Ram Clear (0x34);
delay(300);
}
/***************字符顯示開*******************/
void OsdICDisEn(uchar blink)
{
//0001,D0,LC,BL1,BL0---BL1BL0:00-off,01-2Hz,10-1Hz,11-0.5Hz
OsdICSendOneByte(0x0c | (blink & 0x03)); //字符顯示開、震蕩開、閃爍1HZ
}
/**************字符背景顏色*****************/
void OsdICDisBackColor(void)
{
//0011,0BS1BS00--BS1,BS0:0-NO,1-BlackFraming,2-BlackOnWhite,3-BlackFilling
OsdICSendOneByte(0x41); //沒有背景、邊框開
OsdICSendOneByte(0x10); //黑色邊框
}
/***************清屏初始化*****************/
void OsdInitDis(void)
{
OsdICInitRam(); //視頻RAM清零
OsdICDisEn(0x02); //字符顯示開、震蕩開、閃爍1HZ
OsdICDisBackColor(); //字符背景顏色
//OsdICSendOneByte(0x32); //字符上下拉長
}
/************字符顯示屏幕位置控制 32*32*************/
void OsdICScreenPos(uchar col,uchar Line)
{
//1000,00V4V3,V2V1V0H4,H3H2H1H0
uint temp;
temp =col;
temp <<=5;
temp |=Line;
temp |=0x8000;
OsdICSendTwoByte(temp);//0x80e8);
}
/************字符顯示VRAM位置控制 12*24*************/
void OsdCharDisPos(uchar Line,uchar col)
{
//1000,100AR3,AR2AR1AR0AC4,AC3AC2AC1AC0
uint temp;
temp =Line;
temp <<=5;
temp |=col;
temp |=0x8400;
OsdICSendTwoByte(temp);
OsdCurPosOpt.line=Line;
OsdCurPosOpt.col=col;
}
/***************字符顯示顏色控制*************/
void OsdCharDis(uchar bl,uchar character)
{
//1100,R G B BL,C7C6C5C4,C3C2C1C0--BL:1-Blink RGB:0-Black 1-Blue 2-Green 3-Cyan 4-Red 5-Magenta 6-Yellow 7-White
uint temp;
uint temp1;
temp=RGB_Color;
temp<<=9;
temp1=bl; //1為閃爍,0為不閃
temp1<<=8;
temp=temp | temp1 | character;
temp |=0xC000;
OsdICSendTwoByte(temp);
}
/*****************寫字符RAM地址****************/
void OsdRamAddress(uchar RW,uchar RL)
{
//1000 011 RW3RW2RW1RW0 RL4RL3RL2RL1RL0
uint temp;
temp=RW;
temp<<=5;
temp|=RL;
temp|=0x8600;
OsdICSendTwoByte(temp);
}
/************寫字符RAM18行某行的數(shù)據(jù)*************/
void OsdRamData(uint Character)
{
//1001 CR11CR10CR9CR8CR7CR6CR5CR4CR3CR2CR1CR0
uint temp;
temp=Character;
temp|=0x9000;
OsdICSendTwoByte(temp);
}
/************寫一個漢字的點陣數(shù)據(jù)到CRAM*************/
void OsdRamCharacter(uint CharacterBuf[18])
{
uchar i;
OsdRamData(0);
for(i=0;i<17;i++)
OsdRamData(CharacterBuf[i]);
}
/************寫等待界面點陣數(shù)據(jù)到RAM*************/
void OsdWaitRam(void)
{
uchar i,x;
uchar j;
uint xdata CharacterBuf[18];
OsdRamAddress(0,0);
for(i=0;i<5;i++)
{
for(j=0;j<18;j++)
{
x=HZKTab[i][j*2];
CharacterBuf[j]=x*256+HZKTab[i][j*2+1];
}
OsdRamCharacter(CharacterBuf);
}
}
/************寫系統(tǒng)配置界面點陣數(shù)據(jù)到RAM*************/
void OsdInfoRam(void)
{
uchar i,x;
uchar j;
uint CharacterBuf[18];
OsdRamAddress(0,0);
for(i=8;i<23;i++)
{
for(j=0;j<18;j++)
{
x=HZKTab[i][j*2];
CharacterBuf[j]=x*256+HZKTab[i][j*2+1];
}
OsdRamCharacter(CharacterBuf);
}
}
/************寫調(diào)預置位界面點陣數(shù)據(jù)到RAM1*************
void OsdCallPresetRam(void)
{
uchar i,x;
uchar j;
uint xdata CharacterBuf[18];
OsdRamAddress(0,0);
for(i=0;i<11;i++)
{
for(j=0;j<18;j++)
{
x=HZKTab[TabCallPresetRam[i]][j*2];
CharacterBuf[j]=x*256+HZKTab[TabCallPresetRam[i]][j*2+1];
}
OsdRamCharacter(CharacterBuf);
}
}
/*************************************/
void Osd3BitDis(uchar num)
{
uchar temp;
temp=num%100;
OsdCharDis(0,num/100);
OsdCharDis(0,temp/10);
OsdCharDis(0,temp%10);
}
/************寫主菜單界面點陣數(shù)據(jù)到RAM*************/
void OsdMainMenuRam(void)
{
uchar i,x;
uchar j;
uint CharacterBuf[18];
OsdRamAddress(0,0);
for(i=0;i<16;i++)
{
for(j=0;j<18;j++)
{
x=HZKTab[TabMainMenuRam[i]][j*2];
CharacterBuf[j]=x*256+HZKTab[TabMainMenuRam[i]][j*2+1];
}
OsdRamCharacter(CharacterBuf);
}
}
/************寫各級菜單界面點陣數(shù)據(jù)到RAM2*************/
void OsdWhriteRam(uchar num,uchar TabRam[])
{
uchar i,x;
uchar j;
uint CharacterBuf[18];
OsdRamAddress(0,0);
for(i=0;i<num;i++)
{
for(j=0;j<18;j++)
{
x=HZKTab[TabRam[i]][j*2];
CharacterBuf[j]=x*256+HZKTab[TabRam[i]][j*2+1];
}
OsdRamCharacter(CharacterBuf);
}
}
/*****************系統(tǒng)自檢顯示********************/
void OsdPowWait(void)
{
uchar i;
OsdInitDis(); //清屏初始化
delay(600);
switch(OsdKeyOpt.Language)
{
case 0:
OsdWaitRam(); //寫等待界面點陣數(shù)據(jù)到Ram
OsdICScreenPos(6,6); //屏幕位置
delay(60);
OsdCharDisPos(5,4); //字符位置
for(i = 0;i < 15;i++)
{
OsdCharDis(0,OSDWAIT_TAB[i]); //在屏幕顯示“系統(tǒng)自檢中”
}
break;
case 1:
OsdICScreenPos(6,6); //屏幕位置
delay(60);
OsdCharDisPos(5,4); //字符位置
for(i = 0;i < 15;i++)
{
OsdCharDis(0,ENOSDWAIT_TAB[i]); //在屏幕顯示“系統(tǒng)自檢中”
}
break;
default: break;
}
delay(600);
}
/**************顯示初始化信息*****************/
void OsdInforDis(void)
{
uchar j;
OsdInitDis(); //初始化
delay(200);
switch(OsdKeyOpt.Language)
{
case 0:
OsdInfoRam(); //寫系統(tǒng)配置點陣到RAM
OsdICScreenPos(6,6); //屏幕位置
delay(20);
OsdCharDisPos(2,2);
for(j=0;j<15;j++)
{
OsdCharDis(0,OSDCAMERAID[j]);
}
if(DipSwOpt.Softcamid == 0)Osd3BitDis(DipSwOpt.camid);
else Osd3BitDis(DipSwOpt.Softcamid);
OsdCharDisPos(4,2);
for(j=0;j<10;j++)
{
OsdCharDis(0,OSDBAUDRATE[j]);
}
for(j=0;j<8;j++)
{
OsdCharDis(0,OSDBAUDRATE_VALUE[DipSwOpt.baudrat][j]);
}
OsdCharDisPos(6,2);
for(j = 0; j < 9; j++)
{
OsdCharDis(0,OSDPROTOCOL[j]);
}
for(j = 0; j < 9; j++)
{
OsdCharDis(0,OSDPROTOCOL_VALUE[j]);
}
OsdCharDisPos(8,2);
for(j=0;j<18;j++)
{
OsdCharDis(0,OSDVER[j]);
}
break;
case 1:
OsdICScreenPos(6,6); //屏幕位置
delay(20);
OsdCharDisPos(2,2);
for(j=0;j<15;j++)
{
OsdCharDis(0,ENOSDCAMERAID[j]);
}
if(DipSwOpt.Softcamid == 0)Osd3BitDis(DipSwOpt.camid);
else Osd3BitDis(DipSwOpt.Softcamid);
OsdCharDisPos(4,2);
for(j=0;j<10;j++)
{
OsdCharDis(0,ENOSDBAUDRATE[j]);
}
for(j=0;j<8;j++)
{
OsdCharDis(0,OSDBAUDRATE_VALUE[DipSwOpt.baudrat][j]);
}
OsdCharDisPos(6,2);
for(j = 0; j < 18; j++)
{
OsdCharDis(0,ENOSDPROTOCOL[j]);
}
OsdCharDisPos(8,2);
for(j=0;j<18;j++)
{
OsdCharDis(0,ENOSDVER[j]);
}
break;
default: break;
}
OsdMenuOpt.inforflag = 1;
OsdMenuOpt.enterflag = 0;
OsdMenuOpt.osdflag= 1;
OsdMenuOpt.swflag = 0;
OsdMenuOpt.ymstat=0; //頁面指針指向第一頁
OsdMenuOpt.gbstat=0; //光標指針指向第一行
TimeOpt.displaytime=0; //置位清屏時間
OsdKeyOpt.AngleFlag=1; //角度顯示標志
}
復制代碼
作者:
hmgqljz111
時間:
2019-9-19 09:38
謝謝樓主分享。
作者:
liwei1991
時間:
2019-10-21 12:31
謝謝分享!
作者:
愛學習2017
時間:
2023-8-9 20:42
字庫還不懂,能否提供一下字庫或者整個工程參考一下謝謝
作者:
yyzf998
時間:
2023-12-28 21:18
能提供完整的程序,我給你獎勵200黑幣, 謝謝!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1