极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 60311|回复: 21

LedControl库的使用心得,欢迎大家指正。

[复制链接]
发表于 2014-4-14 00:32:06 | 显示全部楼层 |阅读模式
本帖最后由 fish6823 于 2014-4-14 00:44 编辑

    前段时间看到迷你强的8*8LED显示屏贴子很好玩,也想跟着玩一玩,但是把我的屏翻出来才发现与迷你强的不同,是MAX7219驱动的SPI总线的屏,库不一样,所在只能在坛子里看了一下别人玩MAX7219的贴子,找到了LedControl库来玩,发现这个库还挺好的,也很简单,但是只有英文说明,没见有中文的,我看到有网友也想玩这个屏但无从下手,所以我就结合该库的英文说明与我的试用感受,写了这个库的中文说明,给有需要的朋友吧!

LedControl库使用说明

该库用于使用MAX7221 and MAX7219驱动的SPI总线8*8 LED显示屏及7段LED数码管。
定义一个对象最多可以驱动8块8*8LED显示屏(每块64个LED总共512个)或8个7段数码管,需占用三个Arduino的IO口。
如需驱动超过8个设备只能定义多个对象,但需要占用更多的IO口。

库函数:

LedControl(int dataPin, int clkPin, int csPin, int numDevices)

用途:初始化设备,设置DIN(dataPin)、CLK、CS的IO口及连接设备数量(既有多少块屏)并定义一个对象。
参数 :
        dataPin               设置DIN口对应的Arduino上的IO口
        clockPin              设置CLK口对应的Arduino上的IO口
        csPin                   设置CS口对应的Arduino上的IO口
        numDevices        设置最大设备连接数(也就是8*8LED屏的个数),只能设置1-8,如果需要连接超过8个设备,则需要定义另一个对象并使用另外的IO口。

例:LedControl lc=LedControl(12,11,10,1);
        定义了一个名为lc的对象及设置接口DIN:12,CLK:11,CS:10,设备数量为1。

       LedControl lc1=LedControl(9,8,7,8);
        定义了一个名为lc1的对象及设置接口DIN:9,CLK:8,CS:7,设备数量为8。


int getDeviceCount()

用途:查询连接设备数量。
返回值:
       整数型,返回值为连接设备数量。
   


void shutdown(int addr, bool status);

用途:设置(节电)模式。
参数:
       addr          需设置的设备号,如:第一个设备为0,第二个设备为1等等。
       status        如果为true则开启节电模式,为false则关闭。

例:lc.shutdown(0,true);
       开启对象lc第一个设备的节电模式。


void setScanLimit(int addr, int limit);

用途:设置设备可显示的行数。
参数:
        addr       设备号
        limit        可显示的行数,原则上可设置为0-7,如超过7则变为8的余数,如设置为8余0则只显一行,9为两行等等。

例:lc.setScanLimit(0,7);
       设置对象lc第一个设备可显示8行。


void setIntensity(int addr, int intensity);

用途:设置亮度。
参数:
        addr              设备号
        intensity        亮度值0-15

例:lc.setIntensity(0,8);
       设置对象lc第一个设备的亮度为8。


void clearDisplay(int addr);

用途:清屏。
参数:
        addr        设备号

例:lc.clearDisplay(0);
       对象lc第一个设备清屏


以下三个函数为控制LED显示屏用的


void setLed(int addr, int row, int col, boolean state);

用途:设置其中一个LED的开关状态。
参数:
        addr         设备号
        row          要设置的LED行号,可设置0-7
        col           要设置的LED列号,可设置0-7
        state        如为true则LED开启,如为false则关闭


void setRow(int addr, int row, byte value);

用途:设置一行8个LED的开关状态
参数:
        Addr         设备号
        row           行号,可设置0-7
        value        LED亮灭数据,1为亮,0为灭,可只输入一个或多个数字(小于等于8个),LED按顺序亮灭,未输入部份默认为灭;还可以输入一个255以内的数值来表示LED的亮灭,因为每行或每列的不同LED都有一个1-128之间的值与其对应,对应关系如下表。



例:lc.setRow(0,0,01000000);
       对象lc的第一个设备第一行第二个LED亮,其它灭,

为了方便编辑,最好用数组如:
Byte o[8]={B00011000,
                   B00100100,
                   B01000010,
                   B10000001,
                   B10000001,
                   B01000010,
                   B00100100,
                   B00011000};
来表示在一个8*8的LDE屏上显示“O”这个字符,调用时为:lc.setRow(0,0,o[0]);来表示第一行的LDE亮灭,
lc.setRow(0,1,o[1]);来表示第二行的LDE亮灭等等

        lc.setRow(0,2,146);
       对象lc的第一个设备第三行第一、四、七LED亮,其它它,计算方法如下:

  Led 2.0 Led 2.1  Led 2.2 Led 2.3  Led 2.4  Led 2.5    Led 2.6   Led 2.7
On YesNoNoYesNoNoYes  No
Row-Value128 0 0 16 0 0 2 0 =146 (128+16+2)
                                                                 
这种方法可以简化数据录入,方便图形运算。




void setColumn(int addr, int col, byte value);

用途:设置一列8个LED的开关状态,与setRow输出的图形正好旋转90度。
参数:
        addr         设备号
        col            列号,可设置0-7
        value        LED亮灭数据,与setRow相同
     

下面两个函数是7段数码管用的

void setDigit(int addr, int digit, byte value, boolean dp);

