找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机驱动LED发光矩阵的使用心得

[复制链接]
跳转到指定楼层
楼主
从网上购得一枚发光矩阵,到网店查看相关资料,无赖找不到任何相关资料,只能从发光矩阵的标识入手寻找使用方法,器件上有
ELM-1882UYWB/S530-A3,C0506U。接口有八个引脚:5V,A,B,C,SER,SCK,RCK,GND。

到网上查找ELM-1882UYWB使用方法,没找到,找SER,SCK,RCK相关资料,发现是串行移位寄存器的接口,其中5V,GND是电源引脚,SER是数据引脚,SCK是时钟引脚,RCK是片选引脚,A,B,C行地址引脚。将ABC接P0口的012脚,SER、SCK、RCK接P0口345引脚,先按网上所述编写字符显示程序如下:

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit ser=P0^3;
sbit sck=P0^4;
sbit rck=P0^5;
int waitnum=1;
void delay(uint ii){uint i;for(i=0;i<ii;i++);}
void SendByte(uchar cc)
{uchar c=cc;int i;
  for(i=0;i<8;i++)
   {if(c&0x80)ser=1;
    else ser=0;
    c<<=1;
    sck=0;
    sck=1;
    }
    rck=0;
    rck=1;
}
uchar vc[][8]={{0x1c,0x22,0x32,0x2a,0x26,0x22,0x1c,0x00},//0
                 {0x08,0x0c,0x08,0x08,0x08,0x08,0x1c,0x00},//1
                 {0x1c,0x22,0x20,0x18,0x04,0x02,0x3e,0x00},//2
                 {0x1c,0x22,0x20,0x18,0x20,0x22,0x1c,0x00},//3
                 {0x10,0x18,0x14,0x12,0x3e,0x10,0x10,0x00},//4
                 {0x3e,0x02,0x1e,0x20,0x20,0x22,0x1c,0x00},//5
                 {0x18,0x04,0x02,0x1e,0x22,0x22,0x1c,0x00},//6
                 {0x3e,0x20,0x10,0x08,0x04,0x04,0x04,0x00},//7
                 {0x1c,0x22,0x22,0x1c,0x22,0x22,0x1c,0x00},//8
                 {0x1c,0x22,0x22,0x3c,0x20,0x10,0x0c,0x00},//9
                 {0x00,0x18,0x24,0x42,0x42,0x7e,0x42,0x42},//A
               {0x00,0x3c,0x44,0x44,0x3c,0x44,0x44,0x3c},//B
                 {0x00,0x38,0x44,0x04,0x04,0x44,0x38,0x00},//C
                };
void main()
{int i,j,k=0;
  while(1)
  {for(j=0;j<500;j++)
      for(i=0;i<8;i++)
         {P0=i;
          SendByte(vc[k][ i]);
          }
          delay(30000);
          k++;
   if(k==13)k=0;
   }
  }

发现能显示,但有两个问题,首先是显示重景,每个字符都象是两个字符错位叠加,显示不是很清楚,其次是显示字符转换时都带着上个字符的最后一行数据,效果有些别扭。经分析,重影问题的产生是由于显示时先传送显示数据,再改变显示行,这样数据传送完成后,显示行还没变,在旧的显示行就显示新的数据,显示行改变后,新的数据又在新的显示行显示,所以就重影。到于显示有残留是因为每个字符显示完后,转换显示字符时,上一个字符的最后一行数据还在显示,直到新字符的第一行显示时才擦掉,解决这个问题就是字符显示后将最后一行数据擦除,这样显示就清爽了。修改后的main()函数如下。
void main()
{int i,j,k=0;
  while(1)
  {for(j=0;j<500;j++)
      for(i=0;i<8;i++)
         {SendByte(vc[k][ i]);
          P0=i;
          }
          SendByte(0);
          k++;
   if(k==13)k=0;
   }
  }



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:398162 发表于 2018-10-15 14:42 | 只看该作者
我今天中午用keil4 实测 用的楼主源码,我的矩阵根本没有显示啊,只有数码管有反应

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:398162 发表于 2018-10-15 15:10 | 只看该作者
我用keil4 用了楼主的源码,因为我是开发板上的源码,就改了下引脚借口,烧录进去我的矩阵没有反应,只有数码管有反应,楼主知道怎么回事吗

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:404797 发表于 2018-10-15 22:31 | 只看该作者
不知你引脚定义有没有错,A、B、C、接P0的0、1、2脚,P0的第3、4、5脚分别是SER,SCK,RCK,

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:398162 发表于 2018-10-16 12:30 | 只看该作者
借用楼主思想,改了一下。
#include<reg52.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;

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

