找回密码
 立即注册

QQ登录

只需一步,快速开始

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

16*32LED点阵的51单片机源码和原理图

[复制链接]
跳转到指定楼层
楼主
这是原理图

下载:
16X32点阵源码51.zip (56.44 KB, 下载次数: 49)

单片机程序源码:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define  DATAOUT P1    //P3 use as data,  you can change
  4. #define  SPEED  13

  5. void ymove(char dir,unsigned char *ptr,char speed);
  6. //void xmove(char dir,unsigned char *ptr,char n,char speed);
  7. void delay(unsigned int a);
  8. void display();
  9. void displaytime(char time);
  10. void init164();
  11. void kong(char dir, char speed);
  12. void fanzhuan(unsigned char  *p);
  13. sbit  ADATA= DATAOUT^1;//DS
  14. sbit  ASCK=  DATAOUT^2;//SCK
  15. sbit  LATCH= DATAOUT^3;//LATCH
  16. sbit  BDATA= DATAOUT^4;//RDATA
  17. sbit  BCLK=  DATAOUT^6;//CLK

  18. sbit K1 =P0^0;
  19. sbit K2 =P0^1;
  20. sbit K3 =P0^2;
  21. //OE接低电平
  22. //MR接高电平
  23. //CLR接高电平
  24. unsigned char  idata buffer[64];
  25. unsigned char   bigbuffer[194];
  26. unsigned char   comm_len;
  27. unsigned char   BSBUF=0;
  28. unsigned char iii;                //全局当前显示第几个字

  29. void Delay10ms()                //@11.0592MHz
  30. {
  31.         unsigned char i, j;

  32.         i = 18;
  33.         j = 235;
  34.         do
  35.         {
  36.                 while (--j);
  37.         } while (--i);
  38. }


  39. void UART_Init(void)//串口初始化函数
  40. {
  41.         SCON=0X50; //串口方式1,允许接收
  42.     TMOD|=0X20; //定时器1 定时方式2  T0 is mode 1\

  43.         TH1=0xfd;       //Baud:9600  fosc=11.0592MHz
  44.         TL1=0xfd;  

  45.     TR1=1;    //启动定时器
  46.    
  47.         ES = 1;                //开串口中断
  48.         EA = 1;                //开总中断

  49. }       



  50. void main(void)
  51. {
  52.         unsigned char i;

  53.         init164();
  54.         UART_Init();
  55.         for(i=0;i<194;i++)
  56.         {
  57.         bigbuffer[i]=0x00;
  58.         }



  59.         //fanzhuan(&bigbuffer[1]);
  60.   //for(i=0;i<32;i++)
  61. //        buffer[i+32]=buffer[i];
  62.         while(1)
  63.         {
  64.         if(bigbuffer[0]==0x16)
  65.         {
  66.         for(iii=0;iii<bigbuffer[1];iii++)
  67.         {
  68.           ymove(1,&bigbuffer[2+iii*32],SPEED);
  69.         }
  70.         }
  71.         else  if(bigbuffer[0]==0x15)
  72.         for(iii=0;iii<bigbuffer[1];iii++)
  73.         {
  74.           ymove(0,&bigbuffer[2+iii*32],SPEED);
  75.         }
  76.         else
  77.         display();
  78.         }
  79. }
  80. /*************  子函数   ******************/
  81. void delay(unsigned int a)        //延时函数
  82. {
  83.         while(a--);
  84. }
  85. void fanzhuan(unsigned char  *p)
  86. {
  87. unsigned char i,j,k,temp,*w,temp1,temp2,temp3;                                                                  
  88. w=p;
  89. for(i=0;i<8;i++) //左下角的8*8 翻转后位于左上角
  90. {
  91. temp=0x00;
  92.   for(j=0;j<8;j++)
  93.   {
  94.          temp1= *(p+30-j*2) ;
  95.          temp2=temp1<<i;
  96.          temp3=temp2&0x80;
  97.          temp3=temp3>>j;
  98.          temp=temp|temp3;

  99.   
  100.   }
  101.   buffer[i*2]=temp;
  102. }
  103. for(i=0;i<8;i++) //左上角的8*8         反转后位于右上角
  104. {
  105. temp=0x00;
  106.   for(j=0;j<8;j++)
  107.   {
  108.          temp1= *(p+14-j*2);
  109.          temp2=temp1<<i;
  110.          temp3=temp2&0x80;
  111.          temp3>>=j;
  112.          temp|=temp3;
  113.   }
  114.   buffer[i*2+1]=temp;
  115. }

  116. for(i=0;i<8;i++) //右上角的8*8         反转后位于右下角
  117. {
  118. temp=0x00;
  119.   for(j=0;j<8;j++)
  120.   {
  121.          temp1= *(p+15-j*2);
  122.          temp2=temp1<<i;
  123.          temp3=temp2&0x80;
  124.          temp3>>=j;
  125.          temp|=temp3;
  126.   }
  127.   buffer[i*2+17]=temp;
  128. }
  129. for(i=0;i<8;i++) //右下角的8*8         反转后位于左下角
  130. {
  131. temp=0x00;
  132.   for(j=0;j<8;j++)
  133.   {
  134.          temp1= *(p+31-j*2);
  135.          temp2=temp1<<i;
  136.          temp3=temp2&0x80;
  137.          temp3>>=j;
  138.          temp|=temp3;
  139.   }
  140.   buffer[i*2+16]=temp;
  141. }
  142. }

  143. /*显示*/


  144. void display()        //显示buffer里32*16的数据
  145. {
  146.         unsigned char hang,ib,k,tmp;

  147.     DATAOUT= 0x0;
  148.         BDATA = 1 ;
  149.         for(hang=0;hang<16;hang++)
  150.         {
  151.                 ASCK =0;               
  152.                 LATCH=0;
  153.                 BCLK =0;
  154.                 for(ib=0;ib<2;ib++)
  155.                 {
  156.                         tmp = buffer[hang*2+ib];
  157.                         for(k=0;k<8;k++)
  158.                         {
  159.                                 tmp <<=1;
  160.                                 ASCK  =0;
  161.                                 ADATA =CY;
  162.                                 ASCK  =1;
  163.                         }


  164.                 }
  165.                                 for(ib=0;ib<2;ib++)
  166.                 {
  167.                         tmp = buffer[hang*2+ib+32];
  168.                         for(k=0;k<8;k++)
  169.                         {
  170.                                 tmp <<=1;
  171.                                 ASCK  =0;
  172.                                 ADATA =CY;
  173.                                 ASCK  =1;
  174.                         }


  175.                 }
  176.                 //DATAOUT|=0x14;
  177.                 LATCH=1;
  178.                 BCLK=1;
  179.                 BDATA=0;
  180.        
  181.         }
  182.         delay(64);
  183.         ASCK =0;
  184.         ASCK =1;
  185. }

  186. void displaytime(char time)                //循环刷新显示
  187. {
  188.         unsigned char i;
  189.         while(time--)
  190.         {
  191.                 i=130;
  192.                 while(i--)
  193.                          display();
  194.         }
  195. }

  196. /*74ls164,74ls595的初始化*/

  197. void init164()
  198. {

  199.         char i;
  200.         BDATA=0;
  201.         for(i=0;i<16;i++)  //清空164
  202.         {
  203.                 BCLK =0;
  204.                 BCLK =1;
  205.         }


  206.         for(i=0;i<32;i++)        //清空595
  207.         {
  208.                        
  209.                 ASCK  =0;
  210.                 ADATA =0;
  211.                 ASCK  =1;
  212.         }
  213. }

  214. /*左右移动*/
  215. void ymove(char dir,unsigned char *ptr, char speed)
  216. {                   //dir=1左移动,dir=0为右移动
  217.         char i=0, j=0, ib=0;
  218.         unsigned int  tmp=0, speedm=0;

  219.         if(dir==0)      
  220.         {       
  221.    /****  向右移  ****/
  222.                 ib=31;               
  223.                 for(i=16;i>0;i--)   //下移16行
  224.                 {               
  225.                         for(j=61;j>-1;j--)
  226.                                 buffer[j+2]=buffer[j];        //将上一行的内容复制到下一行
  227.        
  228.                         if(ptr==0)
  229.                         {                                //移空时,buffer的首行用0移入
  230.                                 buffer[0]=0;
  231.                                 buffer[1]=0;
  232.                         }
  233.                         else
  234.                         {                                //否则,处理buffer的首行元素               
  235.                             buffer[1]=ptr[ib];
  236.                                 buffer[0]=ptr[ib-1];
  237.                                 ib=ib-2;
  238.                         }
  239.                         speedm=speed;       
  240.                         while(speedm--)          //更新点阵
  241.                                 display();
  242.                 }
  243.         }

  244. /****** 向左移 *******/
  245.         else
  246.         {                       
  247.                 ib=0;          //数组元素序号
  248.                 for(i=0;i<16;i++)    //上移16行
  249.                 {                               
  250.                         for(j=0;j<62;j++)           //将下一行的内容复制到上一行
  251.                                 buffer[j]=buffer[j+2];

  252.                         if(ptr==0)        //移入为空,buffer的末行用0移入
  253.                         {                       
  254.                                 buffer[62]=0;
  255.                                 buffer[63]=0;
  256.                         }
  257.                         else
  258.                         {                        //否则,处理buffer的末行元素
  259.                                 buffer[62]=ptr[ib];
  260.                                 buffer[63]=ptr[ib+1];
  261.                                 ib=ib+2;                          
  262.                         }
  263.                         speedm=speed;        //更新点阵
  264.                         while(speedm--)
  265.                                 display();
  266.                    }
  267.            }                       
  268. }
  269. void kong(char dir, char speed)
  270. {                   //dir=1左移动,dir=0为右移动
  271.         char i=0, j=0, ib=0;
  272.         unsigned int  tmp=0, speedm=0;

  273.         if(dir==0)      
  274.         {       
  275.    /****  向左移  ****/
  276.                 ib=31;               
  277.                 for(i=8;i>0;i--)   //下移16行
  278.                 {               
  279.                         for(j=61;j>-1;j--)
  280.                                 buffer[j+2]=buffer[j];        //将上一行的内容复制到下一行
  281.        
  282.                                 buffer[0]=0;
  283.                                 buffer[1]=0;
  284.                         speedm=speed;       
  285.                         while(speedm--)          //更新点阵
  286.                                 display();
  287.                 }
  288.         }
  289. /****** 向右移 *******/
  290.         else
  291.         {                       
  292.                 ib=0;          //数组元素序号
  293.                 for(i=0;i<8;i++)    //上移16行
  294.                 {                               
  295.                         for(j=0;j<62;j++)           //将下一行的内容复制到上一行
  296.                                 buffer[j]=buffer[j+2];


  297.                                 buffer[62]=0;
  298.                                 buffer[63]=0;
  299.                                 ib=ib+2;                          
  300.                        
  301.                         speedm=speed;        //更新点阵
  302.                         while(speedm--)
  303.                                 display();
  304.                    }
  305.            }                       
  306. }
  307. void uart_get_int(void) interrupt  4//串口中断接收函数
  308. {
  309. unsigned char i,j,k;
  310. RI=0;

  311.   if(SBUF==0XEF&&BSBUF==0xFE)  //启始帧
  312.   {
  313.    comm_len=0;
  314.    return;

  315.   }
  316.   BSBUF=SBUF;

  317.    bigbuffer[comm_len]=SBUF;
  318.    comm_len++;

  319.          if(comm_len==194)        //所有数据接受完毕 串口发送数据 字模转换 主函数里面滚屏
  320.          {
  321.           comm_len=0;
  322.           if(bigbuffer[0]==11)return;
  323.           iii=bigbuffer[1]-1;
  324.       for(i=0;i<194;i++)
  325.           {     
  326.            SBUF= bigbuffer[i];
  327.            while(!TI);         
  328.             TI=0;
  329.       }

  330.           for(j=0;j<6;j++)//6个汉字的字模转换
  331.           {

  332.                   fanzhuan(&bigbuffer[2+j*32]);
  333.                 for(k=0;k<32;k++)
  334.                 {
  335.                  bigbuffer[2+j*32+k]=buffer[k];
  336.                 }
  337.           }
  338.      }
  339. }
  340. void saomiao()
  341. {
  342.         if(K1==0)
  343.         {
  344.         Delay10ms();
  345.         if(K1==0)
  346.         {
  347.          
  348.         }
  349.         }
  350. }

复制代码


评分

参与人数 1黑币 +5 收起 理由
WEIDADETG + 5 很给力!

查看全部评分

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

使用道具 举报

沙发
ID:237140 发表于 2018-1-16 08:42 | 只看该作者
很好,谢谢!
回复

使用道具 举报

板凳
ID:267393 发表于 2018-1-16 11:15 | 只看该作者
如果有仿真的话希望楼主也一起放上来,谢谢
回复

使用道具 举报

地板
ID:430280 发表于 2018-12-2 23:16 | 只看该作者
垃圾,没有一点用
回复

使用道具 举报

5#
ID:337540 发表于 2019-3-28 13:46 | 只看该作者
感谢楼主
回复

使用道具 举报

6#
ID:337540 发表于 2019-4-16 21:52 | 只看该作者
楼主,下载下来只有代码,原理图呢?
回复

使用道具 举报

7#
ID:514161 发表于 2019-4-16 23:06 来自手机 | 只看该作者
感谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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