用途:设置数码管显示十六进制数字
参数:
       addr        设备号
       digit         7段数码管号,可设置0-7
       value       显示数据,为十六进制数,0-15(0x00-0x0F),其中0-9为数字,10-15为十六进制字符(0-F)
       dp           开关 数码管上的小数点,turn为开,false为关
  

void setChar(int addr, int digit, char value, boolean dp);
   
用途:设置数码管显示字符
参数:
       addr        设备号
       digit         7段数码管号,可设置0-7
       value       显示数据,直接输入'0','1','2','3','4','5','6','7','8','9','0', 'A','b','c','d','E','F','H','L','P','.','-','_',' '就可以在数码管上显示出来,虽然只能显示有限的字符,但是可以方便使用,请注意英文字母有的是大写有的是小写,不要搞错了,还有最后一个‘ ’是一个空格,别看漏了。
       dp           开关数码管上的小数点,turn为开,false为关

本说明参考了http://www.wayoda.org/arduino/ledcontrol/index.html#ScanLimit上的英文说明,因本人英文水平有限,只能一边看一边试,但我只有LED屏没有数码管,所以数码管的两个函数没有试,只是按英文说明大概翻译了一下,如有错误,欢迎大家指正。附件是LedControl库


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +1 收起 理由
幻生幻灭 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2014-4-14 08:42:05 | 显示全部楼层
好的!谢谢!
回复 支持 反对

使用道具 举报

发表于 2014-4-29 22:28:12 | 显示全部楼层
学习学习赞
回复 支持 反对

使用道具 举报

发表于 2014-5-29 21:33:05 | 显示全部楼层
這個程式庫可以讓矩陣像跑馬燈那樣嗎?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-29 21:44:22 | 显示全部楼层
chris80124 发表于 2014-5-29 21:33
這個程式庫可以讓矩陣像跑馬燈那樣嗎?

这个是库文件,只是可以让你设定屏上哪个点亮哪个点灭,你要让矩阵像跑马灯一样的话要自己编相应的流程。
回复 支持 反对

使用道具 举报

发表于 2014-5-29 23:27:00 | 显示全部楼层
所以變成我要讓他哪裡亮哪裡滅 然後再DELAY 清屏 再重新哪裡亮哪裡暗 是這樣的順序嗎?

AND 那些函數是要在void setup或loop 外面還是裡面

(抱歉我是新手 諸多不便還請見諒~)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-30 23:12:20 | 显示全部楼层
chris80124 发表于 2014-5-29 23:27
所以變成我要讓他哪裡亮哪裡滅 然後再DELAY 清屏 再重新哪裡亮哪裡暗 是這樣的順序嗎?

AND 那些函數是要 ...

我觉得你应该先看一遍说明再问吧,里面的例子应该说明得很清楚了。
1、该库的函数里有可以按你说的用法,也有单独设定一个点亮灭的。
2、LedControl()函数用在程序的最前头(在void setup与loop前面);
     setScanLimit()、setIntensity()这两个函数用在void setup里,其它的函数用在loop里。
回复 支持 反对

使用道具 举报

发表于 2014-10-14 00:40:07 | 显示全部楼层
不知道作者是否遇到和我相同的问题,Ic.setRow(0,0,64);时(由上至西,从左到右数)第一行第一个灯点亮,使用Ic.setRow(0,0,128);时却是第一行最后一个灯点亮,这和文章中给出的图示不相符啊?各位是否有遇到过?还请帮忙解答。
回复 支持 反对

使用道具 举报

发表于 2014-10-14 00:52:46 | 显示全部楼层
clumsybird 发表于 2014-10-14 00:40
不知道作者是否遇到和我相同的问题,Ic.setRow(0,0,64);时(由上至西,从左到右数)第一行第一个灯点亮,使 ...

经测试Ic.setColumn(int addr, int col, byte value);函数就不会出现类似上述问题,求解。
回复 支持 反对

使用道具 举报

发表于 2014-10-14 10:51:31 | 显示全部楼层
clumsybird 发表于 2014-10-14 00:52
经测试Ic.setColumn(int addr, int col, byte value);函数就不会出现类似上述问题,求解。

自己找到问题所在了,是因为自己将Dp端口线接错了,接到了SegA端口上了。大家也切记。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2015-1-8 21:34:15 | 显示全部楼层
可以用了好开心,谢谢楼主,但是为什么用setIntensity调不了亮度呢
回复 支持 反对

使用道具 举报

发表于 2015-1-9 10:31:11 | 显示全部楼层
我也在玩这个诶,真巧,学习了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-9 10:58:16 | 显示全部楼层
象象 发表于 2015-1-8 21:34
可以用了好开心,谢谢楼主,但是为什么用setIntensity调不了亮度呢

可以设置亮度,不过只能设一次,不能实时调。
回复 支持 反对

使用道具 举报

发表于 2015-2-19 23:25:55 来自手机 | 显示全部楼层
fish6823 发表于 2014-5-29 21:44
这个是库文件,只是可以让你设定屏上哪个点亮哪个点灭,你要让矩阵像跑马灯一样的话要自己编相应的流程。

可以,我就用这个库做了一个滚屏程序。很好用
回复 支持 反对

使用道具 举报

发表于 2015-2-19 23:28:26 来自手机 | 显示全部楼层
唯一不爽就是只能驱动8个点阵,如果三个端口可以驱动更多点阵就更好了,希望高手能改进这个库。毕竟arduino端口并不富裕,而且布线会更省事。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 09:42 , Processed in 0.048364 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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