找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机16X16点阵实现任意显示程序和仿真

[复制链接]
跳转到指定楼层
楼主
16X16点阵仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):



单片机源程序如下:
  1. #include <REG51.h>
  2. //#include <intrins.h>
  3. #define        uchar unsigned char
  4. #define        uint unsigned int
  5. uchar code bseg[16]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};//列驱动选码(低位)
  6. /*uchar SEGx[32]={0x08,0x24,0x88,0x33,0x78,0x2C,0x0F,0x23,
  7.                 0xC8,0x28,0x08,0x70,0x20,0x00,0xF8,0xFF,
  8.                 0x4F,0x22,0x48,0x22,0x49,0x22,0xFE,0x3F,
  9.                 0x48,0x22,0x48,0x22,0x08,0x20,0x00,0x00};/*"雄",0*/


  10. #if 0
  11. uchar SEGx[32]={0x00,0x00,0xFC,0x07,0x44,0x04,0x44,0x04,
  12.                 0x44,0x04,0xFC,0x07,0x10,0x00,0x90,0x00,
  13.                 0x10,0x03,0x10,0x40,0x10,0x80,0xFF,0x7F,
  14.                 0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00};/*"时",0*/
  15. #endif

  16. uchar code SEG1[32]={0x00,0x01,0x80,0x40,0x60,0x40,0x1E,0x41,0x10,0x41,0x10,0x41,0x10,0x41,0x10,0x41,
  17. 0xFF,0x7F,0x12,0x41,0x10,0x41,0x10,0x41,0x98,0x41,0x10,0x61,0x00,0x40,0x00,0x00};//"生",0

  18. uchar code SEG2[32]={0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,
  19. 0x42,0x10,0x42,0x10,0x42,0x10,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//"日",1

  20. uchar code SEG3[32]={0x70,0x00,0x00,0x00,0xFF,0xFF,0x08,0x00,0xB0,0x80,0x88,0x40,0x88,0x30,0x88,0x0E,
  21. 0xFF,0x01,0x88,0x06,0x88,0x08,0x88,0x30,0xF8,0x60,0x80,0xC0,0x80,0x40,0x00,0x00};//"快",2

  22. uchar code SEG4[32]={0x00,0x00,0x00,0x20,0x40,0x18,0xFC,0x0C,0x44,0x07,0x44,0x12,0x44,0x20,0x46,0x40,
  23. 0xFA,0x3F,0x42,0x00,0x43,0x00,0x43,0x02,0x42,0x0C,0x40,0x38,0x00,0x10,0x00,0x00};//"乐",3

  24. //uint SEGx2[16]={0x0001};

  25. sbit LEDshclk=P2^0;
  26. sbit LEDdata=P2^1;
  27. sbit LEDstclk=P2^2;

  28. void delay(void)               
  29. {                                       
  30.         unsigned int i,j;               
  31.         for(i=0;i<1;i++)               
  32.         {                                
  33.                 for(j=0;j<5;j++)
  34.                 {;}                        
  35.         }                                
  36. }
  37. void delay200ms()//误差0.000000 us
  38. {
  39.   unsigned char i=0,j=0,k=0;
  40.   for(i=5;i>0;i--)
  41.     for(j=132;j>0;j--)
  42.     for(k=150;k>0;k--);
  43. }
  44. void delay1ms(uchar t)//误差0.000000 us
  45. {
  46.   unsigned char i=0,j=0,m=0;
  47.         for(m=t;m>0;m--)
  48.   for(i=5;i>0;i--)
  49.     for(j=98;j>0;j--);
  50. }
  51. void delay1s()//误差1.000000 us
  52. {
  53.   unsigned char i=0,j=0,k=0;
  54.   for(i=23;i>0;i--)
  55.     for(j=185;j>0;j--)
  56.     for(k=116;k>0;k--);
  57. }        
  58. void hc164send(uchar c)
  59. { uchar temp;
  60. for(temp=0;temp<8;temp++)
  61.     {
  62.          if(c &0x80)
  63.              LEDdata = 1;
  64.            else  LEDdata = 0;

  65.            LEDshclk=0;
  66.            delay();
  67.            LEDshclk=1;
  68.            delay();
  69.            c<<=1;
  70.     }
  71. }
  72. void hc595out(void )
  73. {LEDstclk=0;
  74.   delay();
  75.   LEDstclk=1;
  76.   delay();
  77.   }


  78. void disp_one_port(uchar x,uchar y,uchar value/*1:亮*/)
  79. {

  80.         if(value==1)
  81.         {
  82.                 if(x<8)
  83.                 {
  84.                         hc164send(0x00);
  85.                         hc164send(1<<x);
  86.                 }
  87.                 else
  88.                 {
  89.                         hc164send(1<<(x%8));
  90.                         hc164send(0x00);
  91.                 }
  92.         }
  93.         else
  94.         {
  95.                         hc164send(0x00);
  96.                         hc164send(0x00);
  97.         }
  98.                 P1=bseg[y];//选择列

  99.         hc595out();
  100.         delay();
  101. }

  102. void disp_section_port(uchar x,uchar y,uchar type)
  103. {
  104.         uchar i=0,j=0;
  105.         uint temp1=0,temp2=0;
  106.         if((type==0)||(type==2)||(type==3))
  107.         {
  108.                 for(j=0;j<=x;j++)
  109.                 {
  110.                         
  111.                         temp1|=(1<<j);
  112.                         if(j!=x)
  113.                                 temp2|=(1<<j);
  114.                 }
  115.         }
  116.         else if(type==1)
  117.         {
  118.                 temp1=0xffff;
  119.                 temp2=0xffff;
  120.                 for(j=0;j<=x;j++)
  121.                 {
  122.                         temp1&=(~(1<<j));
  123.                         if(j!=x)
  124.                                 temp2&=(~(1<<j));

  125.                 }
  126.                 if((x==0)&&(y==0))
  127.                 {
  128.                         temp1=0xffff;                        
  129.                         temp2=0xffff;        
  130.                 }
  131.         }
  132.                
  133.         for(i=0;i<16;i++)
  134.         {
  135.                 if(i<=y)
  136.                 {
  137.                         if(type==2)
  138.                         {
  139.                                 if(i%2==0)
  140.                                 {
  141.                                         hc164send((temp1>>8)&0xff);
  142.                                         hc164send(temp1&0xff);
  143.                                 }
  144.                                 else
  145.                                 {
  146.                                         hc164send(0x00);
  147.                                         hc164send(0x00);
  148.                                 }
  149.                         }
  150.                         else if(type==3)
  151.                         {
  152.                                 if(i%2==1)
  153.                                 {
  154.                                         hc164send((temp1>>8)&0xff);
  155.                                         hc164send(temp1&0xff);
  156.                                 }
  157.                                 else
  158.                                 {
  159.                                         hc164send(0xff);
  160.                                         hc164send(0xff);
  161.                                 }
  162.                         }
  163.                         else
  164.                         {
  165.                                 hc164send((temp1>>8)&0xff);
  166.                                 hc164send(temp1&0xff);
  167.                         }
  168.                 }
  169.                 else
  170.                 {        
  171.                         if(type==2)
  172.                         {
  173.                                 if(i%2==0)
  174.                                 {
  175.                                         hc164send((temp2>>8)&0xff);
  176.                                         hc164send(temp2&0xff);
  177.                                 }
  178.                                 else
  179.                                 {
  180.                                         hc164send(0x00);
  181.                                         hc164send(0x00);
  182.                                 }
  183.                         }
  184.                         else if(type==3)
  185.                         {
  186.                                 if(i%2==1)
  187.                                 {
  188.                                         hc164send((temp2>>8)&0xff);
  189.                                         hc164send(temp2&0xff);
  190.                                 }
  191.                                 else
  192.                                 {
  193.                                         hc164send(0xff);
  194.                                         hc164send(0xff);
  195.                                 }
  196.                         }
  197.                         else
  198.                         {
  199.                                 hc164send((temp2>>8)&0xff);
  200.                                 hc164send(temp2&0xff);
  201.                         }
  202.                 }
  203.                
  204.                 P1=bseg[i];//选择列
  205.                 hc595out();


  206.                 delay();        

  207.         }
  208. }

  209. void disp_all_port(uchar y,uchar value/*1:亮*/,uchar type)
  210. {

  211.         if(type==0)
  212.         {
  213.                 if(value==1)
  214.                 {
  215.                         hc164send(0xff);
  216.                         hc164send(0xff);
  217.                 }
  218.                 else
  219.                 {
  220.                         hc164send(0x00);
  221.                         hc164send(0x00);
  222.                 }
  223.         }
  224.         else if(type==1)
  225.         {
  226.                 if(y%2==0)
  227.                 {
  228.                         hc164send(0xff);
  229.                         hc164send(0xff);
  230.                 }
  231.                 else
  232.                 {
  233.                         hc164send(0x00);
  234.                         hc164send(0x00);

  235.                 }

  236.         }
  237.         else if(type==2)
  238.         {
  239.                 if(y%2==1)
  240.                 {
  241.                         hc164send(0xff);
  242.                         hc164send(0xff);
  243.                 }
  244.                 else
  245.                 {
  246.                         hc164send(0x00);
  247.                         hc164send(0x00);

  248.                 }

  249.         }
  250.                 P1=bseg[y];//选择列

  251.         hc595out();
  252.         delay();
  253. }

  254. void part1()//一个灯一个的亮
  255. {
  256.         uchar x=0,y=0,m=0;                                       
  257.         for(x=0;x<16;x++)        
  258.          {
  259.                 for(y=0;y<16;y++)
  260.                  {         
  261.                          for(m=0;m<100;m++)
  262.                             disp_one_port(x,y,1);
  263.                  }
  264.         }

  265. }

  266. void part2()//全部亮灭
  267. {
  268.         uchar i=0,y=0;
  269.         int time=0;
  270.         for(i=0;i<3;i++)//亮灭三次
  271.         {
  272.                 for(time=0;time<20;time++)
  273.                 {
  274.                         for(y=0;y<16;y++)        
  275.                          {
  276.                                 disp_all_port(y,1,0);
  277.                         }
  278.                 }
  279.                 for(time=0;time<20;time++)
  280.                 {
  281.                         for(y=0;y<16;y++)        
  282.                          {
  283.                                 disp_all_port(y,0,0);
  284.                         }
  285.                 }
  286.         }

  287. }

  288. void part3()//灯亮了不灭
  289. {
  290.         uchar x=0,y=0;
  291.         int m=0;
  292.         for(x=0;x<16;x++)        
  293.          {
  294.                 for(y=0;y<16;y++)
  295.                  {        
  296.                          for(m=0;m<5;m++)                                
  297.                                     disp_section_port(x,y,0);
  298.                  }
  299.         }

  300. }

  301. void part4()//灯亮了不灭
  302. {
  303.         int x=0,y=0;
  304.         int m=0;
  305.         for(x=15;x>=0;x--)        
  306.          {
  307.                 for(y=15;y>=0;y--)
  308.                  {        
  309.                          for(m=0;m<5;m++)                                
  310.                                     disp_section_port(x,y,1);
  311.                  }
  312.         }

  313. }

  314. void part5()//灯亮了不灭
  315. {
  316.         uchar x=0,y=0;
  317.         int m=0;
  318.         for(x=0;x<16;x++)        
  319.          {
  320.                 for(y=0;y<16;y++)
  321.                  {        
  322.                          for(m=0;m<3;m++)                                
  323.                                     disp_section_port(x,y,2);
  324.                  }
  325.         }
  326.         for(x=0;x<16;x++)        
  327.          {
  328.                 for(y=0;y<16;y++)
  329.                  {        
  330.                          for(m=0;m<3;m++)                                
  331.                                     disp_section_port(x,y,3);
  332.                  }
  333.         }
  334. }
  335. void part6()//灯亮了不灭
  336. {
  337.         uchar i=0,y=0;
  338.         int time=0;
  339.         for(i=0;i<3;i++)//亮灭三次
  340.         {
  341.                 for(time=0;time<20;time++)
  342.                 {
  343.                         for(y=0;y<16;y++)        
  344.                          {
  345.                                 disp_all_port(y,1,1);
  346.                         }
  347.                 }
  348.                 for(time=0;time<20;time++)
  349.                 {
  350.                         for(y=0;y<16;y++)        
  351.                          {
  352.                                 disp_all_port(y,0,2);
  353.                         }
  354.                 }
  355.         }
  356. }

  357. void part7()
  358. {
  359.         int n=0,m=0;
  360.         for(m=0;m<20;m++)
  361.         {
  362.                 for(n=0;n<16;n++)        
  363.                 {
  364.                             P1=bseg[n];
  365.                         hc164send(SEG1[2*n+1]);
  366.                           hc164send(SEG1[2*n]);
  367.                         hc595out();
  368.                           delay(); //delay();         delay(); // delay();           delay();
  369.                 }
  370.         }
  371. ……………………

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

所有资料51hei提供下载:
595LED.rar (76.37 KB, 下载次数: 46)



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

使用道具 举报

沙发
ID:210077 发表于 2017-6-21 17:58 | 只看该作者
看起来不错呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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