#define COMMONPORTS                P0
//áDÑ¡
unsigned char code TAB[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//¶ÎÑ¡
unsigned char code CHARCODE[18][8]=
{

{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0

{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1

{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2

{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3

{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4

{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5

{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6

{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7

{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8

{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, //9

{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00}, //P

{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00}, //R

{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00}, //E

{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00}, //C

{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00}, //H

{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, //I

{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00}, //N

{0x38,0x44,0x42,0x21,0x21,0x42,0x44,0x38}};  //°®DÄ

void delay(unsigned int time )
{
        unsigned int i,j;
        for(i=0;i<time;i++)
                for(j=0;j<121;j++);
}


void hc595send(u8 dat)
{
        u8 a;
        SRCLK=0;
        rCLK=0;
        for(a=0;a<8;a++)
        {
                SER=dat>>7;
                dat<<=1;

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


void main()
{
         unsigned char tab,j;
         unsigned int i;
         while(1)
         {
                 for(i=0;i<50;i++)
                {
                        for(tab=0;tab<8;tab++)
                        {
                                hc595send(0x00);
                                COMMONPORTS=TAB[tab];
                                hc595send(CHARCODE[j][tab]);
                                delay(2);
                        }
                }
                j++;
                if(j==18)
                {
                        j=0;
                }
         }
}

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:398162 发表于 2018-10-16 12:35 | 只看该作者
这是效果图

微信图片_20181016123235.jpg (42.62 KB, 下载次数: 32)

微信图片_20181016123235.jpg

微信图片_20181016123242.jpg (46.98 KB, 下载次数: 28)

微信图片_20181016123242.jpg

微信图片_20181016123224.jpg (54.34 KB, 下载次数: 31)

微信图片_20181016123224.jpg

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:404797 发表于 2018-10-16 14:06 | 只看该作者
佩服,你之前失败是什么原因?还有你用的是什么单片机,我的单片机只能定义少数变量,像你这样定义一个8X18数组编译不过,会报数据段太大,只能128个字节以内,所以我本想定义0-F十六进制的十六个字符,但受限变量规模不行。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:409682 发表于 2018-10-16 16:47 | 只看该作者
楼主,这跟数码管静态显示的消影是一个道理
回复

使用道具 举报

9#
ID:404797 发表于 2018-10-16 18:36 | 只看该作者
wlsbll 发表于 2018-10-16 16:47
楼主,这跟数码管静态显示的消影是一个道理

谢谢,我刚玩单片机,还没有消影这个概念,你的这回复对我很有帮助。
回复

使用道具 举报

10#
ID:399179 发表于 2018-10-16 19:12 来自手机 | 只看该作者
谢谢楼主分享!单片机学习中
回复

使用道具 举报

11#
ID:398162 发表于 2018-10-17 08:03 | 只看该作者
wlsbll 发表于 2018-10-16 16:47
楼主,这跟数码管静态显示的消影是一个道理

我的是51单片机,之前失败的原因,具体我也不清楚,我觉得是你发送字符函数,跟我的板子,不太一样吧。
回复

使用道具 举报

12#
ID:566742 发表于 2019-6-19 14:12 | 只看该作者
dumn 发表于 2018-10-16 12:30
借用楼主思想,改了一下。
#include
#include

你好!我想学你的心形矩阵led怎么做的。特别想做,但是没有学单片机很吃力哦
这么联系你吗?
回复

使用道具 举报

13#
ID:283883 发表于 2019-6-19 18:23 | 只看该作者
好像有鬼影?什么模块
回复

使用道具 举报

14#
ID:404797 发表于 2019-6-20 06:15 | 只看该作者
周栩乐 发表于 2019-6-19 18:23
好像有鬼影?什么模块

是有重影,原因是当时程序没有消影,只要做消影处理就好。模块是从网上买的,什么型号不太清楚,模块上有如下标注:ELM-1882UYWB/S530-A3,C0506U。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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