ESP8266(ESP-12F) 第三方库使用 -- LedControl

本文详细介绍了Arduino库LedControl的使用,包括安装、主要函数及其实现,适用于MAX7219和MAX7221点阵驱动。通过LedControl库,用户可以轻松控制8x8点阵的显示,支持数码管显示,调整亮度、开关机模式、设置点阵内容等功能。此外,还提供了数码管和字符显示的相关函数。
摘要由CSDN通过智能技术生成

LedControl是一个适用于 MAX7219MAX7221 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’,
‘.’, ‘-’, ‘_’, ’ ’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GenCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值