• HK32F030MF4P6 TM1650驱动


     应用场景

    #ifndef __TM1650_H
    #define __TM1650_H
    #include "main.h"


    //显示参数
    #define TM1650_BRIGHT1       0x11   /*一级亮度,打开LED显示*/
    #define TM1650_BRIGHT2       0x21   /*二级亮度,打开LED显示*/
    #define TM1650_BRIGHT3       0x31   /*三级亮度,打开LED显示*/
    #define TM1650_BRIGHT4       0x41   /*四级亮度,打开LED显示*/
    #define TM1650_BRIGHT5       0x51   /*五级亮度,打开LED显示*/
    #define TM1650_BRIGHT6       0x61   /*六级亮度,打开LED显示*/
    #define TM1650_BRIGHT7       0x71   /*七级亮度,打开LED显示*/
    #define TM1650_BRIGHT8       0x01   /*八级亮度,打开LED显示*/
    #define TM1650_DSP_OFF       0x00   /*关闭LED显示*/
     
    //数码管位选
    #define TM1650_DIG1     0
    #define TM1650_DIG2     1
    #define TM1650_DIG3     2
    #define TM1650_DIG4     3
     
    void ALR_TM1650_init(void);
    void TM1650_cfg_display(uint8_t param);
    void TM1650_clear(void);

     
    //========【配置IIC总线的信号读写和时序】=======
    //主机拉高SCL
    #define SCL PCout(6)

    //主机拉高SDA
    #define SDA PCout(5)


    //主机读取SDA线电平状态,返回值为0为低电平,非0则为高电平
    #define TM1650_IIC_SDA_RD()  PCin(5)//  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5) 
     
    //软件延时4us
    #define TM1650_IIC_DELAY_4US   do{for(int ii_=0;ii_<100;ii_++);}while(0)
    //================================
    void SDA_OUT(void);
    void SDA_IN(void);
    void Display_Fix(unsigned char add,unsigned char DATA);
    void disp(u16 num);

    #endif


     

    #include "tm1650.h"


    void SDA_IN(void)
    {
        GPIO_InitTypeDef   GPIO_InitStructure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);  

        //I2C模拟
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
        GPIO_Init(GPIOC, &GPIO_InitStructure);
    }
    void SDA_OUT(void)
    {
        GPIO_InitTypeDef   GPIO_InitStructure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);  

        //I2C模拟
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;          //GPIO_Mode_IN)输入   (GPIO_Mode_OUT) 输出    GPIO_Mode_AF第二功能   (GPIO_Mode_AN)模拟
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;       //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
     
    }

    //产生IIC总线起始信号
    //数据输入开始条件是CLK高时候,DIO由高变成低
    static void TM1650_IIC_start(void)
    {
    //    SDA_OUT();
    //    TM1650_IIC_SCL_HIGH;     //SCL=1
    //    TM1650_IIC_DELAY_4US;
    //    TM1650_IIC_SDA_HIGH;    //SDA=1
    //    TM1650_IIC_DELAY_4US;
    //    TM1650_IIC_SDA_LOW;     //SDA=0
    //    TM1650_IIC_DELAY_4US;
    //    TM1650_IIC_SCL_LOW;
    //    TM1650_IIC_DELAY_4US;
        
        SDA_OUT();
        SCL = 1;     //SCL=1
        TM1650_IIC_DELAY_4US;
        SDA = 1;    //SDA=1
        TM1650_IIC_DELAY_4US;
        SDA = 0;;     //SDA=0
        TM1650_IIC_DELAY_4US;
        SCL = 0;;
        TM1650_IIC_DELAY_4US;
    }
     
    //产生IIC总线结束信号
    //数据输入结束条件是CLK高时候,DIO由低变成高
    static void TM1650_IIC_stop(void)
    {
        SDA_OUT();
        SCL = 0;     //SCL=0
        TM1650_IIC_DELAY_4US;
        SDA = 0;      //SDA=0
        TM1650_IIC_DELAY_4US;
        SCL = 1;
        TM1650_IIC_DELAY_4US;
        SDA = 1;    //SDA=1
        TM1650_IIC_DELAY_4US;
    }
    //通过IIC总线接收从机响应的ACK信号
    //TM1650_READ_DIO 是读取SDA信号
    static u8  TM1650_IIC_wait_ack(void)
    {
        uint8_t ack_signal = 0;
        
        SCL = 0;
        TM1650_IIC_DELAY_4US;
        SDA = 1;    //SDA=1
        TM1650_IIC_DELAY_4US;
        SCL = 1;
        TM1650_IIC_DELAY_4US;

        SDA_IN();

        while(TM1650_IIC_SDA_RD()==1)
        {
            TM1650_IIC_DELAY_4US;
            ack_signal++;
            if(ack_signal >= 10)
            {
                TM1650_IIC_stop();
                TM1650_IIC_DELAY_4US;
                return 1;
            }
        }
        SCL = 0;
        TM1650_IIC_DELAY_4US;
        return 0;
        


    //通过IIC总线发送一个字节

    static void TM1650_IIC_write_byte(uint8_t dat)
    {
        uint8_t i;
        SDA_OUT();
        

        for(i=0;i<8;i++)
        {
            SCL = 0;
            TM1650_IIC_DELAY_4US;
            
            if(dat >> 7)
            {
                SDA = 1;    //SDA=1
            }
            else
            {
                SDA = 0;
            }
            dat <<= 1;
            TM1650_IIC_DELAY_4US;
            SCL = 1;        
        }

        SCL = 0;
        TM1650_IIC_DELAY_4US;
        
        SDA = 1;
        TM1650_IIC_DELAY_4US;
    }
     
    //数码管显示
    void Write_DATA(u8 add, u8 DATA)
    {
        TM1650_IIC_start();
        TM1650_IIC_write_byte(add); 
        TM1650_IIC_wait_ack(); 
        TM1650_IIC_write_byte(DATA); 
        TM1650_IIC_wait_ack(); 
        TM1650_IIC_stop();
    }
     
    void Display_Fix(unsigned char add,unsigned char DATA)    //指定地址写入显示数据
    {
        if(add>3) return;
        else
            Write_DATA(0x68+(2*add),DATA);
    }


     
     
    //作用:设置显示参数
    //备注:这个操作不影响显存中的数据
    //用例:
    //    设置亮度并打开显示:TM1650_cfg_display(TM1650_BRIGHTx)
    //    关闭显示:TM1650_cfg_display(TM1650_DSP_OFF)
    void TM1650_cfg_display(uint8_t param)
    {
        TM1650_IIC_start();
        TM1650_IIC_write_byte(0x48);  TM1650_IIC_wait_ack();     //固定命令
        TM1650_IIC_write_byte(param); TM1650_IIC_wait_ack();    //参数值
        TM1650_IIC_stop();
    }
     
     
    //将显存数据全部刷为0,清空显示
    void TM1650_clear(void)
    {
        uint8_t dig;
        for(dig = TM1650_DIG1 ; dig<= TM1650_DIG4 ;dig++)
        {
            Display_Fix(dig,0XFF);   //将显存数据刷为0
        }
    }
     
    const uint8_t TABLE_0[10] ={0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92,0X82, 0XF8, 0X80,0X90};

    void disp(u16 num)
    {
        u8 a,b,c;
        a = num / 100;
        b = num %100 /10;
        c = num %10;
        Write_DATA(0X48,TM1650_BRIGHT1);
        Display_Fix(0,0xcf);
        Display_Fix(1,TABLE_0[a]);
        Display_Fix(2,TABLE_0[b]);
        Display_Fix(3,TABLE_0[c]);
        
    }
    //TM1650初始化
    void ALR_TM1650_init(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Schmit = GPIO_Schmit_Disable;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        
        GPIO_Init(GPIOC, &GPIO_InitStructure);
     

        Write_DATA(0X48,TM1650_BRIGHT1);
        TM1650_clear();     //将显存内容清0    
    }

  • 相关阅读:
    备战秋招--容器
    游戏“羊了个羊”火爆天际背后的秘密
    mac Network: use --host to expose
    算法补天系列之中级提高班1
    解决CXF webService 调用报错: “Cannot create a secure XMLInputFactory”
    安装 Android Studio 2024.1.1.6(Koala SDK35)和过程问题解决
    记账工具:轻松添加新账户并记录明细
    金融机器学习方法:K-均值算法
    Aspose.Font for .NET V22.9
    树莓派开机教程
  • 原文地址:https://blog.csdn.net/enfang1120/article/details/126175273