凉峰668 2026-01-06 12:33 采纳率: 50%
浏览 3

百科融创74hc595

想要使用103c8t6来通过这个16x16的点阵显示图形,但是没有这个相关资料,要怎么插线怎么写代码求解决(上面的芯片是74hc595d)

img

img

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-06 12:34
    关注

    中午好🌞🌞🌞
    本答案参考通义千问

    你提到的“百科融创74HC595”是一个常见的8位移位寄存器芯片,常用于扩展单片机的输出引脚。而“16x16点阵”通常指的是一个由 16行 × 16列 组成的LED点阵屏,每个点可以点亮或熄灭,实现图形显示。

    你提到使用的是 STM32F103C8T6(简称103C8T6),这是一种常用的32位MCU,具有丰富的GPIO资源,适合控制点阵显示。


    ✅ 一、硬件连接

    1. 74HC595的功能

    • 74HC595 是一个 8位串行输入并行输出 的移位寄存器。
    • 每个芯片可以驱动8个LED,通过 数据输入(DS)、时钟(SHCP)、锁存(STCP) 三根线控制。

    2. 16x16点阵的结构

    • 16行 × 16列,共256个LED。
    • 行控制:16个行选通(通常为阴极控制)
    • 列控制:16个列驱动(通常为阳极控制)

    3. 接线方案(建议使用两个74HC595进行级联)

    使用两个74HC595(总共16位):

    | 74HC595 | 引脚 | 功能 | |--------|------|------| | 74HC595-1 | Q0~Q7 | 控制前8列 | | 74HC595-2 | Q0~Q7 | 控制后8列 |

    连接方式:

    | 单片机引脚 | 74HC595-1 | 74HC595-2 | |------------|-----------|-----------| | PA0 | DS(数据输入) | DS(数据输入) | | PA1 | SHCP(时钟) | SHCP(时钟) | | PA2 | STCP(锁存) | STCP(锁存) | | GND | GND | GND | | VCC | VCC | VCC |

    注意: 如果你只用一个74HC595,只能控制8列,那么需要配合其他方法(如行列扫描)来控制16列。


    ✅ 二、代码思路(基于STM32F103C8T6)

    1. 定义控制引脚

    #define DS_PIN    GPIO_PIN_0
    #define SHCP_PIN  GPIO_PIN_1
    #define STCP_PIN  GPIO_PIN_2
    

    2. 初始化GPIO

    void HC595_Init(void) {
        GPIO_InitTypeDef GPIO_InitStruct;
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
        GPIO_InitStruct.GPIO_Pin = DS_PIN | SHCP_PIN | STCP_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
    }
    

    3. 写入数据函数(发送一个字节)

    void HC595_Write(uint8_t data) {
        for (int i = 0; i < 8; i++) {
            if (data & 0x80) {
                GPIO_SetBits(GPIOA, DS_PIN); // 设置数据位为高
            } else {
                GPIO_ResetBits(GPIOA, DS_PIN); // 设置数据位为低
            }
            GPIO_SetBits(GPIOA, SHCP_PIN); // 脉冲时钟
            GPIO_ResetBits(GPIOA, SHCP_PIN);
            data <<= 1;
        }
    
        GPIO_SetBits(GPIOA, STCP_PIN); // 锁存数据
        GPIO_ResetBits(GPIOA, STCP_PIN);
    }
    

    4. 显示一个字符(例如显示“H”)

    你需要准备一个 16x16点阵的字模数据,可以用工具生成,或者自己定义。

    const uint8_t PROGMEM H[16] = {
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00
    };
    

    5. 显示函数

    void DisplayChar(const uint8_t *char_data) {
        for (int row = 0; row < 16; row++) {
            uint8_t col_data = char_data[row];
            HC595_Write(col_data); // 发送列数据
            // 延时控制刷新频率
            delay_ms(1);
        }
    }
    

    注意: 上述代码只是一个基本框架,实际应用中还需要结合 行扫描动态显示 来实现完整的16x16点阵显示。


    ✅ 三、关键步骤总结

    1. 硬件连接:

      • 使用 两个74HC595 实现 16位列控制
      • 通过 行扫描 控制16行。
    2. 代码逻辑:

      • 使用 74HC595 扩展输出。
      • 逐行扫描点阵,每行发送对应的列数据。
    3. 数据格式:

      • 准备 16×16的点阵数据(每个字节表示一行)。
      • 数据可从在线字模生成工具获取,如 http://www.diyfx.com/。

    ✅ 四、推荐工具和资源


    ✅ 五、完整示例代码(简化版)

    #include "stm32f103x8.h"
    
    // 定义74HC595控制引脚
    #define DS_PIN    GPIO_PIN_0
    #define SHCP_PIN  GPIO_PIN_1
    #define STCP_PIN  GPIO_PIN_2
    
    // 点阵数据(16x16)
    const uint8_t PROGMEM H[16] = {
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00
    };
    
    // 初始化74HC595
    void HC595_Init() {
        GPIO_InitTypeDef GPIO_InitStruct;
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
        GPIO_InitStruct.GPIO_Pin = DS_PIN | SHCP_PIN | STCP_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
    }
    
    // 写入数据到74HC595
    void HC595_Write(uint8_t data) {
        for (int i = 0; i < 8; i++) {
            if (data & 0x80)
                GPIO_SetBits(GPIOA, DS_PIN);
            else
                GPIO_ResetBits(GPIOA, DS_PIN);
            GPIO_SetBits(GPIOA, SHCP_PIN);
            GPIO_ResetBits(GPIOA, SHCP_PIN);
            data <<= 1;
        }
        GPIO_SetBits(GPIOA, STCP_PIN);
        GPIO_ResetBits(GPIOA, STCP_PIN);
    }
    
    // 显示字符
    void DisplayChar(const uint8_t *char_data) {
        for (int row = 0; row < 16; row++) {
            HC595_Write(char_data[row]);
            delay_ms(1);
        }
    }
    
    // 延时函数(需根据系统时钟调整)
    void delay_ms(uint32_t ms) {
        for (uint32_t i = 0; i < ms * 1000; i++);
    }
    
    int main(void) {
        HC595_Init();
        while (1) {
            DisplayChar(H);
        }
    }
    

    ✅ 六、常见问题解答

    Q1: 为什么点阵不亮?

    • 检查74HC595的电源是否正常。
    • 确认行和列的连接是否正确。
    • 确保延时时间合适(太短会导致显示模糊)。

    Q2: 如何显示汉字或复杂图形?

    • 使用字模生成工具生成对应的数据。
    • 将数据保存为数组,按行发送。

    Q3: 是否可以使用多个74HC595级联?

    • 可以,将第一个的 Q7 连接到第二个的 DS,即可实现级联控制更多列。

    ✅ 七、总结

    | 项目 | 内容 | |------|------| | 芯片 | 74HC595D | | MCU | STM32F103C8T6 | | 点阵类型 | 16x16 | | 控制方式 | 74HC595 + 行扫描 | | 核心代码 | HC595_Write()DisplayChar() | | 数据来源 | 字模生成工具 |


    如果你有具体的点阵型号或想要显示的内容(如汉字、动画等),我可以进一步帮你生成对应的字模数据和代码!

    评论

报告相同问题?

问题事件

  • 创建了问题 1月6日