找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3859|回复: 4
收起左侧

字符芯片D6453单片机驱动程序 OSD显示模块

[复制链接]
ID:228021 发表于 2017-8-17 09:11 | 显示全部楼层 |阅读模式
字符芯片D6453驱动程序,采用stc12c芯片来驱动的.

单片机源程序如下:

  1. /****************OSD显示模块********************/
  2. #include "STC12C5Ax.h"
  3. #include "main.h"

  4. sbit MCLK  = P1^1;
  5. sbit MCS   = P1^2;
  6. sbit MDATA = P1^3;
  7. /************送一个字节到OSD************/
  8. void OsdICSendOneByte(uchar osdbyte)   
  9. {   
  10.      uchar i;
  11.      uchar j;
  12.    
  13.      //EA=0;

  14.     MCS=0;
  15.     MDATA=1;
  16.     MCLK=0;
  17.     for(i = 0; i < 8; i++)
  18.     {   
  19.         if((osdbyte & 0x80)>0)
  20.          {   
  21.             MCLK=0;
  22.             MDATA=1;
  23.             j++;
  24.             j++;
  25.             j++;
  26.             j++;
  27.             j++;
  28.               MCLK=1;
  29.          }
  30.         else
  31.         {   
  32.             MCLK=0;
  33.             MDATA=0;
  34.             j++;
  35.             j++;
  36.             j++;
  37.             j++;
  38.             j++;
  39.              MCLK=1;
  40.          }
  41.         osdbyte = osdbyte<<1;
  42.     }
  43.     j = 150;
  44.     while((--j) > 0);
  45.     MCS=1;

  46.     //EA=1;
  47. }
  48. /************送一个字到OSD************/
  49. void OsdICSendTwoByte(int osdword)   
  50. {   
  51.      uchar i;
  52.     uchar j;
  53.         
  54.     MCS=0;
  55.     MDATA=1;
  56.     MCLK=0;
  57.     for(i = 0;i < 8; i++)
  58.     {   
  59.         if((osdword & 0x8000)>0)
  60.          {   
  61.             MCLK=0;
  62.             MDATA=1;
  63.             j++;
  64.             j++;
  65.             j++;
  66.             j++;
  67.             j++;
  68.              MCLK=1;
  69.          }
  70.         else
  71.         {   
  72.             MCLK=0;
  73.             MDATA=0;
  74.             j++;
  75.             j++;
  76.             j++;
  77.             j++;
  78.             j++;
  79.              MCLK=1;
  80.          }
  81.         osdword = osdword<<1;
  82.     }
  83.     j = 150;
  84.     while((--j) > 0);
  85.    
  86.     for(i = 0;i < 8; i++)
  87.     {   
  88.         if((osdword & 0x8000)>0)
  89.          {   
  90.             MCLK=0;
  91.             MDATA=1;
  92.             j++;
  93.             j++;
  94.             j++;
  95.             j++;
  96.             j++;
  97.              MCLK=1;
  98.          }
  99.         else
  100.         {   
  101.             MCLK=0;
  102.             MDATA=0;
  103.             j++;
  104.             j++;
  105.             j++;
  106.             j++;
  107.             j++;
  108.              MCLK=1;
  109.          }
  110.         osdword = osdword<<1;
  111.     }
  112.     j = 150;
  113.     while((--j) > 0);
  114.     MCS=1;
  115. }
  116. /*****************清屏********************/
  117. void OsdICInitRam(void)
  118. {   
  119.     OsdICSendOneByte(0x34);            //Video Ram Clear (0x34);
  120.     delay(300);
  121. }
  122. /***************字符显示开*******************/
  123. void OsdICDisEn(uchar blink)
  124. {
  125.     //0001,D0,LC,BL1,BL0---BL1BL0:00-off,01-2Hz,10-1Hz,11-0.5Hz
  126.     OsdICSendOneByte(0x0c | (blink & 0x03));  //字符显示开、震荡开、闪烁1HZ
  127. }
  128. /**************字符背景颜色*****************/
  129. void OsdICDisBackColor(void)
  130. {
  131.     //0011,0BS1BS00--BS1,BS0:0-NO,1-BlackFraming,2-BlackOnWhite,3-BlackFilling
  132.     OsdICSendOneByte(0x41);      //没有背景、边框开
  133.     OsdICSendOneByte(0x10);      //黑色边框
  134. }
  135. /***************清屏初始化*****************/
  136. void OsdInitDis(void)
  137. {   
  138.     OsdICInitRam();            //视频RAM清零
  139.     OsdICDisEn(0x02);        //字符显示开、震荡开、闪烁1HZ
  140.     OsdICDisBackColor();    //字符背景颜色
  141.     //OsdICSendOneByte(0x32);    //字符上下拉长
  142. }
  143. /************字符显示屏幕位置控制 32*32*************/
  144. void OsdICScreenPos(uchar col,uchar Line)
  145. {   
  146.     //1000,00V4V3,V2V1V0H4,H3H2H1H0
  147.     uint temp;
  148.    
  149.     temp   =col;
  150.     temp <<=5;
  151.     temp  |=Line;
  152.     temp  |=0x8000;
  153.     OsdICSendTwoByte(temp);//0x80e8);
  154. }
  155. /************字符显示VRAM位置控制 12*24*************/
  156. void OsdCharDisPos(uchar Line,uchar col)   
  157. {   
  158.     //1000,100AR3,AR2AR1AR0AC4,AC3AC2AC1AC0
  159.     uint temp;
  160.    
  161.     temp   =Line;
  162.     temp <<=5;
  163.     temp  |=col;
  164.     temp  |=0x8400;
  165.    
  166.     OsdICSendTwoByte(temp);
  167.     OsdCurPosOpt.line=Line;
  168.     OsdCurPosOpt.col=col;
  169. }
  170. /***************字符显示颜色控制*************/
  171. void OsdCharDis(uchar bl,uchar character)   
  172. {   
  173.     //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
  174.    
  175.     uint temp;
  176.     uint temp1;
  177.    
  178.     temp=RGB_Color;
  179.     temp<<=9;
  180.    
  181.     temp1=bl;          //1为闪烁,0为不闪
  182.     temp1<<=8;
  183.    
  184.     temp=temp | temp1 | character;
  185.    
  186.     temp |=0xC000;
  187.    
  188.     OsdICSendTwoByte(temp);
  189.    
  190. }
  191. /*****************写字符RAM地址****************/
  192. void OsdRamAddress(uchar RW,uchar RL)
  193. {
  194.   //1000 011 RW3RW2RW1RW0 RL4RL3RL2RL1RL0
  195.   
  196.   uint temp;
  197.   
  198.   temp=RW;
  199.   temp<<=5;
  200.   temp|=RL;  
  201.   temp|=0x8600;
  202.   
  203.   OsdICSendTwoByte(temp);
  204.   
  205. }
  206. /************写字符RAM18行某行的数据*************/
  207. void OsdRamData(uint Character)
  208. {
  209.   //1001 CR11CR10CR9CR8CR7CR6CR5CR4CR3CR2CR1CR0
  210.   uint temp;
  211.   
  212.   temp=Character;
  213.   temp|=0x9000;
  214.   
  215.   OsdICSendTwoByte(temp);
  216. }
  217. /************写一个汉字的点阵数据到CRAM*************/
  218. void OsdRamCharacter(uint CharacterBuf[18])
  219. {
  220.   uchar i;
  221.   
  222.   OsdRamData(0);
  223.   for(i=0;i<17;i++)
  224.   OsdRamData(CharacterBuf[i]);
  225.   
  226. }
  227. /************写等待界面点阵数据到RAM*************/
  228. void OsdWaitRam(void)
  229. {
  230.   uchar i,x;
  231.   uchar j;  
  232.   uint xdata CharacterBuf[18];
  233.   
  234.   OsdRamAddress(0,0);
  235.   
  236.   for(i=0;i<5;i++)
  237.   {
  238.     for(j=0;j<18;j++)
  239.     {
  240.       x=HZKTab[i][j*2];
  241.       CharacterBuf[j]=x*256+HZKTab[i][j*2+1];
  242.     }
  243.     OsdRamCharacter(CharacterBuf);
  244.   }
  245. }
  246. /************写系统配置界面点阵数据到RAM*************/
  247. void OsdInfoRam(void)
  248. {
  249.   uchar i,x;
  250.   uchar j;  
  251.   uint  CharacterBuf[18];
  252.   
  253.   OsdRamAddress(0,0);
  254.    
  255.   for(i=8;i<23;i++)
  256.   {
  257.     for(j=0;j<18;j++)
  258.     {
  259.       x=HZKTab[i][j*2];
  260.       CharacterBuf[j]=x*256+HZKTab[i][j*2+1];
  261.     }
  262.     OsdRamCharacter(CharacterBuf);
  263.   }
  264. }
  265. /************写调预置位界面点阵数据到RAM1*************
  266. void OsdCallPresetRam(void)
  267. {
  268.   uchar i,x;
  269.   uchar j;  
  270.   uint  xdata CharacterBuf[18];
  271.   
  272.   OsdRamAddress(0,0);
  273.    
  274.   for(i=0;i<11;i++)
  275.   {
  276.     for(j=0;j<18;j++)
  277.     {
  278.       x=HZKTab[TabCallPresetRam[i]][j*2];
  279.       CharacterBuf[j]=x*256+HZKTab[TabCallPresetRam[i]][j*2+1];
  280.     }
  281.     OsdRamCharacter(CharacterBuf);
  282.   }
  283. }
  284. /*************************************/
  285. void Osd3BitDis(uchar num)
  286. {   
  287.     uchar temp;
  288.    
  289.     temp=num%100;
  290.     OsdCharDis(0,num/100);        
  291.     OsdCharDis(0,temp/10);
  292.     OsdCharDis(0,temp%10);
  293. }
  294. /************写主菜单界面点阵数据到RAM*************/
  295. void OsdMainMenuRam(void)
  296. {
  297.   uchar i,x;
  298.   uchar j;  
  299.   uint CharacterBuf[18];
  300.   
  301.   OsdRamAddress(0,0);
  302.    
  303.   for(i=0;i<16;i++)
  304.   {
  305.     for(j=0;j<18;j++)
  306.     {
  307.       x=HZKTab[TabMainMenuRam[i]][j*2];
  308.       CharacterBuf[j]=x*256+HZKTab[TabMainMenuRam[i]][j*2+1];
  309.     }
  310.     OsdRamCharacter(CharacterBuf);
  311.   }
  312. }
  313. /************写各级菜单界面点阵数据到RAM2*************/
  314. void OsdWhriteRam(uchar num,uchar TabRam[])
  315. {
  316.   uchar i,x;
  317.   uchar j;  
  318.   uint  CharacterBuf[18];
  319.   
  320.   OsdRamAddress(0,0);
  321.    
  322.   for(i=0;i<num;i++)
  323.   {
  324.     for(j=0;j<18;j++)
  325.     {
  326.       x=HZKTab[TabRam[i]][j*2];
  327.       CharacterBuf[j]=x*256+HZKTab[TabRam[i]][j*2+1];
  328.     }
  329.     OsdRamCharacter(CharacterBuf);
  330.   }
  331. }
  332. /*****************系统自检显示********************/
  333. void OsdPowWait(void)
  334. {   
  335.     uchar i;
  336.     OsdInitDis();                        //清屏初始化
  337.     delay(600);
  338. switch(OsdKeyOpt.Language)
  339. {
  340. case 0:   
  341.     OsdWaitRam();                       //写等待界面点阵数据到Ram   
  342.     OsdICScreenPos(6,6);                //屏幕位置
  343.     delay(60);
  344.     OsdCharDisPos(5,4);                    //字符位置
  345.         
  346.     for(i = 0;i < 15;i++)
  347.     {   
  348.         OsdCharDis(0,OSDWAIT_TAB[i]);   //在屏幕显示“系统自检中”
  349.     }
  350.     break;
  351. case 1:        
  352.     OsdICScreenPos(6,6);                //屏幕位置
  353.     delay(60);
  354.     OsdCharDisPos(5,4);                    //字符位置
  355.         
  356.     for(i = 0;i < 15;i++)
  357.     {   
  358.         OsdCharDis(0,ENOSDWAIT_TAB[i]);   //在屏幕显示“系统自检中”
  359.     }
  360.     break;
  361. default: break;
  362. }        
  363.     delay(600);
  364. }
  365. /**************显示初始化信息*****************/
  366. void OsdInforDis(void)
  367. {   
  368.     uchar j;
  369.    
  370.     OsdInitDis();            //初始化   
  371.     delay(200);
  372. switch(OsdKeyOpt.Language)
  373. {
  374. case 0:     
  375.     OsdInfoRam();           //写系统配置点阵到RAM
  376.    
  377.     OsdICScreenPos(6,6);    //屏幕位置
  378.     delay(20);
  379.     OsdCharDisPos(2,2);
  380.     for(j=0;j<15;j++)
  381.     {   
  382.         OsdCharDis(0,OSDCAMERAID[j]);
  383.     }
  384.     if(DipSwOpt.Softcamid == 0)Osd3BitDis(DipSwOpt.camid);
  385.     else Osd3BitDis(DipSwOpt.Softcamid);

  386.     OsdCharDisPos(4,2);
  387.     for(j=0;j<10;j++)
  388.     {   
  389.         OsdCharDis(0,OSDBAUDRATE[j]);
  390.     }
  391.    
  392.     for(j=0;j<8;j++)
  393.     {   
  394.         OsdCharDis(0,OSDBAUDRATE_VALUE[DipSwOpt.baudrat][j]);
  395.     }
  396.    
  397.     OsdCharDisPos(6,2);
  398.     for(j = 0; j < 9; j++)
  399.     {   
  400.         OsdCharDis(0,OSDPROTOCOL[j]);
  401.     }
  402.    
  403.     for(j = 0; j < 9; j++)
  404.     {   
  405.         OsdCharDis(0,OSDPROTOCOL_VALUE[j]);
  406.     }
  407.    
  408.     OsdCharDisPos(8,2);
  409.     for(j=0;j<18;j++)
  410.     {   
  411.         OsdCharDis(0,OSDVER[j]);
  412.     }
  413. break;
  414. case 1:     
  415.     OsdICScreenPos(6,6);    //屏幕位置
  416.     delay(20);
  417.     OsdCharDisPos(2,2);
  418.     for(j=0;j<15;j++)
  419.     {   
  420.         OsdCharDis(0,ENOSDCAMERAID[j]);
  421.     }
  422.     if(DipSwOpt.Softcamid == 0)Osd3BitDis(DipSwOpt.camid);
  423.     else Osd3BitDis(DipSwOpt.Softcamid);

  424.     OsdCharDisPos(4,2);
  425.     for(j=0;j<10;j++)
  426.     {   
  427.         OsdCharDis(0,ENOSDBAUDRATE[j]);
  428.     }
  429.    
  430.     for(j=0;j<8;j++)
  431.     {   
  432.         OsdCharDis(0,OSDBAUDRATE_VALUE[DipSwOpt.baudrat][j]);
  433.     }
  434.    
  435.     OsdCharDisPos(6,2);
  436.     for(j = 0; j < 18; j++)
  437.     {   
  438.         OsdCharDis(0,ENOSDPROTOCOL[j]);
  439.     }

  440.     OsdCharDisPos(8,2);
  441.     for(j=0;j<18;j++)
  442.     {   
  443.         OsdCharDis(0,ENOSDVER[j]);
  444.     }
  445. break;
  446. default: break;
  447. }
  448.     OsdMenuOpt.inforflag = 1;
  449.     OsdMenuOpt.enterflag = 0;
  450.     OsdMenuOpt.osdflag= 1;
  451.     OsdMenuOpt.swflag = 0;
  452.     OsdMenuOpt.ymstat=0;   //页面指针指向第一页
  453.     OsdMenuOpt.gbstat=0;   //光标指针指向第一行
  454.     TimeOpt.displaytime=0; //置位清屏时间
  455.     OsdKeyOpt.AngleFlag=1; //角度显示标志
  456. }
复制代码


回复

使用道具 举报

ID:230975 发表于 2019-9-19 09:38 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

ID:110630 发表于 2019-10-21 12:31 来自手机 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:214792 发表于 2023-8-9 20:42 | 显示全部楼层
字库还不懂,能否提供一下字库或者整个工程参考一下谢谢
回复

使用道具 举报

ID:688460 发表于 2023-12-28 21:18 | 显示全部楼层
能提供完整的程序,我给你奖励200黑币, 谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表