kehuadong

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();
}

 

posted on 2024-04-08 16:39  kehuadong  阅读(29)  评论(0编辑  收藏  举报

导航