STM32如何驱动TM1629A

原理图如下

由于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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值