STM32 F103 标准库CH452A 4线 数码管驱动芯片显示数码管
公司生产测试需要统一去检查这版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, // 00x06, // 10x5B, // 20x4F, // 30x66, // 40x6D, // 50x7D, // 60x07, // 70x7F, // 80x6F, // 90x77, // A0x7C, // b0x39, // C0x5E, // d0x79, // E0x71 // 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;// 配置DCLKGPIO_InitStruct.GPIO_Pin = CH452_DCLK_PIN;GPIO_Init(CH452_DCLK_PORT, &GPIO_InitStruct);// 配置DINGPIO_InitStruct.GPIO_Pin = CH452_DIN_PIN;GPIO_Init(CH452_DIN_PORT, &GPIO_InitStruct);// 配置LOADGPIO_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 0x0500void 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
直接拿去放你们文件中就可以使用了,不用谢啊,什么你找我要工程?看我资料列表吧,我资源列表有