ESP32与数码管显示(一)

使用ESP32上的SPI模块点亮数码管操作

开发平台: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管脚连接,数据传输之后此为高电平
}

4、串口打印结果ESP32与数码管显示(一)_第1张图片
5、 数码管显示效果
ESP32与数码管显示(一)_第2张图片
ESP32与数码管显示(一)_第3张图片

如此,数码管会不断循环显示0-9这几个数据,整个ESP32数码管显示的功能就完成了。

PS:
如果想一次控制3位数的显示,则只需在LOOP主循环中同时调用“hspiCommand(Tab[i]);”三次即可。

你可能感兴趣的:(arduino,单片机,嵌入式)