找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6515|回复: 23
收起左侧

大神帮忙看看,点阵一直闪烁

  [复制链接]
ID:165827 发表于 2017-2-21 21:12 | 显示全部楼层 |阅读模式
程序应该没问题啊




#include "reg51.h"                       
#include "intrins.h"

typedef unsigned int u16;         
typedef unsigned char u8;


sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;

u8 code ledweixuan[]=
{
  0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,                          /*这就是扫描*/
};
void delay(u16 i)
{
         while(i--);
}

u8 code ledduan1[]=
{
/*--  文字:  普  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,0x00,
0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,

};

void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
        u8 a;

        SRCLK = 1;
        RCLK = 1;

        for(a=0;a<8;a++)               
        {
                SER = dat1 >> 7;       
                dat1 <<= 1;

                SRCLK = 0;                         
                _nop_();
                _nop_();
                SRCLK = 1;       
        }

        for(a=0;a<8;a++)               
        {
                SER = dat2 >> 7;               
                dat2 <<= 1;

                SRCLK = 0;                         
                _nop_();
                _nop_();
                SRCLK = 1;       
        }

        for(a=0;a<8;a++)               
        {
                SER = dat3 >> 7;               
                dat3 <<= 1;

                SRCLK = 0;                         
                _nop_();
                _nop_();
                SRCLK = 1;       
        }

        for(a=0;a<8;a++)                 
        {
                SER = dat4 >> 7;                 
                dat4 <<= 1;

                SRCLK = 0;                         
                _nop_();
                _nop_();
                SRCLK = 1;       
        }

        RCLK = 0;
        _nop_();
        _nop_();
        RCLK = 1;
}



void main()
{       
         u8 i;
        while(1)
        {
         for(i=0; i<16; i++)
         {
           Hc595SendByte(~ledweixuan[i+16],~ledweixuan[i],ledduan1[16+i],ledduan1[i]);
           delay(10);
         }
        }               
}

QQ图片20170221211107.jpg
回复

使用道具 举报

ID:165792 发表于 2017-2-21 22:29 | 显示全部楼层
不错功能比较多
回复

使用道具 举报

ID:155507 发表于 2017-2-21 23:27 | 显示全部楼层
试一下这个
  1. void main()
  2. {        
  3.         u8 i;
  4.         while(1)
  5.         {
  6.                 for(i=0; i<16; i++)
  7.                 {
  8.                         Hc595SendByte(~ledweixuan[i+16],~ledweixuan[i],ledduan1[16+i],ledduan1[i]);
  9.                         delay(10);
  10.                         Hc595SendByte(0x00,0x00,0x00,0x00);   //消隐
  11.                 }
  12.         }
  13. }
复制代码
回复

使用道具 举报

ID:159140 发表于 2017-2-22 11:08 | 显示全部楼层
可能刷新频率过低
回复

使用道具 举报

ID:123289 发表于 2017-2-23 01:50 | 显示全部楼层
程序显示效低。
回复

使用道具 举报

ID:165827 发表于 2017-2-23 10:29 | 显示全部楼层

还是不行呀
回复

使用道具 举报

ID:165827 发表于 2017-2-23 10:31 | 显示全部楼层
qq329401134 发表于 2017-2-22 11:08
可能刷新频率过低

怎么解决呢
回复

使用道具 举报

ID:165827 发表于 2017-2-23 10:31 | 显示全部楼层
yzwzfyz 发表于 2017-2-23 01:50
程序显示效低。

怎么解决呢
回复

使用道具 举报

ID:165827 发表于 2017-2-23 10:39 | 显示全部楼层

我试了一下朋友的单片机,没有问题,难道是我的坏了。。。。怎么会呢
回复

使用道具 举报

ID:111634 发表于 2017-2-23 12:27 | 显示全部楼层
本帖最后由 zl2168 于 2017-2-23 18:58 编辑

给你个不闪烁的正确案例,自己去对照研究吧!


实例66LED 16×16点阵扫描显示汉字


16×16点阵显示电路.jpg


用一片154(4-16译码器)代替2片138(3-8译码器),性价比更高。
LED显示来说,164595性价比更高(都是串入并出移位寄存器,164控制更简单)
实例66a LED 16×16点阵汉字显示.rar (48.21 KB, 下载次数: 28)
回复

使用道具 举报

ID:123289 发表于 2017-2-24 15:13 | 显示全部楼层
解决方案:
一般8*8点阵,需要8次扫描才能完成一个完整的显示。我做过实验,4ms大约是人眼视觉闪感点。最终采用的扫描方案是:每2.5ms扫描一次,以保证视觉上无闪动。驱动电流取30mA,以保证亮度合适。
以上供你参考。
回复

使用道具 举报

ID:123289 发表于 2017-2-24 15:20 | 显示全部楼层
本帖最后由 yzwzfyz 于 2017-2-24 15:23 编辑

扫描切换注意事项:
1、准备好显示的数据。(不事先准好,在切换时再做数据,会影响切换时间,使显示效率降低)
2、先总关,即禁显示(不这样做,新显示与旧显示会同时在屏)
3、开显示。(即送出数据)
要点:2、3、是切换必须花费的无效显示时间,最好用一条指令完成。
如    MOV   P1, #FFH     ;关显示
       CLR    P1.3            ;显示第4列
回复

使用道具 举报

ID:123289 发表于 2017-2-24 15:38 | 显示全部楼层
以下是我在我的产品程序中,截取的8*8点阵显示扫描切换语句,只有了三句,供参考。
                MOV     PX_SCAN, #FFH             ;切换开始,先关所有显示(关阳极电压),黑屏
                SETB    P_MOVSET                    ;移位寄存器置数;送出数据
                MOV     PX_SCAN, A                   ;显示列,开新的显示列
在此之前,有142个串行数据,都准备好了,就是没有送出,而送出开关就是第二句。
在此之前,下个显示的列也准备好了,放在A中。
这里PX_SCAN=P2它间接地控制LED的8路电源,P_MOVSET是P1.5接移位寄存器置数RCK。
回复

使用道具 举报

ID:123289 发表于 2017-2-24 15:40 | 显示全部楼层
以上程序,每2.5ms执行一次。
回复

使用道具 举报

ID:166423 发表于 2017-2-24 15:51 | 显示全部楼层
可能刷新频率过低  以上程序,每2.5ms执行一次
回复

使用道具 举报

ID:111634 发表于 2017-2-24 17:25 | 显示全部楼层
上述“实例66LED 16×16点阵扫描显示汉字”案例只有11句c程序,循环操作,简单的不得了,去看看吧!可先proteus仿真,验明正身,以免上当受骗。但绝不会让你失望!
回复

使用道具 举报

ID:125378 发表于 2017-2-24 20:09 | 显示全部楼层
#include "reg51.h"                         #include "intrins.h"  typedef unsigned int u16;          typedef unsigned char u8;   sbit SRCLK=P3^6; sbit RCLK=P3^5; sbit SER=P3^4;  u8 code ledweixuan[]= {   0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,                          /*这就是扫描*/ }; void delay(u16 i) {          while(i--); }  u8 code ledduan1[]= { /*--  文字:  普  --*/ /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/ 0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,0x00, 0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00,  };  void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4) {         u8 a;          SRCLK = 1;         RCLK = 1;          for(a=0;a<8;a++)                         {                 SER = dat1 >> 7;                         dat1 <<= 1;                  SRCLK = 0;                                          _nop_();                 _nop_();                 SRCLK = 1;                 }          for(a=0;a<8;a++)                         {                 SER = dat2 >> 7;                                 dat2 <<= 1;                  SRCLK = 0;                                          _nop_();                 _nop_();                 SRCLK = 1;                 }          for(a=0;a<8;a++)                         {                 SER = dat3 >> 7;                                 dat3 <<= 1;                  SRCLK = 0;                                          _nop_();                 _nop_();                 SRCLK = 1;                 }          for(a=0;a<8;a++)                          {                 SER = dat4 >> 7;                                  dat4 <<= 1;                  SRCLK = 0;                                          _nop_();                 _nop_();                 SRCLK = 1;                 }          RCLK = 0;         _nop_();         _nop_();         RCLK = 1; }
回复

使用道具 举报

ID:166475 发表于 2017-2-24 20:31 来自手机 | 显示全部楼层
刷新频率太低吧
回复

使用道具 举报

ID:88481 发表于 2017-2-24 23:41 来自手机 | 显示全部楼层
检查一下点阵的阴极与阳极有没有调乱
回复

使用道具 举报

ID:74868 发表于 2017-2-25 12:18 | 显示全部楼层
增加延迟时间
回复

使用道具 举报

ID:228016 发表于 2017-8-17 08:44 | 显示全部楼层
请问楼主解决问题了吗?我也遇到了同样的问题。
回复

使用道具 举报

ID:227393 发表于 2017-8-17 12:11 来自手机 | 显示全部楼层
用中断去扫描显示就没问题了,刷新频率太低了就要闪烁了
回复

使用道具 举报

ID:228061 发表于 2017-8-17 13:10 | 显示全部楼层
刷新率低了
回复

使用道具 举报

ID:228126 发表于 2017-8-17 17:01 | 显示全部楼层
点阵的电流一般比较大啊,你的USB确定带的动???用电源供电试试
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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