找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6783|回复: 6
打印 上一主题 下一主题
收起左侧

32X64点阵资料大全 含原理图与各种单片机程序(汉字 频谱 时钟 上下位机)

  [复制链接]
跳转到指定楼层
楼主
32X64点阵资料此配套程序,都在控制上测试过,请放心使用!

由于是二手点阵屏,完全对应的原理图不好找到,为了方便大家理解其工作原理,发个标准的原理图供参考,方便学习交流用。


上位机字幕软件采用VB.NET编写,所以用此软件需先安装dotnet2.0平台 需要自己去下载  此程序的晶振是30M 下载波特率9600

资料里面包含:

3264点阵大字测试\
3264点阵测试\
32X64上位机软件与下位机程序\
32X64多功能时钟\
32X64点阵频谱程序\
点阵屏原理参考图\
逐行点亮测试\
静态显示字 3264点阵测试\
点阵控制卡原理图.pdf
说明.txt


单片机源程序如下:
  1. /****************************************
  2. 主控芯片;STC12C5A32S2  晶振:30M
  3. 通信波特率:9600
  4. 使用点阵屏 :32*64双色

  5. 程序实现功能:
  6. 通过上位机字幕软件生成的字幕数据下载到单片机内部的EEPROM
  7. 此款单片机内部有32K的EEPROM 所以可以存储较多的字
  8. 字幕软件可配置16*16 和32*32字体
  9. 其中 16*16字体可设置显示颜色 红 绿 黄 三种
  10. 可设置移动速度
  11. 移动方式目前只有一种左移 往后继续加
  12. 其他功能待开发
  13. 上位机使用见说明
  14. 欢迎大家做技术交流:QQ 77*971
  15. 手上有多片STC12C5A32S2最小系统版 如有需要 25元出售 板上40个IO全部引出 板载DS1302接口 DHT11温湿度接口 红外接收一体化头 4个独立按键
  16. 另外如需要2手32*64双色点阵屏的朋友可联系我

  17. 祝大家学习进步!
  18. *****************************************/
  19. #include "NEW_8051.H"
  20. #include "main.h"
  21. #define light 3                        //定义亮度
  22. uchar code hanzi[];                                            //汉字字模
  23. uchar code hanzi1[];                                            //汉字字模
  24.                                  //0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
  25. uchar code sw[16]={0X00,0X08,0x04,0x0C,0X02,0X0A,0X06,0X0E,0X01,0X09,0X05,0X0D,0X03,0X0B,0X07,0X0F};/*16行段码*///138驱动数据
  26. sbit IA  =P4^0;  //行控制线A
  27. sbit IB  =P2^0;  //行控制线B
  28. sbit IC  =P2^1;  //行控制线C
  29. sbit ID  =P2^2;  //行控制线D

  30. #define  scan0    {IA=0;IB=0;IC=0;ID=0;}
  31. #define  scan1    {IA=1;IB=0;IC=0;ID=0;}
  32. #define  scan2    {IA=0;IB=1;IC=0;ID=0;}
  33. #define  scan3    {IA=1;IB=1;IC=0;ID=0;}
  34. #define  scan4    {IA=0;IB=0;IC=1;ID=0;}
  35. #define  scan5    {IA=1;IB=0;IC=1;ID=0;}
  36. #define  scan6    {IA=0;IB=1;IC=1;ID=0;}
  37. #define  scan7    {IA=1;IB=1;IC=1;ID=0;}
  38. #define  scan8    {IA=0;IB=0;IC=0;ID=1;}
  39. #define  scan9    {IA=1;IB=0;IC=0;ID=1;}
  40. #define scan10    {IA=0;IB=1;IC=0;ID=1;}
  41. #define scan11    {IA=1;IB=1;IC=0;ID=1;}
  42. #define scan12    {IA=0;IB=0;IC=1;ID=1;}
  43. #define scan13    {IA=1;IB=0;IC=1;ID=1;}
  44. #define scan14    {IA=0;IB=1;IC=1;ID=1;}
  45. #define scan15    {IA=1;IB=1;IC=1;ID=1;}




  46. sbit STR=P4^1;              //锁存         
  47. sbit SCK=P2^7;                    //时钟         
  48. sbit SERr1= P2^4;            //数据
  49. sbit SERg1= P2^6;




  50. sbit SERr= P2^3;
  51. sbit SERg= P2^5;        
  52. uchar Move,Speed,line;  //时间温度变量
  53. uint zimuo;                                   //字模计数器
  54. uchar BUFF[20];                                   //缓存
  55. uchar BUFF1[20];                                   //缓存
  56. uchar ucTimeOut;
  57. uchar i;
  58. uint uiBaseAddress=0;
  59. uint uiFontNumber=0;
  60. //void   DelayMs(void);              // 延时
  61. void   in_data();                                   // 调整移动数据
  62. void   rxd_data();                                   // 串口发送移动数据
  63. /******************************************************/
  64. uchar ucSetSpeed=0;
  65. uchar ucSpeed=3;
  66. uchar ucSetPlateNum=0;
  67. uchar ucPlateNum=0;
  68. uchar ucSetShowMode=0;
  69. uchar ucShowMode=0;
  70. uchar ucSetFontSize=0;
  71. uchar ucFontSize=0;
  72. uchar BuffCount=0;
  73. uchar ucSetFontColor=0;
  74. uchar ucFontColor=0;
  75. uchar DelayMs=0;
  76. uchar l=0;
  77. bit bDelayMsOver=0;
  78. uchar ucEEPArray=0;
  79. uchar ucUdateTime=0;
  80. void Send8Line();
  81. void Send16Line();
  82. void Send24Line();
  83. void Send32Line();
  84. void Load32();
  85. /*****不影响其他端口的扫描*************************/
  86. void scan(unsigned char Value)
  87. {switch(Value)
  88.         {case  15: scan0;break;
  89.                   case  0: scan1;break;
  90.                    case  1: scan2;break;
  91.                     case  2: scan3;break;
  92.              case  3: scan4;break;
  93.                       case  4: scan5;break;
  94.                        case  5: scan6;break;
  95.                         case  6: scan7;break;
  96.                  case  7: scan8;break;
  97.                        case  8: scan9;break;
  98.                       case 9:scan10;break;
  99.                      case 10:scan11;break;
  100.             case 11:scan12;break;
  101.                   case 12:scan13;break;
  102.                  case 13:scan14;break;
  103.             case 14:scan15;break;
  104.            default:break;
  105.         }
  106. }
  107. /*************************/
  108. void DelayMss(void)
  109. {
  110.   uchar TempCyc;
  111.   for(TempCyc=150;TempCyc>1;TempCyc--)
  112.      {;}
  113. }
  114. /**************************延时***********************/
  115. void InitTimer0(void)
  116. {
  117.     TMOD|= 0x01;
  118.     TH0 = 0x0C4;
  119.     TL0 = 0x00;
  120.     EA = 1;
  121.     ET0 = 1;
  122.     TR0 = 1;
  123. }
  124. /***********************************/
  125. void Send_data(unsigned char d)          /*从串口发送数据*/
  126. {
  127.           ES=0;
  128.       SBUF=d;
  129.           while(TI==0);       //等待发送完毕
  130.       TI=0;
  131.           ES=1;
  132. }
  133. /*****************************************/
  134. void Timer0Interrupt(void) interrupt 1
  135. {
  136.     TH0 = 0x0C4;
  137.     TL0 = 0x00;
  138.         if( ucTimeOut )
  139.         {
  140.                 ucTimeOut--;
  141.                 if( !ucTimeOut )
  142.                 {
  143.                         //bEanle=0;
  144.                         LED4=1;
  145.                 }
  146.                         
  147.         }
  148.         if(ucUdateTime)
  149.         {
  150.                 ucUdateTime--;
  151.                 if(!ucUdateTime)
  152.                 {
  153.                                        
  154.                         //uiBaseAddress=0;
  155.                         //bEanle=0;
  156.                         
  157.                 }
  158.         }
  159.         
  160. /**************************************/
  161.    
  162. }
  163. /****************************************/
  164. void LED_Display(void)
  165. {
  166.         ucSetPlateNum=byte_read(0x0003);//读取EEPROM里设置的点阵屏块数量(32*64一块)
  167.         switch ( ucSetPlateNum )
  168.         {
  169.         case 0X01:
  170.                 ucPlateNum=8; //1块
  171.                 break;
  172.         case 0X02:
  173.                 ucPlateNum=16; //2块
  174.                 break;
  175.         case 0X03:
  176.                 ucPlateNum=24;//3块
  177.                 break;
  178.         case 0X04:
  179.                 ucPlateNum=32;//4块
  180.                 break;
  181.         case 0X05:
  182.                 ucPlateNum=40;        //5块
  183.                 break;
  184.         default:
  185.                 ucPlateNum=8;        //1块
  186.                 break;
  187.         }
  188. /***********************************/




  189.   ucSetShowMode=byte_read(0x0004); //显示方式
  190.   switch ( ucSetShowMode )
  191.    {
  192.            case 0X01:
  193.                 ucShowMode=1;  //左移
  194.                 break;
  195.         case 0X02:
  196.                 ucShowMode=2; //右移
  197.                 break;
  198.         case 0X03:
  199.                 ucShowMode=3;
  200.                 break;
  201.         case 0X04:
  202.                 ucShowMode=4;
  203.                 break;
  204.         case 0X05:
  205.                 ucShowMode=5;
  206.                 break;
  207.         default:
  208.                 ucShowMode=2;
  209.                 break;
  210.         }
  211. /***********************************/

  212. ucSetSpeed=byte_read(0x0000); //移动速度
  213.   switch ( ucSetSpeed )
  214.    {
  215.            case 0X01:
  216.                 ucSpeed=2;
  217.                 break;
  218.         case 0X02:
  219.                 ucSpeed=4;
  220.                 break;
  221.         case 0X03:
  222.                 ucSpeed=6;
  223.                 break;
  224.         case 0X04:
  225.                 ucSpeed=8;
  226.                 break;
  227.         case 0X05:
  228.                 ucSpeed=10;
  229.                 break;
  230.         default:
  231.                 ucSpeed=5;
  232.                 break;
  233.         }
  234. /********************************************/
  235. ucSetFontSize=byte_read(0x0001); //字体大小
  236.   switch ( ucSetFontSize )
  237.    {
  238.            case 0X01:
  239.                 ucFontSize=16;
  240.                 break;
  241.         case 0X02:
  242.                 ucFontSize=32;
  243.                 break;
  244.         default:
  245.                 ucFontSize=16;
  246.                 break;
  247.         }
  248. /**************************************************/
  249. ucSetFontColor=byte_read(0x0002); //字体颜色
  250.   switch ( ucSetFontColor )
  251.    {
  252.            case 0X01:
  253.                 ucFontColor=1;         //红
  254.                 break;
  255.         case 0X02:
  256.                 ucFontColor=2; //绿
  257.                 break;
  258.         case 0X03:
  259.                 ucFontColor=3; //黄
  260.                 break;
  261.         default:
  262.                 ucFontColor=1;
  263.                 break;
  264.         }
  265. uiFontNumber=(byte_read(0x0100)<<8)+byte_read(0x0101);
  266. }




  267. /*主函数*/
  268. void main()
  269. {  
  270.    InitTimer0();
  271.    uart_init();
  272.    Move=0;
  273.    zimuo=0;
  274.    LED_Display();




  275.    //uart_rBIT=1;   
  276. /*******************************************/

  277. while(1)  
  278. {
  279.         while(zimuo<uiFontNumber+64)
  280.         {




  281.                 //if( !bEanle ) //下载数据和设置屏参数时不显示信息
  282.                         //{
  283.                 if(ucShowMode==0x01)
  284.                 {
  285.                         while(Move<ucFontSize)        //数据移位。
  286.                         {                        
  287.                                         for(Speed=0;Speed<ucSpeed;Speed++) //移动速度
  288.                                         {        
  289.                                                 for(line=0;line<16;line++)
  290.                                                 {
  291.                                                         in_data();                //调整移动数据
  292.                                                         rxd_data();
  293.                                                 //        P0=sw[line];  
  294.                                                         scan(line);                                                                     
  295.                                                         STR=1;//锁存
  296.                                                         STR=0;
  297.                                                         STR=1;
  298.                                                         DelayMss();         //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。                                                                                
  299.                                                 }
  300.                                         }
  301.                                 
  302.                 /****************************************************/
  303.                         l++;
  304.                                 if(l==16)l=0;
  305.                                 Move++;                                                 //移动一步
  306.                         }
  307.                            Move=0;
  308.                         if(ucFontSize==32)
  309.                     {
  310.                                 zimuo=zimuo+128;                                
  311.                     }
  312.                         else
  313.                         {
  314.                                 zimuo=zimuo+32;
  315.                         }
  316.                 }                                       
  317. /**********************************************************/        
  318.                         else if(ucShowMode==0x02)
  319.                                 {
  320.                                         for(i=0;i<32;i++)
  321.                                         {
  322.                                         for(Speed=0;Speed<16;Speed++) //移动速度
  323.                                         {
  324.                                                 for(line=0;line<16;line++)
  325.                                                  {
  326.                                                         in_data();//调整移动数据
  327.                                                         if((i<=15)&&(line<=i))                                                                                                        
  328.                                                         Send8Line();
  329.                                                         else
  330.                                                         Send16Line();                                                        
  331.                                                         if(i>15)
  332.                                                         {
  333.                                                                 if(line<=(i-15))
  334.                                                                  {
  335.                                                                    Send24Line();                        
  336.                                                                  }
  337.                                                                else
  338.                                                               {
  339.                                                                  Send32Line();        
  340.                                                               }        
  341.                                                         }
  342.                                                                 STR=1;//锁存
  343.                                                                 STR=0;
  344.                                                                 STR=1;
  345.                                                                 //P0 =sw[line];
  346.                                                                 if(i>15)
  347.                                                                  {
  348.                                                                          if(i-15>line)
  349.                                                                         P0 =sw[i-15-line];
  350.                                                                         else
  351.                                                                         P0=sw[line+15-i];
  352.                                                                  }
  353.                                                                  //P0= sw[line];
  354.                                                                  else
  355.                                                                  P0 =sw[i-line];
  356.                                                                           
  357.                                                 }
  358.                                                 DelayMss();
  359.                                                 }
  360.                                         }
  361. /********************************************************/
  362.                                         for(i=0;i<120;i++)
  363.                                         {                                                
  364.                                                 for(line=0;line<16;line++)
  365.                                                 {
  366.                                                         Load32();
  367.                                                         Send24Line();
  368.                                                         STR=1;//锁存
  369.                                                         STR=0;
  370.                                                         STR=1;
  371.                                                         P0 =sw[line];
  372.                                                 }
  373.                                                          
  374.                                         }
  375.                                         //zimuo=zimuo+256;        
  376.                                 }
  377.                         
  378.         }
  379.         zimuo=0;
  380.         }
  381. }
  382. /*********************************************************/
  383. void Send8Line()
  384. {
  385.         uchar k,i;
  386.         SERg=SERg1=1;
  387.         for(i=0;i<8;i++)
  388.         {
  389.                  for(k=0;k<8;k++)
  390.                {
  391.                               SCK=0;           
  392.                            SERr=(bit)(BUFF1[i]&0x01);//这里SERr定义成普通IO口就得了
  393.                        BUFF1[i]=BUFF1[i]>>1;
  394.                            SERr1=1;                           
  395.                        SCK =1;
  396.               }        
  397.         }
  398. }
  399. /*********************************************************/
  400. void Send16Line()
  401. {
  402.         uchar k,i;
  403.         SERg=1;
  404.         SERg1=1;
  405.         for(i=0;i<8;i++)
  406.         {
  407.                  for(k=0;k<8;k++)
  408.                {
  409.                               SCK=0;           
  410.                            SERr=1;//这里SERr定义成普通IO口就得了
  411.                        SERr1=1;                           
  412.                        SCK=1;
  413.               }        
  414.           }        
  415. }
  416. /*********************************************************/
  417. void Send24Line()
  418. {
  419.         uchar k,i;
  420.          SERg=SERg1=1;
  421.         for(i=0;i<8;i++)
  422.         {
  423.                  for(k=0;k<8;k++)
  424.                {
  425.                               SCK=0;           
  426.                            SERr=(bit)(BUFF[i]&0x01);//这里SERr定义成普通IO口就得了
  427.                        BUFF[i]=BUFF[i]>>1;
  428.                            SERr1=(bit)(BUFF1[i]&0x01);  //这里SERr定义成普通IO口就得了
  429.                        BUFF1[i]=BUFF1[i]>>1;                           
  430.                        SCK=1;
  431.               }        
  432.          }        
  433. }
  434. /********************************************************/
  435. void Send32Line()
  436. {
  437.         uchar k,i;
  438.         SERg=SERg1=1;
  439.         for(i=0;i<8;i++)
  440.         {
  441.                  for(k=0;k<8;k++)
  442.                {
  443.                               SCK=0;           
  444.                            SERr=(bit)(BUFF[i]&0x01);//这里SERr定义成普通IO口就得了
  445.                        BUFF[i]=BUFF[i]>>1;
  446.                            SERr1=1;                           
  447.                        SCK =1;
  448.               }        
  449.         }        
  450. }        
  451. void Load32()
  452. {        
  453.         char s;
  454.         for(s=2;s>=0;s--) //i为向后先择字节计数器,zimuoo为向后先字计数器
  455.         {
  456.                  BUFF[4*s]=byte_read(0x200+zimuo+128*s+4*line);
  457.                  BUFF[4*s+1]=byte_read(0x200+zimuo+1+128*s+4*line);
  458.                  BUFF[4*s+2]=byte_read(0x200+zimuo+2+128*s+4*line);
  459.                  BUFF[4*s+3]=byte_read(0x200+zimuo+3+128*s+4*line);




  460.                  BUFF1[4*s]=byte_read(0x200+zimuo+128*s+4*line+64);
  461.                  BUFF1[4*s+1]=byte_read(0x200+zimuo+1+128*s+4*line+64);
  462.                  BUFF1[4*s+2]=byte_read(0x200+zimuo+2+128*s+4*line+64);
  463.                  BUFF1[4*s+3]=byte_read(0x200+zimuo+3+128*s+4*line+64);
  464.         }
  465. }         
  466. /**********************************************************/
  467. void in_data(void)                                       //调整数据
  468. {
  469.           char s;   
  470.         if(ucShowMode==0x01)//左移
  471.         {
  472.                  if( ucFontSize==16 )//如果字体是16*16
  473.                  {
  474.                          for(s=8;s>=0;s--)                                            //i为向后先择字节计数器,zimuoo为向后先字计数器
  475.                          {
  476.                                  BUFF[2*s+1]=byte_read(0x200+zimuo+1+32*s+2*line);            //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
  477.                                  BUFF[2*s]=byte_read(0x200+zimuo+32*s+2*line);                //把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中
  478.                         
  479.                                  BUFF1[2*s+1]=byte_read(0x200+zimuo+1+32*s+2*line);            //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
  480.                                  BUFF1[2*s]=byte_read(0x200+zimuo+32*s+2*line);
  481.                          }
  482.                  }
  483.                 else if( ucFontSize==32 ) //如果字体是32*32
  484.                 {
  485.                         Load32();
  486.                 }
  487.         }
  488.         else if(ucShowMode==0x02)//右移
  489.         {
  490.                  if(ucFontSize==32)
  491.                  {
  492.                                  for(s=1;s>=0;s--) //i为向后先择字节计数器,zimuoo为向后先字计数器
  493.                                 {
  494.                                          BUFF[4*s]=byte_read(0x200+zimuo+128*s+4*(15-line));
  495.                                          BUFF[4*s+1]=byte_read(0x200+zimuo+1+128*s+4*(15-line));
  496.                                          BUFF[4*s+2]=byte_read(0x200+zimuo+2+128*s+4*(15-line));
  497.                                          BUFF[4*s+3]=byte_read(0x200+zimuo+3+128*s+4*(15-line));
  498.                         
  499.                                          BUFF1[4*s]=byte_read(0x200+zimuo+128*s+4*(15-line)+64);
  500.                                          BUFF1[4*s+1]=byte_read(0x200+zimuo+1+128*s+4*(15-line)+64);
  501.                                          BUFF1[4*s+2]=byte_read(0x200+zimuo+2+128*s+4*(15-line)+64);
  502.                                          BUFF1[4*s+3]=byte_read(0x200+zimuo+3+128*s+4*(15-line)+64);
  503.                                 }
  504.                 }        
  505.         }
  506. }




  507. /***********************发送移动的数据****************************/
  508. void rxd_data(void)                            //串行发送数据
  509. {
  510.   uchar s;
  511.   uchar inc,tempyid,temp,k,temp1;
  512.          if(Move<8)
  513.         {
  514.                 inc=0;
  515.         }
  516.         else if((Move>=8)&&(Move<16))
  517.         {
  518.                 inc=1;
  519.         }
  520.         else if((Move>=16)&&(Move<24))
  521. ……………………




  522. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-86070-1.html



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:138918 发表于 2017-8-10 19:37 | 只看该作者
好资料 果断收藏学习
回复

使用道具 举报

板凳
ID:336376 发表于 2019-5-29 12:01 | 只看该作者
很好的资料,谢谢楼主。
回复

使用道具 举报

地板
ID:353831 发表于 2020-1-11 21:51 | 只看该作者
楼主原理图中iO口需要上拉电阻吗?
回复

使用道具 举报

5#
ID:353831 发表于 2020-1-11 21:52 | 只看该作者
楼主iO口需上拉电阻吗?
回复

使用道具 举报

6#
ID:562099 发表于 2020-1-12 09:58 | 只看该作者
全彩屏75的接口怎么用你的程序测,B1 B2.不用接吗
回复

使用道具 举报

7#
ID:160514 发表于 2020-2-4 22:05 | 只看该作者
谢谢楼主,很好很好很好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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