找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4920|回复: 6
收起左侧

16x16LED点阵屏制作

[复制链接]
ID:88481 发表于 2016-3-18 23:26 来自手机 | 显示全部楼层 |阅读模式
趁着春节几天假期,做个16x16点阵屏练练手。目的学习模拟串口,所以选用2块164和2块595驱动。164驱动电流较少,用三极管驱动选作行扫描,595作列显示。LED选用5x5红色方型。为了美观,将驱动和显示分开制作。
半个月后,终于制成了。通电调试时,发觉一个严重错误,每个LED亮度互相影响。怎么办?后来想到用热缩管包着每个LED(两百多个LED,想想都怕)。但每个LED体积增大了,原来的板子不能再。无法,咬咬牙重做板子。结果,直到三月份才完成。
IMG_20160313_193237.jpg
IMG_20160318_091100.jpg
IMG_20160318_125820.jpg

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2016-3-19 00:46 | 显示全部楼层
做工精美厉害啊,能分享一下 电路图和点阵的源代码吗?
回复

使用道具 举报

ID:88481 发表于 2016-3-19 17:19 来自手机 | 显示全部楼层
admin 发表于 2016-3-19 00:46
做工精美厉害啊,能分享一下 电路图和点阵的源代码吗?

原理图没有画LED,图中1~16接LED正极,a~p接负极。程序都是参考别人修改过来的。
Screenshot_2016-03-19-12-55-22.png
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define  SPEED  13

  4. void xmove(char dir,unsigned char *ptr,char n,char speed);
  5. void delay(unsigned int a);
  6. void display();
  7. void displaytime(char time);
  8. void init164();

  9. sbit  ADATA= P1^0;
  10. sbit  ASCK= P1^1;
  11. sbit  LATCH= P1^2;
  12. sbit  BDATA= P1^3;
  13. sbit  BCLK= P1^4;

  14. code unsigned char kai[32]={0x18,0x00,0x5A,0xF8,0x5A,0xF8,0x5A,0xD8,0x7E,0xD8,0x00,0xD8,0xFE,0xD8,0xFE,0xD8,
  15. 0x06,0xD8,0x7E,0xD8,0x60,0xD8,0x6E,0xD8,0x7D,0x9A,0x73,0x1E,0x02,0x0E,0x00,0x00};  /*--  文字:  凯  --*/


  16. code unsigned char yu[32]={ 0x00,0x78,0x3F,0xF8,0x3F,0x80,0x01,0x80,0x1F,0xF8,0x19,0x98,0x1F,0xF8,0x01,0x80,
  17. 0x3F,0xFE,0x3F,0xFE,0x31,0x86,0x31,0xA6,0x37,0xF6,0x37,0x1E,0x30,0x0C,0x00,0x00}; /*--  文字:  禹  --*/
  18.          
  19. code unsigned char duan[32]={0x03,0x00,0x03,0x00,0x3F,0xF8,0x3F,0xF8,0x33,0x18,0x33,0x18,0x3F,0xF8,0x33,0x18,
  20. 0x33,0x18,0x3F,0xF8,0x3F,0xF8,0x33,0x06,0x03,0x06,0x03,0xFE,0x01,0xFC,0x00,0x00};  /*--  文字:  电  --*/


  21. code unsigned char lu[32]={0x00,0xC0,0x7C,0xC0,0x7D,0xF8,0x6D,0x98,0x6F,0xD8,0x7C,0x70,0x18,0xF8,0x5B,0x9E,
  22. 0x5F,0x04,0x5D,0xF8,0x59,0x98,0x5D,0x98,0xFD,0xF8,0xE1,0xF8,0x01,0x98,0x00,0x00}; /*--  文字:  路  --*/

  23. unsigned char idata buffer[32];

  24. void main(void)
  25. {
  26.         unsigned char i;
  27.         init164();
  28.         while(1)
  29.         {        
  30.                 for(i=0;i<32;i++)
  31.                 buffer[i]=kai[i];
  32.                 displaytime(1);
  33.                 xmove(1,zhong,3,SPEED);
  34.                 displaytime(1);
  35.         }
  36. }
  37. /*************  子函数   ******************/
  38. void delay(unsigned int a)
  39. {
  40.         while(a--);
  41. }

  42. void display()
  43. {
  44.         unsigned char hang,ib,k,tmp;
  45.     P1= 0x00;
  46.         BDATA = 1;
  47.         for(hang=0;hang<16;hang++)
  48.         {
  49.                 ASCK =0;               
  50.                 LATCH=0;
  51.                 BCLK =0;
  52.                 for(ib=0;ib<2;ib++)
  53.                 {
  54.                         tmp = buffer[hang*2+ib];
  55.                         for(k=0;k<8;k++)
  56.                         {
  57.                                 tmp <<=1;
  58.                                 ASCK  =0;
  59.                                 ADATA =CY;
  60.                                 ASCK  =1;
  61.                         }
  62.                 }
  63.                 LATCH=1;
  64.                 BCLK=1;
  65.                 BDATA=0;
  66.         }
  67.         delay(64);
  68.         ASCK =0;
  69.         ASCK =1;
  70. }

  71. void displaytime(char time)
  72. {
  73.         unsigned char i;
  74.         while(time--)
  75.         {
  76.                 i=130;
  77.                 while(i--)
  78.                          display();
  79.         }
  80. }

  81. void init164()   //初始化164所有脚置0
  82. {
  83.         char i;
  84.         BDATA=0;
  85.         for(i=0;i<16;i++)
  86.         {
  87.                 BCLK =0;
  88.                 BCLK =1;
  89.         }
  90. }

  91. void xmove(char dir,unsigned char *ptr,char n,char speed)                                                         /*  dir 方向       n是要移动的汉字个数   speed移动速度*/        
  92. {
  93.         unsigned char  i=0,  ib=0;
  94.         unsigned int   tmp=0, speedm=0;
  95.         unsigned char  buffer2[16];         //半个汉字的缓存

  96.         n*=2;     //左半字和右半字,所以要x2            
  97.         for(i=0;i<16;i++)   //清零
  98.                 buffer2[i]=0;

  99. /****     向左移动    ****/
  100.         if(dir == 1)     
  101.         {
  102.                 for(n;n>0;n--)   
  103.                 {               
  104.                         if(ptr != 0)
  105.                         {
  106.                                 tmp = n%2;        //判断是左半字还是右半字
  107.                                 for(i=0;i<16;i++)
  108.                                         buffer2[i]=ptr[i*2+tmp];
  109.         
  110.                                 if(tmp)                //tmp为1时,将地址指向下一个汉字
  111.                                         ptr+=32;
  112.                         }
  113.                         
  114.                         for(tmp=8;tmp>0;tmp--)  //要移动8列        
  115.                         {                                   
  116.                                 ib=0;        
  117.                                 for(i=0;i<16;i++)
  118.                                 {                //要移16行,共16个字节
  119.                        
  120.                                         buffer[ib] <<=1; //移第一个半字
  121.                                         if(buffer[ib+1] & 0x80)        
  122.                                                 buffer[ib]++;
  123.                                         ib++;                        
  124.         
  125.                                         buffer[ib]<<=1;                //移后半字
  126.                                         if(buffer2[i] & 0x80)           
  127.                                                 buffer[ib]++;
  128.                                         ib++;
  129.         
  130.                                         buffer2[i]<<=1;                //缓冲左半字向左移一位
  131.                                 }
  132.                                 
  133.                                 speedm=speed;        //更新点阵
  134.                                 while(speedm--)
  135.                                         display();
  136.                         }
  137.                 }
  138.         }
  139. //--------------------------------------------------//
  140.         else        
  141.         {
  142.    /******  向右移动   ******/
  143.                 for(n;n>0;n--)
  144.                 {               
  145.                         if(ptr != 0)
  146.                         {
  147.                                 tmp = (n+1) % 2  ;        //判断左半字还是右半字
  148.                                 for(i=0;i<16;i++)
  149.                                         buffer2[i]=ptr[i*2+tmp];
  150.                                                                
  151.                                 if(tmp == 0)                //tmp为0时,将地址指向下一个汉字
  152.                                         ptr+=32;
  153.                         }
  154.                         
  155.                         for(tmp=8;tmp>0;tmp--)  //要移动8列        
  156.                         {                                   
  157.                                 ib=0;        
  158.                                 for(i=0;i<16;i++)
  159.                                 {                //要移16行,共16个字节
  160.                        
  161.                                         buffer[ib+1] >>= 1;             //移右半字
  162.                                         if(buffer[ib] & 0x01)        
  163.                                                 buffer[ib+1] |=0x80 ;                        
  164.         
  165.                                         buffer[ib] >>= 1;            //移左半字
  166.                                         if(buffer2[i] & 0x01)           
  167.                                                 buffer[ib] |= 0x80;
  168.                                         ib+=2;
  169.         
  170.                                         buffer2[i] >>=1;                //下个汉字的右半字向右移一位
  171.                                 }
  172.                                 
  173.                                 speedm=speed;        
  174.                                 while(speedm--)  //更新点阵
  175.                                         display();
  176.                         }
  177.                
  178.                 }
  179.         }
  180. }
复制代码
回复

使用道具 举报

ID:114228 发表于 2016-4-27 17:36 | 显示全部楼层
原理图看不清楚,希望能上个原版的原理图文件
回复

使用道具 举报

ID:103831 发表于 2016-4-29 13:58 | 显示全部楼层
方形LED  哪里买的,能说下嘛
回复

使用道具 举报

ID:146734 发表于 2016-11-19 23:21 | 显示全部楼层
51黑有你更精彩!!!
回复

使用道具 举报

ID:157486 发表于 2016-12-25 12:41 | 显示全部楼层
学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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