LedControl是一个适用于 MAX7219
和 MAX7221
Led显示的Arduino驱动库,多用于Arduino的点阵驱动,并支持8x8点阵级联(LedControl库同样支持ESP8266的点阵驱动)。
LedControl库安装
打开库管理器,搜索 LedControl可以直接找到并安装,目前版本应该是1.0.6
LedControl库函数
在LedControl.h中可以快速浏览库函数,如下,基本看函数名就能猜到大致的函数作用,还能看到有7段数码管显示的相关函数,没错 LedControl库还能用于做数码管显示
#ifndef LedControl_h
#define LedControl_h
#include <avr/pgmspace.h>
#if (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
/*
* Segments to be switched on for characters and digits on
* 7-Segment Displays
*/
const static byte charTable [] PROGMEM = {
B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,
B01111111,B01111011,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B10000000,B00000001,B10000000,B00000000,
B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,
B01111111,B01111011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,B00000000,
B00110111,B00000000,B00000000,B00000000,B00001110,B00000000,B00000000,B00000000,
B01100111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,
B00000000,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,B00000000,
B00110111,B00000000,B00000000,B00000000,B00001110,B00000000,B00010101,B00011101,
B01100111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000
};
class LedControl {
private :
/* The array for shifting the data to the devices */
byte spidata[16];
/* Send out a single command to the device */
void spiTransfer(int addr, byte opcode, byte data);
/* We keep track of the led-status for all 8 devices in this array */
byte status[64];
/* Data is shifted out of this pin*/
int SPI_MOSI;
/* The clock is signaled on this pin */
int SPI_CLK;
/* This one is driven LOW for chip selectzion */
int SPI_CS;
/* The maximum number of devices we use */
int maxDevices;
public:
LedControl(int dataPin, int clkPin, int csPin, int numDevices=1);
int getDeviceCount();
void shutdown(int addr, bool status);
void setScanLimit(int addr, int limit);
void setIntensity(int addr, int intensity);
void clearDisplay(int addr);
void setLed(int addr, int row, int col, boolean state);
void setRow(int addr, int row, byte value);
void setColumn(int addr, int col, byte value);
void setDigit(int addr, int digit, byte value, boolean dp);
void setChar(int addr, int digit, char value, boolean dp);
};
#endif //LedControl.h
这里以常用的几个(点阵显示)函数做简单说明
LedControl(dataPin, clkPin, csPin, numDevices)
格式:LedControl(int dataPin, int clkPin, int csPin, int numDevices=1)
功能:新建一个类对象(初始化引脚于用于显示的点阵数)
参数:
- dataPin - 数据引脚
- clockPin - 时钟引脚
- csPin - 片选脚
- numDevices - 所要控制的点阵数(最大为8个,默认参数为1)
函数体:
LedControl::LedControl(int dataPin, int clkPin, int csPin, int numDevices) {
SPI_MOSI=dataPin;
SPI_CLK=clkPin;
SPI_CS=csPin;
if(numDevices<=0 || numDevices>8 )
numDevices=8;
maxDevices=numDevices;
pinMode(SPI_MOSI,OUTPUT);
pinMode(SPI_CLK,OUTPUT);
pinMode(SPI_CS,OUTPUT);
digitalWrite(SPI_CS,HIGH);
SPI_MOSI=dataPin;
for(int i=0;i<64;i++)
status[i]=0x00;
for(int i=0;i<maxDevices;i++) {
spiTransfer(i,OP_DISPLAYTEST,0);
//scanlimit is set to max on startup
setScanLimit(i,7);
//decode is done in source
spiTransfer(i,OP_DECODEMODE,0);
clearDisplay(i);
//we go into shutdown-mode on startup
shutdown(i,true);
}
}
调用示例:
LedControl LC = LedControl(10,11,12,4);
getDeviceCount()
格式:int getDeviceCount()
功能:读取可控制的点阵个数
参数:无
函数体:
int LedControl::getDeviceCount() {
return maxDevices;
}
调用示例:
int LCnum = LC.getDeviceCount();
shutdown(addr, status)
格式:void shutdown(int addr, bool status)
功能:初始化时设置点阵(设备)的关机(节能)模式
参数:
- addr - 设备地址,从0开始,如果是8个点阵地址就是 0 - 7
- status - true 时打开对应点阵的节能模式,需要正常使用时需配置为 false
函数体:
void LedControl::shutdown(int addr, bool b) {
if(addr<0 || addr>=maxDevices)
return;
if(b)
spiTransfer(addr, OP_SHUTDOWN,0);
else
spiTransfer(addr, OP_SHUTDOWN,1);
}
调用示例:
for(int i = 0;i<4;i++)
{
LC.shutdown(i,false); //启动时,关闭MAX72XX处于省电模式
}
setIntensity(addr, intensity)
格式:void setIntensity(int addr, int intensity)
功能:设置亮度值
参数:
- addr - 设备地址
- intensity - 亮度值,范围 0 - 15
函数体:
void LedControl::setIntensity(int addr, int intensity) {
if(addr<0 || addr>=maxDevices)
return;
if(intensity>=0 && intensity<16)
spiTransfer(addr, OP_INTENSITY,intensity);
}
调用示例:
for(int i = 0;i<4;i++)
{
LC.setIntensity(i,0); //亮度设置
}
clearDisplay(addr)
格式:void clearDisplay(int addr)
功能:点阵屏/数码管清屏
参数:
- addr - 设备地址
函数体:
void LedControl::clearDisplay(int addr) {
int offset;
if(addr<0 || addr>=maxDevices)
return;
offset=addr*8;
for(int i=0;i<8;i++) {
status[offset+i]=0;
spiTransfer(addr, i+1,status[offset+i]);
}
}
调用示例:
for(int i = 0;i<4;i++)
{
LC.clearDisplay(i);
}
setLed(addr, row, col, state)
格式:void setLed(int addr, int row, int col, boolean state)
功能:设置坐标LED的状态
参数:
- addr - 用于显示的设备地址
- row - Led 所在行 (0…7)
- col - Led 所在列 (0…7)
- state - 如果为true,则led亮起;如果为false,则led熄灭
函数体:
void LedControl::setLed(int addr, int row, int column, boolean state) {
int offset;
byte val=0x00;
if(addr<0 || addr>=maxDevices)
return;
if(row<0 || row>7 || column<0 || column>7)
return;
offset=addr*8;
val=B10000000 >> column;
if(state)
status[offset+row]=status[offset+row]|val;
else {
val=~val;
status[offset+row]=status[offset+row]&val;
}
spiTransfer(addr, row+1,status[offset+row]);
}
调用示例:
LC.setLed(0,1,1,true);
setRow(addr, row, value)
格式:void setRow(int addr, int row, byte value)
功能:设置单行8个LED等状态(点阵)
参数:
- addr - 设备地址
- row - 所要显示的行 (0…7)
- value - 十六进制数,控制该行8个LED的状态(相当于把10101010的二进制数换成1个十六进制数)
函数体:
void LedControl::setRow(int addr, int row, byte value) {
int offset;
if(addr<0 || addr>=maxDevices)
return;
if(row<0 || row>7)
return;
offset=addr*8;
status[offset+row]=value;
spiTransfer(addr, row+1,status[offset+row]);
}
调用示例:
LC.setRow(0,3,0x7C);
setColumn( addr, col, value)
格式:void setColumn(int addr, int col, byte value)
功能:设置单列8个LED等状态(点阵)
参数:
- addr - 设备地址
- row - 所要显示的列 (0…7)
- value - 十六进制数,控制该列8个LED的状态
函数体:
void LedControl::setColumn(int addr, int col, byte value) {
byte val;
if(addr<0 || addr>=maxDevices)
return;
if(col<0 || col>7)
return;
for(int row=0;row<8;row++) {
val=value >> (7-row);
val=val & 0x01;
setLed(addr,row,col,val);
}
}
调用示例:
LC.setColumn(0,3,0x7C);
下面是数码管相关显示函数
setDigit(addr, digit, value, dp)
格式:void setDigit(int addr, int digit, byte value, boolean dp)
功能:控制数码管显示
参数:
- addr - 设备地址
- digit - 要显示的数码管的位置 (0…7)
- value - 数码管显示的值 (0x00…0x0F)
- dp - 设置小数点显示状态
函数体:
void LedControl::setDigit(int addr, int digit, byte value, boolean dp) {
int offset;
byte v;
if(addr<0 || addr>=maxDevices)
return;
if(digit<0 || digit>7 || value>15)
return;
offset=addr*8;
v=pgm_read_byte_near(charTable + value);
if(dp)
v|=B10000000;
status[offset+digit]=v;
spiTransfer(addr, digit+1,v);
}
调用示例:
LC.setDigit(0,1,0x02,true);
setChar(addr, digit, value, dp)
格式:void setChar(int addr, int digit, char value, boolean dp)
功能:数码管字符/数字显示
参数:
- addr - 设备地址
- digit - 要显示的数码管的位置 (0…7)
- value - 要显示的字符或数字
- dp - 设置小数点显示状态
函数体:
void LedControl::setChar(int addr, int digit, char value, boolean dp) {
int offset;
byte index,v;
if(addr<0 || addr>=maxDevices)
return;
if(digit<0 || digit>7)
return;
offset=addr*8;
index=(byte)value;
if(index >127) {
//no defined beyond index 127, so we use the space char
index=32;
}
v=pgm_read_byte_near(charTable + index);
if(dp)
v|=B10000000;
status[offset+digit]=v;
spiTransfer(addr, digit+1,v);
}
调用示例:
LC.setChar(0,10,'2',true);
setChar函数可显示的字符如下(即使显示数字也要用字符形式传参)
‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘0’,
‘A’,‘b’,‘c’,‘d’,‘E’,‘F’,‘H’,‘L’,‘P’,
‘.’, ‘-’, ‘_’, ’ ’