字符芯片D6453驱动程序,采用stc12c芯片来驱动的.
单片机源程序如下:
- /****************OSD显示模块********************/
- #include "STC12C5Ax.h"
- #include "main.h"
- sbit MCLK = P1^1;
- sbit MCS = P1^2;
- sbit MDATA = P1^3;
- /************送一个字节到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行某行的数据*************/
- void OsdRamData(uint Character)
- {
- //1001 CR11CR10CR9CR8CR7CR6CR5CR4CR3CR2CR1CR0
- uint temp;
-
- temp=Character;
- temp|=0x9000;
-
- OsdICSendTwoByte(temp);
- }
- /************写一个汉字的点阵数据到CRAM*************/
- void OsdRamCharacter(uint CharacterBuf[18])
- {
- uchar i;
-
- OsdRamData(0);
- for(i=0;i<17;i++)
- OsdRamData(CharacterBuf[i]);
-
- }
- /************写等待界面点阵数据到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);
- }
- }
- /************写系统配置界面点阵数据到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);
- }
- }
- /************写调预置位界面点阵数据到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);
- }
- /************写主菜单界面点阵数据到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);
- }
- }
- /************写各级菜单界面点阵数据到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);
- }
- }
- /*****************系统自检显示********************/
- void OsdPowWait(void)
- {
- uchar i;
- OsdInitDis(); //清屏初始化
- delay(600);
- switch(OsdKeyOpt.Language)
- {
- case 0:
- OsdWaitRam(); //写等待界面点阵数据到Ram
- OsdICScreenPos(6,6); //屏幕位置
- delay(60);
- OsdCharDisPos(5,4); //字符位置
-
- for(i = 0;i < 15;i++)
- {
- OsdCharDis(0,OSDWAIT_TAB[i]); //在屏幕显示“系统自检中”
- }
- break;
- case 1:
- OsdICScreenPos(6,6); //屏幕位置
- delay(60);
- OsdCharDisPos(5,4); //字符位置
-
- for(i = 0;i < 15;i++)
- {
- OsdCharDis(0,ENOSDWAIT_TAB[i]); //在屏幕显示“系统自检中”
- }
- break;
- default: break;
- }
- delay(600);
- }
- /**************显示初始化信息*****************/
- void OsdInforDis(void)
- {
- uchar j;
-
- OsdInitDis(); //初始化
- delay(200);
- switch(OsdKeyOpt.Language)
- {
- case 0:
- OsdInfoRam(); //写系统配置点阵到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; //角度显示标志
- }
复制代码
|