一、前言
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);
}
四、源代码
五、特别鸣谢
|
|