发帖
3 0 0

AI-WB2增加BL1616_I2C数码管驱动芯片

邦邦
论坛元老

9

主题

24

回帖

4077

积分

论坛元老

积分
4077
Ai-WB2系列 82 3 昨天 13:29
一、前言
BL1616是8段×16位LED显示驱动芯片,内置时钟振荡电路,可以动态驱动8段×16位LED数码管,无需加三极管及电阻而直接驱动LED数码管/数码屏,且驱动电流大(8级辉度可调)。在单片机程序方面,只要刷新一次显示RAM数据而不用动态扫描,而且芯片带有键盘接口,3线或2线串行单片机通信,非常省单片机硬件和软件资源。轻轻松松2个或3个I/O就可驱动十几段到高达 120 多段数码管。

二、实现原理
直接使用内置I2C外设,高效方便。


三、代码实现原理
I2C主机模式初始化
static int i2c_example_master_init()
{
    i2c0.config.address_width = HOSAL_I2C_ADDRESS_WIDTH_7BIT,
    i2c0.config.freq = 100000,
    i2c0.config.mode = HOSAL_I2C_MODE_MASTER,
    i2c0.config.scl = 14,
    i2c0.config.sda = 11,

    i2c0.port = 0,

    hosal_i2c_init(&i2c0);

    return 0;
}

写数据到BL1616,给数码管加数据
static int i2c_Displays_registers_write(hosal_i2c_dev_t *i2c, uint8_t reg_address, uint8_t data)
{
    return hosal_i2c_master_send(&i2c0, (((reg_address << 1) | 0x60) & 0x7E), data, sizeof(data), 100);

}

控制BL1616
int i2c_Displays_controls_write(hosal_i2c_dev_t *i2c, uint8_t Pulse_width, uint8_t Display_switch)
{
    return hosal_i2c_master_send(&i2c0, 0x48, (((Pulse_width << 1) & 0x0e) | (Display_switch & 0x01)), 2, 100);

}

主函数,任务
//显示缓冲区
unsigned char segDisBuff[SEG_DIGIT_NUM];
SemaphoreHandle_t  xSemaphore_led;
//const unsigned char SegDigCode[10]=
//{SEG7_CODE_0,SEG7_CODE_1,SEG7_CODE_2,SEG7_CODE_3,SEG7_CODE_4,
//SEG7_CODE_5,SEG7_CODE_6,SEG7_CODE_7,SEG7_CODE_8,SEG7_CODE_9};

void i2c_task_example(void *arg)
{
    EventBits_t uxBits;
    unsigned char tmp[SEG_DIGIT_NUM] = {0};


    /* Create a mutex type semaphore. */
    xSemaphore_led = xSemaphoreCreateMutex();
   
    while(1)
    {
    uxBits = xEventGroupWaitBits(APP_event_group, \
                APP_event_SNTP_ok_flags_BIT, \
                pdFALSE,                               \
                pdFALSE,                               \
                1000 / portTICK_PERIOD_MS);
    if( ( uxBits & APP_event_SNTP_ok_flags_BIT ) == APP_event_SNTP_ok_flags_BIT )
    {
        i2c_example_master_init();

        i2c_Displays_controls_write(&i2c0,6,1);
        i2c_Displays_registers_write(&i2c0,0,SEG7_CODE_8 | SEG7_CODE_DP);
        i2c_Displays_registers_write(&i2c0,1,SEG7_CODE_8 | SEG7_CODE_DP);
        i2c_Displays_registers_write(&i2c0,2,SEG7_CODE_8_Rev_Rev | SEG7_CODE_DP_Rev_Rev);
        i2c_Displays_registers_write(&i2c0,3,SEG7_CODE_8_Rev_Rev | SEG7_CODE_DP_Rev_Rev);
        vTaskDelay(2000 / portTICK_PERIOD_MS);
        while (1){
            vTaskDelay(Displays_handoff / portTICK_PERIOD_MS);
            if(tmp[0] != segDisBuff[0]){
                i2c_Displays_registers_write(&i2c0,0,segDisBuff[0]);
                tmp[0] = segDisBuff[0];
            }
            if(tmp[1] != segDisBuff[1]){
                i2c_Displays_registers_write(&i2c0,1,segDisBuff[1]);
                tmp[1] = segDisBuff[1];
            }
            if(tmp[2] != segDisBuff[2]){
                i2c_Displays_registers_write(&i2c0,2,segDisBuff[2]);
                tmp[2] = segDisBuff[2];
            }
            if(tmp[3] != segDisBuff[3]){
                i2c_Displays_registers_write(&i2c0,3,segDisBuff[3]);
                tmp[3] = segDisBuff[3];
            }
        }
        vTaskDelete(NULL);  
    }
    else
    {
        vTaskDelay(500 / portTICK_PERIOD_MS);
    }            
    }
    vTaskDelete(NULL);
}

四、源代码
上传的附件: demo_BL1616.zip (281.97 KB, 下载次数: 0)


五、特别鸣谢



──── 0人觉得很赞 ────

使用道具 举报

你的帖子编辑怎么成这样了?
赞。楼主牛B,都倒过来了
还是第一次见到靠右对齐排版的
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28169 个
  • 话题数: 39965 篇