原理图如下
由于STM32单片机的引脚电平是3.3V,TM1629A芯片逻辑电平需要5V, 需要用三极管转换逻辑电平。
芯片驱动方式
芯片有2种模式进行写内部寄存器
1.地址增加模式
2.固定地址模式
按照不同的需求选择2种模式进行显示
显示流程图如下
时序图如下
.h文件内容
这里选择PB15,PA8,和PB14分别为模拟SPI引脚
#define CLK_PORT GPIOB
#define CLK_PIN GPIO_Pin_15
#define CLK_1629A_L() GPIO_SetBits(GPIOB,GPIO_Pin_15)
#define CLK_1629A_H() GPIO_ResetBits(GPIOB,GPIO_Pin_15)
#define DIO_PORT GPIOA
#define DIO_PIN GPIO_Pin_8
#define DIO_1629A_L() GPIO_SetBits(DIO_PORT,DIO_PIN)
#define DIO_1629A_H() GPIO_ResetBits(DIO_PORT,DIO_PIN)
#define STB_PORT GPIOB
#define STB_PIN GPIO_Pin_14
#define STB_1629A_L() Delay_us(2);GPIO_SetBits(STB_PORT,STB_PIN); Delay_us(2);
#define STB_1629A_H() Delay_us(2);GPIO_ResetBits(STB_PORT,STB_PIN); Delay_us(2);
.C文件内容
对引脚进行初始化操作
void TM1629_Init(void)
{
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA, ENABLE );
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOB, ENABLE );
//TM162A9A对应GPIO
//CLK
GPIO_InitStructure.GPIO_Pin =CLK_PIN ; //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //
GPIO_Init(CLK_PORT, &GPIO_InitStructure);
//DIO
GPIO_InitStructure.GPIO_Pin =DIO_PIN ; //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //
GPIO_Init(DIO_PORT, &GPIO_InitStructure);
//片选
GPIO_InitStructure.GPIO_Pin =STB_PIN ; //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //
GPIO_Init(STB_PORT, &GPIO_InitStructure);
}
延时函数
void Delay_us(u16 Time)
{
u16 i =10;
while(Time--)
{
i=10;
while(i--);
}
}
确定是固定地址还是地址增加模式
void TM1629A_Write_Cmd(uint8_t cmd)//发送模式
{
///< 片选,开始通讯
STB_1629A_L();
Delay_us(2);
///< 主机向从机发送数据
TM1629A_Write_Byte(cmd);
Delay_us(2);
///< 结束通信
STB_1629A_H();
Delay_us(2);
}
void TM1629A_Write_Byte(uint8_t dat)//发送数据
{
uint8_t i;
for(i=0;i<8;i++)
{
CLK_1629A_L();
Delay_us(1);
if(dat&0x01)
{
DIO_1629A_H();
}
else
{
DIO_1629A_L();
}
Delay_us(1);
CLK_1629A_H();
Delay_us(1);
dat>>=1;
}
}
使用地址增加模式分别显示2个数码管内容
void DisPlay_Num(u8 data1,u8 data2) //
{
TM1627_Reg_Data[0] =num_bit[data1];
TM1627_Reg_Data[1] =num_bit[data2];
TM1629A_Write_Cmd(0x40); //地址增加模式
STB_1629A_L();
TM1629A_Write_Byte(0xc0); //从第一个地址开始
for(int i=0;i<16;i++)
{
TM1629A_Write_Byte(TM1627_Reg_Data[i]);
}
STB_1629A_H();
STB_1629A_L();
TM1629A_Write_Byte(0x8a); //亮度设置
STB_1629A_H();
Delay_us(10);
}
main.c 内容
u8 TM1627_Reg_Data[16] ={0}; //TM1627的寄存器数据
//数码管 显示0-9 对应的16进制数
u8 num_bit[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int main(void)
{
TM1629_Init(); //初始化 GPIO
DisPlay_Num(1,2); //这里 使2个数码管分别显示 1 和 2
}