开发平台:Arduino1.8.13;
芯片:ESP32-WROOM-32D(开发板套装 | | 芯片+下载器);
数码管:3级联74HC595下的3位数码管模块;
任务总目标:在数码管上循环显示0-9几个数字;
1、ESP32管脚选择与字符库
ESP32芯片含有4组SPI接口,此处不再赘述。本人选定的为HSPI接口模块,分别对应:IO12、IO13、IO14、IO15;,时钟为1MHZ。
/******* ESP32的管脚选择 *********/
#define HSPI_MISO 12
#define HSPI_MOSI 13
#define HSPI_SCLK 14
#define HSPI_SS 15
static const int spiClk = 1000000; // 1 MHz
SPIClass * hspi = NULL;
/******* 字符库 *********/
unsigned char Tab[] = { //数码管译码,数字显示库(0-9)
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff
};//(0-9)
2、串口设置以及管脚配置
在setup()函数中配置号管脚的工作模式、串口的波特率、和SPI的初始化
void setup() {
Serial.begin(115200); //设置串口(与SPI传输无关,便于自己调试程序)
pinMode(HSPI_MOSI, OUTPUT); //设置IO口为输出模式
pinMode(HSPI_SCLK, OUTPUT); //HSPISCLK
pinMode(HSPI_SS, OUTPUT); //HSPI SS
hspi = new SPIClass(HSPI);
hspi->begin(HSPI_SCLK, HSPI_MISO, HSPI_MOSI, HSPI_SS); //初始化SPI接口
}
2、SPI数据传输函数
此函数 hspiCommand()详情请参见官方实例“SPI_Muliple_Buses”中的说明。后面的备注为本人结合三级连数码管后的理解,仅供参考。
void hspiCommand(char value) { //SPI发送数据函数
digitalWrite(HSPI_SS, LOW); //此处与74595的STCP管脚连接,数据传输之前此为低电平
byte stuff = (byte) value;
hspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0)); //进行SPI参数配置(时钟clk、高位先发送、SPI工作模式)
digitalWrite(HSPI_SCLK, LOW); //与74595的clk管脚连接,数据传输之前此为位低电平
hspi->transfer(stuff); //数据传输
digitalWrite(HSPI_SCLK, HIGH); //与74595的clk管脚连接,数据传输之前此为位低电平
hspi->endTransaction();
digitalWrite(HSPI_SS, HIGH); //与74595的STCP管脚连接,数据传输之后此为高电平
}
3、主循环函数
在主循环函数中。每循环一次,计数器“ i ”加“ 1 ”,计数器到10的时候则会复位为“0”,周而复始。通过计数器的当前值:“ i ”,不断将字符库:“Tab[]”中的数据通过ESP32的 SPI模块发送到数码管中,实现点亮操作。
void loop() {
// put your main code here, to run repeatedly:
hspiCommand(Tab[i]); //调用字符库中的数字并通过SPI模块发送
delay(100);
Serial.print("value: ");
Serial.println(Tab[i],HEX); //将数码管上显示的值打印到串口上
i++;
if (i>= 10) //循环显示字符库Tab[]中的数字
i = 0;
delay(500);
}
3、完整代码及结果展示
全部代码如下所示:
#include <SPI.h>
/******* ESP32的管脚选择 *********/
#define HSPI_MISO 12
#define HSPI_MOSI 13
#define HSPI_SCLK 14
#define HSPI_SS 15
unsigned char Tab[] = { //数码管译码,数字显示库
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff
};//(0-9)
static const int spiClk = 1000000; // 1 MHz
SPIClass * hspi = NULL;
int i = 0;
void setup() {
Serial.begin(115200);
pinMode(HSPI_MISO, OUTPUT); //HSPIMISO
pinMode(HSPI_MOSI, OUTPUT); //HSPIMOSI
pinMode(HSPI_SCLK, OUTPUT); //HSPISCLK
pinMode(HSPI_SS, OUTPUT); //HSPI SS
hspi = new SPIClass(HSPI);
hspi->begin(HSPI_SCLK, HSPI_MISO, HSPI_MOSI, HSPI_SS); //初始化SPI接口
}
void loop() {
// put your main code here, to run repeatedly:
hspiCommand(Tab[i]); //调用字符库中的数字并通过SPI模块发送
delay(100);
Serial.print("value: ");
Serial.println(Tab[i],HEX); //将数码管上显示的值打印到串口上
i++;
if (i>= 10) //循环显示字符库Tab[]中的数字
i = 0;
delay(500);
}
void hspiCommand(char value) { //SPI发送数据函数
digitalWrite(HSPI_SS, LOW); //此处与74595的STCP管脚连接,数据传输之前此为位低电平
byte stuff = (byte) value;
hspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0)); //进行SPI参数配置(时钟clk、高位先发送、SPI工作模式)
digitalWrite(HSPI_SCLK, LOW); //此处与74595的clk管脚连接,数据传输之前此为位低电平
hspi->transfer(stuff);
digitalWrite(HSPI_SCLK, HIGH);
hspi->endTransaction();
digitalWrite(HSPI_SS, HIGH); //此处与74595的STCP管脚连接,数据传输之后此为高电平
}
如此,数码管会不断循环显示0-9这几个数据,整个ESP32数码管显示的功能就完成了。
PS:
如果想一次控制3位数的显示,则只需在LOOP主循环中同时调用“hspiCommand(Tab[i]);”三次即可。