数码管的逻辑
通过数码管来表示字符。
数码管的abcdefg和dp分别对应这发送过去的8位数据位比如0x3F -> 0011 1111 表示0字符。
如果要加上小数点则在最高位加一,变成了 1011 1111。
TM1650 原理
SCL:串行通信时钟线
SDA:串行通信数据线
做数码管驱动使用时
DIGx:数码管的位选引脚,灌电流驱动,最大可吸收150mA电流
A~DP:数码管的段驱动引脚,拉电流驱动,最大可输出25mA电流
这个指令用于设置数码管显示的相关参数。例如亮度,7段或者8段显示,显示的开关。模式命令固定为0x48,而显示命令则满足以下格式:
TM1650内部有4字节的显存,地址分别为0x68,0x6A,0x6C,0x6E,分别用于存放显示在DIG1,DIG2,DIG3,DIG4的段码数据。例如想要让DIG1对应的数码管位显示数字2,则要往0x68单元写入数字2的共阴段码0x5b。
模拟I2C的实现
这边主要参考了Leung_ManWah老哥
static void SDA_OUT_MODE(void);
static void SDA_IN_MODE(void);
void IIC2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStructure.Pin = IIC_SCL_PIN;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStructure.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(IIC_SCL_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = IIC_SDA_PIN;
HAL_GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);
IIC_Stop();
}
void IIC_Start(void)
{
SDA_OUT_MODE();
IIC_SDA_1();
IIC_SCL_1();
HAL_Delay(1);
IIC_SDA_0();
HAL_Delay(1);
IIC_SCL_0();
}
void IIC_Stop(void)
{
SDA_OUT_MODE();
IIC_SCL_0();
IIC_SDA_0();
IIC_SCL_1();
HAL_Delay(1);
IIC_SDA_1();
HAL_Delay(1);
}
void IIC_SendByte(uint8_t ucByte)
{
uint8_t i;
SDA_OUT_MODE();
IIC_SCL_0();
for (i = 0; i < 8; i++)
{
if (ucByte & 0x80)
{
IIC_SDA_1();
}
else
{
IIC_SDA_0();
}
ucByte <<= 1;