STM32-HAL库-TM650数码管显示

这里写自定义目录标题

#ifndef __MAIN_H
#define __MAIN_H

unsigned char  SEG_CODE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
                               0x38,0x30,0x76,0x74,0x3E,0x1C,0x37,0x54,0x73,0x73,0x1E,0x1E,0x3F,0x5C,0x6D,0x6D,
                               0x6E,0x6E,0x00,0x40,0x77,0x7C,0x39,0x5E,0x79,0x71};   //段码表,与下面支持显示的字符一一对应
unsigned char char_tab[]={"0123456789ABCDEFLlHhUuNnPpJjOoSsYy -abcdef"};        //支持显示的字符集合,与上面段码必须一一对应

#endif


#include "./BSP/IIC/myiic.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/main.h"
/**
 * @brief       初始化IIC
 * @param       无
 * @retval      无
 */
void iic1_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;

    IIC1_SCL_GPIO_CLK_ENABLE();      /* SCL引脚时钟使能 */
    IIC1_SDA_GPIO_CLK_ENABLE();      /* SDA引脚时钟使能 */

    gpio_init_struct.Pin = IIC1_SCL_GPIO_PIN;
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_OD;        /* 推挽输出 */
    gpio_init_struct.Pull = GPIO_PULLUP;                /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;      /* 高速 */
    HAL_GPIO_Init(IIC1_SCL_GPIO_PORT, &gpio_init_struct);/* SCL */

    gpio_init_struct.Pin = IIC1_SDA_GPIO_PIN;
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_OD;        /* 开漏输出 */
    HAL_GPIO_Init(IIC1_SDA_GPIO_PORT, &gpio_init_struct);/* SDA */
    /* SDA引脚模式设置,开漏输出,上拉, 这样就不用再设置IO方向了, 开漏输出的时候(=1), 也可以读取外部信号的高低电平 */
    iic1_stop();     /* 停止总线上所有设备 */
    TM1650_cfg_display(0x51);   //初始化为5级亮度,打开显示
    Clear();     //将显存内容清0
}


/**
 * @brief       产生IIC起始信号
 * @param       无
 * @retval      无
 */
void iic1_start(void)
{
    IIC1_SCL(1);
    IIC1_SDA(1);     
    delay_us(4);
    IIC1_SDA(0);      /* START信号: 当SCL为高时, SDA从高变成低, 表示起始信号 */
    delay_us(4);
    IIC1_SCL(0);     /* 钳住I2C总线,准备发送或接收数据 */
}

/**
 * @brief       产生IIC停止信号
 * @param       无
 * @retval      无
 */
void iic1_stop(void)
{
    IIC1_SCL(0);
    IIC1_SDA(0);     /* STOP信号: 当SCL为高时, SDA从低变成高, 表示停止信号 */
    delay_us(4);
    IIC1_SCL(1);
    delay_us(4);
    IIC1_SDA(1);     /* 发送I2C总线结束信号 */
}

/**
 * @brief       等待应答信号到来
 * @param       无
 * @retval      1,接收应答失败
 *              0,接收应答成功
 */
uint8_t iic1_wait_ack(void)
{
    uint8_t rack = 0;

    IIC1_SDA(1);     /* 主机释放SDA线(此时外部器件可以拉低SDA线) */
    delay_us(2);
    IIC1_SCL(1);     /* SCL=1, 此时从机可以返回ACK */
    delay_us(2);

    if (IIC1_READ_SDA) rack=1;    /* 等待应答 */
   
    IIC1_SCL(0);     /* SCL=0, 结束ACK检查 */
    delay_us(2);
    return rack;
}



/**
 * @brief       IIC发送一个字节
 * @param       data: 要发送的数据
 * @retval      无
 */
void iic1_send_byte(uint8_t data)     //指定地址写入数据
{
    uint8_t t;
    IIC1_SCL(0);
    for (t = 0; t < 8; t++)
    {
        IIC1_SDA(data & 0x80);    /* 高位先发送 */
        data <<= 1;     /* 左移1位,用于下一次发送 */
     
        delay_us(2);
        IIC1_SCL(1);
        delay_us(2);
        IIC1_SCL(0);
        delay_us(2);
    }
}

void icc1_Write_DATA(unsigned char add,unsigned char DATA) //指定地址写入数据
{
    iic1_start();
    iic1_send_byte(add);
    iic1_wait_ack();
    iic1_send_byte(DATA);
    iic1_wait_ack();
    iic1_stop();
}



//作用:设置显示参数
//备注:这个操作不影响显存中的数据
//用例:
//	设置亮度并打开显示:TM1650_cfg_display(TM1650_BRIGHTx)
//	关闭显示:TM1650_cfg_display(TM1650_DSP_OFF)
void TM1650_cfg_display(uint8_t param)
{
	iic1_start();
	iic1_send_byte(0x48);  iic1_wait_ack();     //固定命令
	iic1_send_byte(param); iic1_wait_ack();    //参数值
	iic1_stop();
}


void Clear(void)
{
    unsigned char i;
    for(i=0;i<4;i++)
    {
        icc1_Write_DATA(0x68+2*i,0);
    }
}

void Disp_Char_Fix(unsigned char add,unsigned char dis_char)   //指定地址显示数据,add代表数码管位置,dis_char为要显示的字符
{
    unsigned char i,point_flag;

    if(add>3) return;
    point_flag=dis_char & point;         //先把小数点分离出来	
    dis_char&=0x7f;
    if(dis_char<0x10)
    {   
        icc1_Write_DATA(0x68+2*add,SEG_CODE[dis_char]|point_flag); //如果是0-F,直接显示
    }
     else
    {
        for(i=0;i<sizeof(char_tab);i++)              //如果是字符,则在支持的字符中查找
        if(char_tab[i]==dis_char)           //找到,则把对应的段码送显示
         icc1_Write_DATA(0x68+2*add,SEG_CODE[i]|point_flag);
     }
}

