硬汉嵌入式论坛

 找回密码
 立即注册
查看: 634|回复: 1
收起左侧

[技术讨论] 同时控制数个引脚输出高低电平arduino

[复制链接]

17

主题

83

回帖

134

积分

初级会员

积分
134
发表于 2025-2-6 22:35:52 | 显示全部楼层 |阅读模式
本帖最后由 fantasyhpu 于 2025-2-7 17:46 编辑

记录一个同时控制数个ESP32S3引脚输出高低电平的arduino程序。利用重载和模板,既可以传递临时引脚编号数组,也可以传递实际引脚编号数组。
[C] 纯文本查看 复制代码
#include <Arduino.h>

#define DELAY  1000

int pins[] = {21, 43};

void digitalWritePins(std::initializer_list<int> pins, int byte)
{
    uint32_t maskSet = 0;
    uint32_t maskSet1 = 0;
    uint32_t maskClear = 0;
    uint32_t maskClear1 = 0;

    int i = 0;
    for (int pin : pins)
    {
        if (byte & (1 << i))
        {
            if (pin < 32)
            {
                maskSet |= (1 << pin);
            }
            else if (pin <= 48)
            {
                maskSet1 |= (1 << (pin - 32));
            }
        }
        else
        {
            if (pin < 32)
            {
                maskClear |= (1 << pin);
            }
            else if (pin <= 48)
            {
                maskClear1 |= (1 << (pin - 32));
            }
        }
        i++;
    }

    GPIO.out_w1ts |= maskSet;
    GPIO.out1_w1ts.val |= maskSet1; // 使用 .val 访问寄存器
    GPIO.out_w1tc |= maskClear;
    GPIO.out1_w1tc.val |= maskClear1; // 使用 .val 访问寄存器
}

template<size_t N>
void digitalWritePins(int (&pins)[N], int byte)
{
    uint32_t maskSet = 0;
    uint32_t maskSet1 = 0;
    uint32_t maskClear = 0;
    uint32_t maskClear1 = 0;

    for (int i = 0; i < N; i++)
    {
        int pin = pins[i];
        if (byte & (1 << i))
        {
            if (pin < 32)
            {
                maskSet |= (1 << pin);
            }
            else if (pin <= 48)
            {
                maskSet1 |= (1 << (pin - 32));
            }
        }
        else
        {
            if (pin < 32)
            {
                maskClear |= (1 << pin);
            }
            else if (pin <= 48)
            {
                maskClear1 |= (1 << (pin - 32));
            }
        }
    }

    GPIO.out_w1ts |= maskSet;
    GPIO.out1_w1ts.val |= maskSet1;
    GPIO.out_w1tc |= maskClear;
    GPIO.out1_w1tc.val |= maskClear1;
}

void pinsMode(std::initializer_list<int> pins, int mode)
{
    for (int pin : pins)
    {
        pinMode(pin, mode);
    }
}

template<size_t N>
void pinsMode(int (&pins)[N], int mode)
{
    for (int i = 0; i < N; i++)
    {
        int pin = pins[i];
        pinMode(pin, mode);
    }
}

void setup()
{
    pinsMode({21, 43}, OUTPUT);
}

void loop()
{
    digitalWritePins(pins, 0b01);
    delay(DELAY);
    digitalWritePins({21, 43}, 0b10);
    delay(DELAY);
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2025-2-7 06:34:22 | 显示全部楼层
谢谢分享
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 16:27 , Processed in 0.038480 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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