STM32 F103 标准库CH452A 4线 数码管驱动芯片显示数码管

发布于:2025-04-18 ⋅ 阅读:(29) ⋅ 点赞:(0)

公司生产测试需要统一去检查这版CH452A的好坏,网上找了一下没有现成可以用的4线CH452A的驱动程序,所以直接就肝了移植官方的51程序到stm32上面去,亲测可以使用!!

文末有代码

测试图片:

如你所见我测了一堆都没有问题,随意用,我这边原理图画的是共阴极的哦!!

这是官方手册的接线图哈,参考一下以后你就会发现,这个Dout用不上,所以4线更多时候三线就可以使用了。

接下来我贴一点芯片的资料水个字数吧,看了一下带锁存的很好用啊哈哈

官方介绍

CH452 是数码管显示驱动和键盘扫描控制芯片。CH452内置时钟振荡电路,可以动态驱动8位数 码管或者64只LED,具有BCD译码、闪烁、移位、段位寻址、光柱译码等功能;同时还可以进行64 键的键盘扫描;CH452通过可以级联的4线串行接口或者2线串行接口与单片机等交换数据;并且可 以对单片机提供上电复位信号。

CH452对数码管和发光管采用动态扫描驱动,顺序为DIG0至DIG7,当其中一个引脚吸入电流时, 其它引脚则不吸入电流。CH452内部具有电流驱动级,可以直接驱动0.5英寸至1英寸的共阴数码管, 段驱动引脚SEG6~SEG0分别对应数码管的段G~段A,段驱动引脚SEG7对应数码管的小数点,字驱 动引脚DIG7~DIG0分别连接8个数码管的阴极;CH452也可以连接8×8矩阵的发光二级管LED阵列 或者64个独立发光管或者64级光柱;CH452可以改变字驱动输出极性以便直接驱动共阳数码管(不 译码方式),或者通过外接反相驱动器支持共阳数码管,或者外接大功率管支持大尺寸的数码管。 CH452支持扫描极限控制,并且只为有效数码管分配扫描时间。当扫描极限设定为1时,唯一的 数码管DIG0将得到所有的动态驱动时间,从而等同于静态驱动;当扫描极限设定为8时,8个数码 管DIG7~DIG0各得到1/8的动态驱动时间;当扫描极限设定为4时,4个数码管DIG3~DIG0各得到 1/4的动态驱动时间,此时各数码管的平均驱动电流将比扫描极限为8时增加一倍,所以降低扫描极 限可以提高数码管的显示亮度。 CH452内部具有8个8位的数据寄存器,用于保存8个字数据,分别对应于CH452所驱动的8个 数码管或者8组每组8个的发光二极管。CH452支持数据寄存器中的字数据左移、右移、左循环、右 循环,并且支持各数码管的独立闪烁控制,在字数据左右移动或者左右循环移动的过程中,闪烁控制 的属性不会随数据移动。 CH452支持任意段位寻址,可以用于独立控制64个发光管LED中的任意一个或者数码管中的特 定段(例如小数点),所有段位统一编址从00H到3FH。当用“段位寻址置1”命令将某个地址的段位 置1后,该地址对应的发光管LED或者数码管的段会点亮,该操作不影响任何其它LED或者数码管其 它段的状态。

源文件:

bsp_ch452.c

#include "bsp_CH452.h"
#include "delay.h"

// 共阴数码管段码表
static const uint8_t SegCode[] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F, // 9
    0x77, // A
    0x7C, // b
    0x39, // C
    0x5E, // d
    0x79, // E
    0x71  // F
};

void CH452_GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
    
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    
    // 配置DCLK
    GPIO_InitStruct.GPIO_Pin = CH452_DCLK_PIN;
    GPIO_Init(CH452_DCLK_PORT, &GPIO_InitStruct);
    
    // 配置DIN
    GPIO_InitStruct.GPIO_Pin = CH452_DIN_PIN;
    GPIO_Init(CH452_DIN_PORT, &GPIO_InitStruct);
    
    // 配置LOAD
    GPIO_InitStruct.GPIO_Pin = CH452_LOAD_PIN;
    GPIO_Init(CH452_LOAD_PORT, &GPIO_InitStruct);
    
    // 初始状态
    GPIO_SetBits(CH452_DCLK_PORT, CH452_DCLK_PIN);
    GPIO_SetBits(CH452_DIN_PORT, CH452_DIN_PIN);
    GPIO_SetBits(CH452_LOAD_PORT, CH452_LOAD_PIN);
}

void CH452_WriteCommand(uint16_t cmd) {
    GPIO_ResetBits(CH452_LOAD_PORT, CH452_LOAD_PIN);
    Delay_us(2);
    
    for(int i = 0; i < 12; ++i) {
        (cmd & 0x01) ? GPIO_SetBits(CH452_DIN_PORT, CH452_DIN_PIN) : 
                      GPIO_ResetBits(CH452_DIN_PORT, CH452_DIN_PIN);
        Delay_us(1);
        
        GPIO_ResetBits(CH452_DCLK_PORT, CH452_DCLK_PIN);
        Delay_us(1);
        GPIO_SetBits(CH452_DCLK_PORT, CH452_DCLK_PIN);
        Delay_us(1);
        
        cmd >>= 1;
    }
    
    GPIO_SetBits(CH452_LOAD_PORT, CH452_LOAD_PIN);
    Delay_us(5);
}

void CH452_Init(void) {
    CH452_GPIO_Init();
    
    // 复位芯片
    CH452_WriteCommand(CH452_RESET);
    Delay_ms(20);
    
    // 配置显示参数
    CH452_WriteCommand(CH452_NO_BCD | 0x07); // 不译码+8位数码管
    
    // 开启显示和键盘
    CH452_WriteCommand(CH452_SYSON2);
}

void CH452_DisplayNum(uint8_t pos, uint8_t num, uint8_t dot) 
{
    if(pos > 7 || num >= sizeof(SegCode)/sizeof(SegCode[0])) return;
    
    uint8_t seg_data = SegCode[num];
    if(dot) seg_data |= 0x80;
    
    uint16_t cmd = 0x8000 | (pos << 8) | seg_data;
    CH452_WriteCommand(cmd);
}

头文件

bsp_ch452.h

#ifndef __BSP_CH452_H
#define __BSP_CH452_H

#include "stm32f10x.h"

// 引脚定义
#define CH452_DCLK_PIN    GPIO_Pin_2
#define CH452_DCLK_PORT   GPIOA
#define CH452_DIN_PIN     GPIO_Pin_3
#define CH452_DIN_PORT    GPIOA
#define CH452_LOAD_PIN    GPIO_Pin_13
#define CH452_LOAD_PORT   GPIOB

// 命令定义
#define CH452_RESET      0x0201
#define CH452_SYSON2     0x0403
#define CH452_NO_BCD     0x0500

void CH452_GPIO_Init(void);
void CH452_WriteCommand(uint16_t cmd);
void CH452_Init(void);
void CH452_DisplayNum(uint8_t pos, uint8_t num, uint8_t dot);

#endif

直接拿去放你们文件中就可以使用了,不用谢啊,什么你找我要工程?看我资料列表吧,我资源列表有


网站公告

今日签到

点亮在社区的每一天
去签到