tm1640驱动
#define CLK_H
#define CLK_L
#define DIN_H
#define DIN_L
// 延时5us
// ---------------------------------------------------------------------------
static void delay(void)
{
for (uint8_t i = 0; i < 40; i++)
{
}
}
// ---------------------------------------------------------------------------
static void start(void)
{
// 空闲状态
DIN_H;
CLK_H;
delay();
// 开始信号, CLK高时拉低DIN
DIN_L;
delay();
CLK_L;
delay();
}
// ---------------------------------------------------------------------------
static void stop(void)
{
DIN_L;
CLK_H;
delay();
// 结束信号,CLK高时拉高DIN
DIN_H;
delay();
}
// ---------------------------------------------------------------------------
static void send(uint8_t ch)
{
for (uint8_t mask = 0x1; mask; mask <<= 1)
{
if (ch & mask)
{
DIN_H;
}
else
{
DIN_L;
}
delay();
SCL_H;
delay();
SCL_L;
}
}
// ---------------------------------------------------------------------------
#define ON_1_16 (0x88+0)
#define ON_2_16 (0x88+1)
#define ON_4_16 (0x88+2)
#define ON_10_16 (0x88+3)
#define ON_11_16 (0x88+4)
#define ON_12_16 (0x88+5)
#define ON_13_16 (0x88+6)
#define ON_14_16 (0x88+7)
// ---------------------------------------------------------------------------
static void tm1640_set_brightness(void)
{
start();
send(ON_11_16);
stop();
}
// ---------------------------------------------------------------------------
static void tm1640_set_addr_mode(void)
{
start();
send(0x40);
stop();
}
uint8_t g_tm1640_buffer[16];
// ---------------------------------------------------------------------------
void tm1640_send_buffer(void)
{
start();
// 第一个GRID地址
send(0xc0);
for (uint8_t i = 0; i < 16; i++)
{
send(g_tm1640_buffer[i]);
}
stop();
}
void tm1640_init(void)
{
// TODO. 设置IO模式
tm1640_set_brightness();
tm1640_set_addr_mode();
tm1640_send_buffer();
}