找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助16X16点阵总有两列残影发亮的问题,带PCB工程和程序

[复制链接]
跳转到指定楼层
楼主
问题求助:使用红色时能完整发送字,但是总有两列残影发亮的问题,使用绿色时下半部分直接乱码,也还是有两列残影发亮。制作分享:工程分为单片机驱动板和16X16点阵板,单片机驱动板上1个STC单片机(我用的是STC12C5A60S2)、2个74LS138进行扫描、4个74HC595发送数据和24C02扩展内存,除了可以驱动点阵也可以驱动数码管,灯之类的,因为我闲置的直插件较多所以都用了直插件,板子排得比较密,密集恐惧症慎入哈哈!点阵板我用的是双色点阵,如果改成纯红色点阵的可以弄成16X32(因为绿色不用可以给红色用),另外文件里的PCB工程为了给大家方便浏览检查没有敷铜,如果大家直接打样PCB的话记得顶层和底层要接地敷铜,避免板上的芯片高速运行受到外界干扰,本人单片机小白一个,不喜勿喷,欢迎多提宝贵意见,共同交流!
  1. //74HC138引脚:P22,P23,P24,P25,P26,P27
  2. //24C02引脚:P20-SDA,P21-SCL
  3. //red595:11脚-P10,12脚-P11,14脚-P12,13脚控制脚-P16
  4. //green595:11脚-P13,12脚-P14,14脚-P15,13脚控制脚-P17
  5. //74HC595:11脚SH_CP是数据输入时钟线,12脚ST_CP是输出存储器锁存时钟线,13脚OE是输出有效(低电平有效),14脚DS是串行数据输入
  6. #include <intrins.h>
  7. #include <REGX52.H>
  8. #define uint unsigned int
  9. #define uchar unsigned char

  10. sbit saomiao1=P2^2;
  11. sbit saomiao2=P2^3;
  12. sbit saomiao3=P2^4;
  13. sbit saomiao4=P2^5;
  14. sbit saomiao5=P2^6;
  15. sbit saomiao6=P2^7;
  16. sbit redSH_CP=P1^0;
  17. sbit redST_CP=P1^1;
  18. sbit redOE=P1^6;
  19. sbit redDS=P1^2;
  20. sbit greenSH_CP=P1^3;
  21. sbit greenST_CP=P1^4;
  22. sbit greenOE=P1^7;
  23. sbit greenDS=P1^5;

  24. uchar a;
  25. uchar code display[]=
  26. {
  27. 0xF7,0xF6,0x31,0x47,0xF7,0xFF,0xFD,0x85,0xB5,0xB5,0xB5,0xB5,0xB5,0x85,0xFD,0xFF,
  28. 0xFD,0xFE,0x00,0xFF,0xFC,0xFF,0x00,0xB6,0xB6,0xB6,0x80,0xB6,0xB6,0xB6,0x00,0xFF
  29. }; //福

  30. void delay(uint b)//延时
  31. {
  32.         while(b--);
  33. }

  34. void shuaxin(uchar a)//138译码器刷新列
  35. {
  36.                 switch(a)
  37.                 {
  38.                         case(1):
  39.                                 saomiao4=1;saomiao5=1;saomiao6=1; break;
  40.                         case(2):
  41.                                 saomiao4=0;saomiao5=1;saomiao6=1; break;
  42.                         case(3):
  43.                                 saomiao4=1;saomiao5=0;saomiao6=1; break;
  44.                         case(4):
  45.                                 saomiao4=0;saomiao5=0;saomiao6=1; break;
  46.                         case(5):
  47.                                 saomiao4=1;saomiao5=1;saomiao6=0; break;
  48.                         case(6):
  49.                                 saomiao4=0;saomiao5=1;saomiao6=0; break;
  50.                         case(7):
  51.                                 saomiao4=1;saomiao5=0;saomiao6=0; break;
  52.                         case(8):
  53.                                 saomiao4=0;saomiao5=0;saomiao6=0; break;
  54.                         case(9):
  55.                                 saomiao1=1;saomiao2=1;saomiao3=1; break;
  56.                         case(10):
  57.                                 saomiao1=0;saomiao2=1;saomiao3=1; break;
  58.                         case(11):
  59.                                 saomiao1=1;saomiao2=0;saomiao3=1; break;
  60.                         case(12):
  61.                                 saomiao1=0;saomiao2=0;saomiao3=1; break;
  62.                         case(13):
  63.                                 saomiao1=1;saomiao2=1;saomiao3=0; break;
  64.                         case(14):
  65.                                 saomiao1=0;saomiao2=1;saomiao3=0; break;
  66.                         case(15):
  67.                                 saomiao1=1;saomiao2=0;saomiao3=0; break;
  68.                         case(16):
  69.                                 saomiao1=0;saomiao2=0;saomiao3=0; break;
  70.                         default :break;
  71.                 }
  72. }


  73. void Init_red595(uchar valueL,uchar valueH)//红色595发送函数初始化
  74. {
  75.         uchar i;
  76.                 for(i=0;i<8;i++)
  77.                 {
  78.                         redDS=valueL>>7;//把valueL最高位的值赋给redDS
  79.                         valueL<<=1;//把valueL原来的值左移一位,再赋值给valueL,(有赋值操作,所以会改变原先的值)多出来的最低位自动用0来填充,valueL的最高位发送出去
  80.                         redSH_CP=0;
  81.                         _nop_();
  82.                         _nop_();
  83.                         redSH_CP=1;
  84.                 }
  85.                 for(i=0;i<8;i++)
  86.                 {
  87.                         redDS=valueH>>7;
  88.                         valueH<<=1;
  89.                         redSH_CP=0;
  90.                         _nop_();
  91.                         _nop_();
  92.                         redSH_CP=1;
  93.                 }
  94.                 redST_CP=0;
  95.                 _nop_();
  96.                 _nop_();
  97.                 redST_CP=1;
  98. }

  99. void red_send()//发送红色点阵数据
  100. {
  101.         uint index;
  102.         greenOE=1;//绿色595输出不使能
  103.         for(index=1;index<17;index++)
  104.                         {
  105.                                 redOE=1;//红色595输出不使能
  106.                                 shuaxin(index);//138译码器刷新
  107.                                 Init_red595(display[index+16],display[index]);//带入红色点阵要发送的数据
  108.                                 redOE=0;//红色595输出使能
  109.                                 delay(500);
  110.                         }
  111. }

  112. void Init_green595(uchar valueL,uchar valueH)//绿色595发送函数初始化
  113. {
  114.         uchar i;
  115.                 for(i=0;i<8;i++)
  116.                 {
  117.                         greenDS=valueL>>7;
  118.                         valueL<<=1;
  119.                         greenSH_CP=0;
  120.                         _nop_();
  121.                         _nop_();
  122.                         greenSH_CP=1;
  123.                 }
  124.                 for(i=0;i<8;i++)
  125.                 {
  126.                         greenDS=valueH>>7;
  127.                         valueH<<=1;
  128.                         greenSH_CP=0;
  129.                         _nop_();
  130.                         _nop_();
  131.                         greenSH_CP=1;
  132.                 }
  133.                 greenST_CP=0;
  134.                 _nop_();
  135.                 _nop_();
  136.                 greenST_CP=1;
  137. }

  138. void green_send()//发送绿色点阵数据
  139. {
  140.         uint index;
  141.         redOE=1;//红色595输出不使能
  142.         for(index=1;index<17;index++)
  143.                         {
  144.                                 greenOE=1;//绿色595输出不使能
  145.                                 shuaxin(index);//138译码器刷新
  146.                                 Init_green595(display[index+16],display[index]);//带入绿色点阵要发送的数据
  147.                                 greenOE=0;//绿色595输出使能
  148.                                 delay(500);
  149.                         }
  150. }

  151. void main()
  152. {
  153.         while(1)
  154.         {
  155.                 red_send();//红色显示
  156.                 //green_send();//绿色显示
  157.         }
  158. }



