基于标准库用TM1629A驱动3621A共阳数码管
时间: 2023-07-11 13:18:15 浏览: 287
TM1629A是一种常用的LED数码管驱动芯片,它可以驱动多个数码管、LED灯等显示器件。下面是一个基于标准库的STM32驱动TM1629A控制3621A共阳数码管的示例代码:
```c
#include "stm32f10x.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CLK_GPIO GPIOB
#define CLK_PIN GPIO_Pin_13
#define DIO_GPIO GPIOB
#define DIO_PIN GPIO_Pin_15
#define STB_GPIO GPIOB
#define STB_PIN GPIO_Pin_14
// 定义TM1629A控制命令
#define TM1629A_CMD1 0x40
#define TM1629A_CMD2 0xC0
#define TM1629A_CMD3 0x80
// 数码管段码表
const unsigned char seg_table[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
};
// 发送一个字节到TM1629A
void TM1629A_SendByte(unsigned char byte)
{
unsigned char i;
GPIO_ResetBits(STB_GPIO, STB_PIN);
for (i = 0; i < 8; i++) {
if (byte & 0x01) {
GPIO_SetBits(DIO_GPIO, DIO_PIN);
} else {
GPIO_ResetBits(DIO_GPIO, DIO_PIN);
}
byte >>= 1;
GPIO_SetBits(CLK_GPIO, CLK_PIN);
GPIO_ResetBits(CLK_GPIO, CLK_PIN);
}
}
// 发送一个命令到TM1629A
void TM1629A_SendCmd(unsigned char cmd)
{
TM1629A_SendByte(cmd);
}
// 初始化TM1629A
void TM1629A_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = CLK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(CLK_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DIO_PIN;
GPIO_Init(DIO_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = STB_PIN;
GPIO_Init(STB_GPIO, &GPIO_InitStructure);
GPIO_SetBits(CLK_GPIO, CLK_PIN);
GPIO_SetBits(DIO_GPIO, DIO_PIN);
GPIO_SetBits(STB_GPIO, STB_PIN);
TM1629A_SendCmd(TM1629A_CMD1 | 0x01);
TM1629A_SendCmd(TM1629A_CMD2 | 0x08);
TM1629A_SendCmd(TM1629A_CMD3 | 0x00);
}
// 在指定位置显示一个数字
void TM1629A_DisplayNum(unsigned char pos, unsigned char num)
{
unsigned char seg = seg_table[num];
TM1629A_SendCmd(TM1629A_CMD1 | (pos << 1));
TM1629A_SendByte(seg);
}
int main(void)
{
TM1629A_Init();
while (1) {
TM1629A_DisplayNum(0, 1);
TM1629A_DisplayNum(1, 2);
TM1629A_DisplayNum(2, 3);
TM1629A_DisplayNum(3, 4);
}
return 0;
}
```
上面的代码中,我们定义了CLK、DIO、STB三个引脚的GPIO端口和引脚编号,以及TM1629A的控制命令。在初始化函数中,我们首先设置了三个引脚的GPIO模式和速度,并且将它们的输出电平置高。然后,我们依次发送三个初始化命令到TM1629A,使得它能够正确地驱动3621A共阳数码管。在显示数字的函数中,我们根据每个数字的段码表,设置TM1629A对应位置的显示内容。在主函数中,我们不停地循环调用显示数字的函数,以便在数码管上显示一串数字。
阅读全文