#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "extend_io.h" #include static const char* TAG = "IO"; uint8_t io_status=0; // 初始化GPIO void hc595_init() { gpio_config_t io_conf = { .pin_bit_mask = (1ULL << DATA_PIN) | (1ULL << CLOCK_PIN) | (1ULL << LATCH_PIN), .mode = GPIO_MODE_OUTPUT, .pull_up_en = GPIO_PULLUP_DISABLE, .pull_down_en = GPIO_PULLDOWN_DISABLE, .intr_type = GPIO_INTR_DISABLE }; gpio_config(&io_conf); // 初始状态置低 gpio_set_level(DATA_PIN, 0); gpio_set_level(CLOCK_PIN, 0); gpio_set_level(LATCH_PIN, 0); } // 发送数据到74HC595 void hc595_send(uint8_t *data, size_t len) { // 锁存引脚置低,准备发送数据 gpio_set_level(LATCH_PIN, 0); for (int bit = 7; bit >= 0; bit--) { // 设置数据位 gpio_set_level(DATA_PIN, (*data >> bit) & 0x01); // 产生时钟上升沿 gpio_set_level(CLOCK_PIN, 1); gpio_set_level(CLOCK_PIN, 0); } // 数据发送完成,锁存引脚置高更新输出 gpio_set_level(LATCH_PIN, 1); // 保持最小脉冲宽度 (可省略) vTaskDelay(pdMS_TO_TICKS(1)); gpio_set_level(LATCH_PIN, 0); } void HC595_Send_Byte(uint8_t byte) { uint8_t i; for (i = 0; i < 8; i ++) //一个字节8位,传输8次,一次一位,循环8次,刚好移完8位 { /**** 步骤1:将数据传到DS引脚 ****/ if( byte & (0x0001<