STM32F103C8T6驱动TM1637数码管显示(附代码)
1.TM1637数码管
TM1637数码管用I2C协议开发
DIO对应SDA
CLK对应SCL
共阴极数码管
2.I2C协议
根据手册,写LED显示数据的时候,按照从显示地址从低位到高位,从数据字节的低位到高位操作。所以I2C协议需要改为低位先行的发送方式(I2C协议需自己写)
void iic_send_byte(uint8_t byte)
{
/* 低位先行 */
uint8_t i;
for (i = 0; i < 8; i ++)
{
iic_w_sda(byte & (0x01 << i)); //先放最低位,左移i位
iic_w_scl(1); //每放一位施行释放SCL拉低SCL
iic_w_scl(0); //SCL以低位结束,方便拼接
}
}
3.数码管显示数据(地址固定模式)
1.由于我们需要在指定数码管上显示数值,我们需要选择固定地址模式
根据手册,固定地址模式选择0x44
2.选择显示地址
根据手册,起始地址位0xC0,选择对应的显示地址,即选择对应的数码管
3. 发送显示数据
完成第一步和第二步后,可以选择用I2C协议发送对应数据,比如0x3F代表数码管显示0。
4.段码表
unsigned char Digital_tube_code_table[] =
{
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00 //熄灭
};
5.数码管显示
void digi_tube_disp( uint8_t address, uint8_t value )
{
iic_start();
iic_send_byte(ADDRESS_FIXED);
iic_receive_ack();
iic_stop();
iic_start();
iic_send_byte(0xC0 | address);
iic_receive_ack();
iic_send_byte(Digital_tube_code_table[value]);
iic_receive_ack();
iic_stop();
}
6.设置数码管亮度
void digi_tube_set_bri(unsigned char level)
{
iic_start();
iic_send_byte(0x88| level);
iic_receive_ack();
iic_stop();
}
void digi_tube_off(void)
{
iic_start();
iic_send_byte(0x80);
iic_receive_ack();
iic_stop();
}
在B7B6B3选择101时即为打开显示,16进制为0x88,后三位表示亮度,亮度由程序来控制。
https://gitee.com/Thecoldcoffee/stm32_tm1637.git 这是gitee仓库