| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #include <stdio.h>
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "driver/gpio.h"
- #include "extend_io.h"
- #include <esp_log.h>
- 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<<i) )
- HC595_Data_High(); //如果第八位是1,则与 595 DS连接的引脚输出高电平
- else //否则输出低电平
- HC595_Data_Low();
- /*** 步骤2:SHCP每产生一个上升沿,当前的bit就被送入移位寄存器 ***/
- HC595_SHCP_Low(); // SHCP拉低
- //vTaskDelay(pdMS_TO_TICKS(1)); // 适当延时
- HC595_SHCP_High(); // SHCP拉高, SHCP产生上升沿
- // vTaskDelay(pdMS_TO_TICKS(1));
- //byte <<= 1; // 左移一位,将低位往高位移,通过 if (byte & 0x80)判断低位是否为1
- }
- }
- /**
- *74HC595输出锁存 使能
- **/
- void HC595_CS(void) {
- /** 步骤3:STCP产生一个上升沿,移位寄存器的数据移入存储寄存器 **/
- HC595_STCP_Low(); // 将STCP拉低
- vTaskDelay(pdMS_TO_TICKS(1)); // 适当延时
- HC595_STCP_High(); // 再将STCP拉高,STCP即可产生一个上升沿
- vTaskDelay(pdMS_TO_TICKS(1));
- }
- esp_err_t hc595_gpio_write(extend_gpio_num_t gpio_num, uint32_t level) {
- if (level==1) {
- io_status |= 1 << (7-gpio_num);
- // io_status=0x0f;
- }else {
- io_status &= ~(1 << (7-gpio_num));
- // io_status=0x00;
- }
- HC595_Send_Byte(io_status);
- HC595_CS();
- return ESP_OK;
- }
|