复制代码



原理图.png (150.92 KB, 下载次数: 39)

16X16点阵原理图

16X16点阵原理图

PCB.png (281.44 KB, 下载次数: 43)

16X16点阵PCB

16X16点阵PCB

2.jpg (244.86 KB, 下载次数: 44)

单片机驱动板实物

单片机驱动板实物

1.jpg (340.55 KB, 下载次数: 36)

组装好点阵

组装好点阵

取模.png (18 KB, 下载次数: 41)

取字模设置

取字模设置

红色显示.jpg (1.83 MB, 下载次数: 34)

红色显示

红色显示

绿色显示.jpg (1.55 MB, 下载次数: 36)

绿色显示

绿色显示

16X16点阵.rar

2.64 MB, 下载次数: 6

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

使用道具 举报

沙发
ID:235200 发表于 2020-2-12 00:04 | 只看该作者
从两条发亮的位置来看(第8列和第16列),这是你在传送1字节数据(8位)后去读取另一字节进行下一次传送的时间加长了最后一列的扫描时间,可根据这一现象修改最后1位的时间即可
回复

使用道具 举报

板凳
ID:213173 发表于 2020-2-12 06:53 | 只看该作者
楼主的程序好像有点问题:驱动程序增加消隐代码,for循环要与数组成员对应,修改如下。手上无条件验证,你试试。
void red_send()//发送红色点阵数据
{
        uint index;
        greenOE=1;//绿色595输出不使能
//        for(index=1;index<17;index++)
        for(index=0;index<16;index++)//与数组成员对应
        {
                redOE=1;//红色595输出不使能
                Init_red595(0xff,0xff);//添加消隐代码
                shuaxin(index);//138译码器刷新
                Init_red595(display[index+16],display[index]);//带入红色点阵要发送的数据
                redOE=0;//红色595输出使能
                delay(500);
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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