void display(uint16_t date)
{
    unsigned char i,t;
    for(i=3;i>0;i--)
    {
        t=date%10;
        Disp_Char_Fix(i,t);
        date=(date-t)/10;
    }
}

void Disp_Num(unsigned long Num)	//按十进制显示数字,超出范围直接返回
{
    unsigned char i=0;
    if(Num>9999)return;
    Clear();
    do{Disp_Char_Fix(3-i,Num%10);Num/=10;i++;}while(Num>0);	

}


#ifndef __MYIIC_H
#define __MYIIC_H

#include "./SYSTEM/sys/sys.h"


/******************************************************************************************/
/* 引脚 定义 */

#define IIC1_SCL_GPIO_PORT               GPIOB
#define IIC1_SCL_GPIO_PIN                GPIO_PIN_6
#define IIC1_SCL_GPIO_CLK_ENABLE()       do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)   /* PB口时钟使能 */

#define IIC1_SDA_GPIO_PORT               GPIOB
#define IIC1_SDA_GPIO_PIN                GPIO_PIN_7
#define IIC1_SDA_GPIO_CLK_ENABLE()       do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0)   /* PB口时钟使能 */

/******************************************************************************************/

/* IO操作 */
#define IIC1_SCL(x)        do{ x ? \
                              HAL_GPIO_WritePin(IIC1_SCL_GPIO_PORT, IIC1_SCL_GPIO_PIN, GPIO_PIN_SET) : \
                              HAL_GPIO_WritePin(IIC1_SCL_GPIO_PORT, IIC1_SCL_GPIO_PIN, GPIO_PIN_RESET); \
                          }while(0)       /* SCL */

#define IIC1_SDA(x)        do{ x ? \
                              HAL_GPIO_WritePin(IIC1_SDA_GPIO_PORT, IIC1_SDA_GPIO_PIN, GPIO_PIN_SET) : \
                              HAL_GPIO_WritePin(IIC1_SDA_GPIO_PORT, IIC1_SDA_GPIO_PIN, GPIO_PIN_RESET); \
                          }while(0)       /* SDA */

#define IIC1_READ_SDA     HAL_GPIO_ReadPin(IIC1_SDA_GPIO_PORT, IIC1_SDA_GPIO_PIN) /* 读取SDA */

#define point  0x80	//定义小数点


/* IIC所有操作函数 */
void iic1_init(void);                        /* 初始化IIC1的IO口 */
void iic1_start(void);                       /* 发送IIC1开始信号 */
void iic1_stop(void);                        /* 发送IIC1停止信号 */
uint8_t iic1_wait_ack(void);
void iic1_send_byte(uint8_t data);             //指定地址写入数据
void icc_Write_DATA(unsigned char add,unsigned char DATA);    //指定地址写入数据
void TM1650_cfg_display(uint8_t param);
void Clear(void);                                  //清屏
void Disp_Char_Fix(unsigned char add,unsigned char dis_char);  //指定地址显示数据,add代表数码管位置,dis_char为要显示的字符                        
void display(uint16_t date);
void Disp_Num(unsigned long Num);             //按十进制显示数字,超出范围直接返回

#endif


以下是基于HAL库的TM1637数码管显示标准库代码: 首先需要定义TM1637的相关参数: ```c #define TM1637_CLK_Pin GPIO_PIN_8 #define TM1637_CLK_GPIO_Port GPIOA #define TM1637_DIO_Pin GPIO_PIN_9 #define TM1637_DIO_GPIO_Port GPIOA #define TM1637_DIO_1 GPIOA->BSRR = TM1637_DIO_Pin #define TM1637_DIO_0 GPIOA->BRR = TM1637_DIO_Pin #define TM1637_CLK_1 GPIOA->BSRR = TM1637_CLK_Pin #define TM1637_CLK_0 GPIOA->BRR = TM1637_CLK_Pin ``` 然后定义TM1637的相关函数: ```c void TM1637_Start(void) { TM1637_DIO_1; TM1637_CLK_1; HAL_Delay(2); TM1637_DIO_0; } void TM1637_Stop(void) { TM1637_DIO_0; TM1637_CLK_1; HAL_Delay(2); TM1637_DIO_1; } void TM1637_WriteByte(uint8_t data) { uint8_t i; for (i = 0; i < 8; i++) { TM1637_CLK_0; if (data & 0x01) TM1637_DIO_1; else TM1637_DIO_0; data >>= 1; TM1637_CLK_1; } TM1637_CLK_0; TM1637_DIO_1; TM1637_CLK_1; TM1637_DIO_0; } void TM1637_Display(uint8_t *pBuffer) { uint8_t i; TM1637_Start(); TM1637_WriteByte(0x40); TM1637_Stop(); TM1637_Start(); TM1637_WriteByte(0xC0); for (i = 0; i < 4; i++) { TM1637_WriteByte(pBuffer[i]); } TM1637_Stop(); TM1637_Start(); TM1637_WriteByte(0x88); TM1637_Stop(); } ``` 最后,在主函数中调用TM1637_Display函数即可实现数码管的显示: ```c uint8_t pBuffer[4] = {0x00, 0x00, 0x00, 0x00}; while (1) { pBuffer[0] = 0x01; pBuffer[1] = 0x23; pBuffer[2] = 0x45; pBuffer[3] = 0x67; TM1637_Display(pBuffer); HAL_Delay(500); } ``` 以上代码仅供参考,具体实现需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值