TM1648A_LED触摸IC开发

TM1648A 开发


前言

本文介绍了TM1648A 这款led触摸IC相关应用开发


链接:TM1648A规格书

一、寄存器说明

序号寄存器地址R/W初始值功能说明备注
10XBDW0X00显示模式设置-
20XBEW0X00数据读写及地址增加模式设置-
3-160XC0-0XCDW0X00显示内容设置控制灯光
40XBFW0X00显示开关及亮度设置-
190XCEW0X00蜂鸣器响声时间设置-
200xCFW0X00休眠模式设置-
210XF0R0X00触摸按键寄存器按键操作

二、通信协议


TM1648A 通过I2C协议与其他设备进行通信,其中每次通信支持单字节读出多字节写入 ,具体格式附上图。

三、通信流程

代码如下:

1.发送数据

void TM1648A_SEND_BYTE(uint8_t data, uint8_t adress)
{


		//打开开关
	  	IIC_START();
		IIC_SENDBYTE(TM1648A_ADDRESS);  //发送设备地址
		IIC_WaitAck();
		Delay_us(100);       //busy
		
		IIC_SENDBYTE(SWITCH_BRIGHT);   //发送设备数据地址
		IIC_WaitAck();
		Delay_us(100);       //busy
		

		IIC_SENDBYTE(0x8F);   //发送数据 显示打开
		IIC_WaitAck();
		Delay_us(100);       //busy
		
		IIC_STOP();
		Delay_us(5);
		
		
		IIC_START();
		IIC_SENDBYTE(TM1648A_ADDRESS);  //发送设备地址
		IIC_WaitAck();
		Delay_us(100);       //busy
		
		IIC_SENDBYTE(adress);   //发送设备数据地址
		IIC_WaitAck();
		Delay_us(100);       //busy
		

		IIC_SENDBYTE(data);   //发送数据
		IIC_WaitAck();
		Delay_us(100);       //busy
		
		IIC_STOP();
		Delay_us(5);

}

2.读取数据

uint8_t TM1648A_READ_BYTE()
{
		uint8_t data;  //存储接收数据
	
		IIC_START();
		IIC_SENDBYTE(TM1648A_ADDRESS);  //发送设备地址
		IIC_Ack();
		Delay_us(100);       //busy
		
		IIC_SENDBYTE(KRY_TOUCH);   //发送设备数据地址
		IIC_Ack();
		Delay_us(100);       //busy
	
	  	IIC_START();
		IIC_SENDBYTE(TM1648A_R_ADDRESS);  //发送设备地址
		IIC_Ack();
		Delay_us(100);       //busy
		

		data = IIC_ReadByte();   //读取数据
		IIC_NAck();
		Delay_us(100);       //busy
		
		IIC_STOP();
		Delay_us(5);
	
		return data;
}

3.i2c

void IIC_SetSDAOutputMode(void)
{
	/* enable the led clock */
    rcu_periph_clock_enable(RCU_GPIOB);
	systick_config();
	
    /* configure led GPIO port */ 
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_0);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,  GPIO_PIN_0);
}

void IIC_SetSDAInputMode(void)
{

	/* enable the led clock */
    rcu_periph_clock_enable(RCU_GPIOB);
	systick_config();
	
    /* configure led GPIO port */ 
    gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
}

//IIC通信的起始位(开始信号的发送)
void IIC_START(void)
{
	//确保引脚为输出模式
	IIC_SetSDAOutputMode();
	
	//直接拉高,确保可以正常发送起始信号
	SDA_1;
	SCL_1;
	Delay_us(5);
	
	SDA_0;
	Delay_us(5);	//用于等待引脚电平稳定;

	//发送起始信号后, 为了方便直接发送器件地址,直接把SCL线拉低
	SCL_0;
	Delay_us(5);
}


void IIC_STOP(void)
{
	//确保引脚为输出模式
	IIC_SetSDAOutputMode();
	
	//全部拉低,确保后续能全部拉高
	SDA_0;
	SCL_0;
	Delay_us(5);
	
	//SCL拉高
	SCL_1;
	Delay_us(5);
	
	//SDA从低电平切换为高电平:以发送停止位
	SDA_1;
	Delay_us(5);
}

//IIC发送:数据或者地址或者命令
void IIC_SENDBYTE(uint8_t data)
{
	uint8_t i = 0;
	
	//确保引脚为输出模式
	IIC_SetSDAOutputMode();
	
	//两根线全部拉低,方便数据的发送(SCL为低电平时,SDA才可以更改电平位)
	SDA_0;
	SCL_0;
	Delay_us(5);
	
	for(i=0; i<8; i++)
	{
		//判断数据的的最高位是否为1(MSB最高位先发送)MSB:高位先出
		if(data & 0x80)
		{
			SDA_1;
		}
		else
		{
			SDA_0;
		}
		Delay_us(5);
		
		//把SCL拉高以便通知从器件读取SDA引脚数据
		SCL_1;
		Delay_us(5);
		
		data<<= 1;

		//为了方便发送第二个位,直接把SCL拉低,方便数据的发送(SCL为低电平时,SDA才可以更改电平位)
		SCL_0;
		Delay_us(5);
	}
}

//IIC主机接收从机应答
int IIC_WaitAck(void)
{
	int ack = 0;
	
	//确保引脚为输入模式
	IIC_SetSDAInputMode();
	
	//允许从机应答:SCL线需要拉低
	SCL_0;
	Delay_us(5);
	
	//一旦从机应答,即拉高SCL,锁定SDA的电平以稳定读取SDA的电平位
	SCL_1;
	Delay_us(5);
	
	//读取SDA线的电平位
	if(IIC_SDA_READ == 0)	//从机
	{
		ack = 0;	//从机应答
	}
	else
	{
		ack = 1;
	}
	
	//为了方便后续数据的发送,直接把SCL拉低(SCL为低电平时,SDA才可以更改电平位)
	SCL_0;
	Delay_us(5);
	
	return ack;
}

//主机读取从机1个字节数据(应答是1bit)
uint8_t IIC_ReadByte(void)
{
	uint8_t i = 0, data = 0;
	
	//确保引脚为输入模式
	IIC_SetSDAInputMode();

	for(i=0; i<8; i++)
	{
		//由于时钟线是由主机控制的,所以得要由主机把SCL拉高稳定从机发送的数据
		SCL_1;
		Delay_us(5);
		
		data <<= 1;	//先左移保存之前获取到的1bit数据,在或赋值操作
		
		if(IIC_SDA_READ == 1)	//读取SDA引脚数据
		{
			 data |= 0x01;	//0000 0000 |= 0000 0001
		}
		
		//由于时钟线是由主机控制的,所以得要由主机把SCL拉低通知从机发送数据
		SCL_0;		//允许从机更改SDA线的电平位
		Delay_us(5);
	}
	
	return data;
}

void IIC_Ack(void)
{
   	IIC_SetSDAOutputMode();
    //数据线一直保持为低电平,时钟线出现上升沿即为应答
    //CW2217_SDA_PIN_SET_OUT;
    //Delay_xus(1);
    SCL_0; //将时钟线拉低允许数据改变
    SDA_0; //数据线拉低,保持为低电平
    Delay_us(5);
    SCL_1; //时钟线拉高,产生上升沿
    Delay_us(5);
    //应答完成后,将时钟线拉低,允许数据修改
    SCL_0; //时钟线拉低
    SDA_1; //数据线拉高,允许数据修改
    Delay_us(5);
}

void IIC_NAck(void)
{
	IIC_SetSDAOutputMode();
    //数据线一直保持为高电平,时钟线出现上升沿即为非应答
    //CW2217_SDA_PIN_SET_OUT;
    //Delay_xus(1);
    SCL_0; //将时钟线拉低允许数据改变
    SDA_1; //数据线拉高,保持为高电平
    Delay_us(5);
    SCL_1; //时钟线拉高,产生上升沿
    Delay_us(5);
    //应答完成后,将时钟线拉低,允许数据修改
    SCL_0; //时钟线拉低
    SDA_1; //数据线拉高,允许数据修改
    Delay_us(1);
}



四、按键控制

TM1648A中的寄存器0XF0用来用作I2C读取按键触摸数据的寄存器。Bit7-Bit0用于指示相应的触摸按键Key8-Key1是否被触摸。
(注:若所读寄存器不为0XF0,则返回为0XFF)

寄存器:0XF0

Bit76543210
R/WRRRRRRRR
Bit00000000

Bit7-0 按键读取位
0:未按下
1:按下

五、led控制

以驱动共阴LED为例:
在这里插入图片描述
寄存器CH0(GRID1)

Bit76543210
NameSEG8SEG7SEG6SEG5SEG4SEG3SEG2SEG1
R/WWWWWWWWW
Bit00000000

Bit7-0 LED写入位
0:不亮
1:点亮
注:无论是驱动共阴还是共阳led,SEG引脚只能接led阳极,GRID只能接led阴极。

总结

TM1648A这款芯片已开发,原理简单,能适应很多场景,主要技术实现包括I2C通信和寄存器的读写。

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的驱动TM1648A的MicroPython代码示例: ```python # 导入需要的库 from machine import Pin, I2C import time # 定义TM1648A的I2C地址和指令 TM1648A_I2C_ADDR = 0x24 TM1648A_CMD_DATA = 0x40 TM1648A_CMD_CONTROL = 0x80 # 定义TM1648A的控制指令 TM1648A_CTRL_DISPLAY_ON = 0x08 TM1648A_CTRL_DISPLAY_OFF = 0x00 TM1648A_CTRL_BRIGHTNESS = 0x00 # 定义TM1648A的数据缓存 TM1648A_DATA = bytearray(17) # 初始化I2C总线 i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=100000) # 初始化TM1648A def tm1648a_init(): # 发送控制指令,打开显示,设置亮度为最高 i2c.writeto(TM1648A_I2C_ADDR, bytes([TM1648A_CMD_CONTROL | TM1648A_CTRL_DISPLAY_ON | TM1648A_CTRL_BRIGHTNESS])) # 清空数据缓存 TM1648A_DATA[0] = TM1648A_CMD_DATA for i in range(1, 17): TM1648A_DATA[i] = 0x00 # 发送数据,更新显示 i2c.writeto(TM1648A_I2C_ADDR, TM1648A_DATA) # 设置TM1648A的某个LED灯的状态 def tm1648a_set_led(led, state): # 计算LED灯所在的字节和位 byte = led // 8 + 1 bit = 1 << (led % 8) # 修改数据缓存中对应的位 if state: TM1648A_DATA[byte] |= bit else: TM1648A_DATA[byte] &= ~bit # 发送数据,更新显示 i2c.writeto(TM1648A_I2C_ADDR, TM1648A_DATA) # 设置TM1648A的所有LED灯的状态 def tm1648a_set_leds(leds): # 修改数据缓存 for i in range(16): byte = i // 8 + 1 bit = 1 << (i % 8) if leds[i]: TM1648A_DATA[byte] |= bit else: TM1648A_DATA[byte] &= ~bit # 发送数据,更新显示 i2c.writeto(TM1648A_I2C_ADDR, TM1648A_DATA) # 清空TM1648A的所有LED灯 def tm1648a_clear(): # 修改数据缓存 for i in range(16): byte = i // 8 + 1 bit = 1 << (i % 8) TM1648A_DATA[byte] &= ~bit # 发送数据,更新显示 i2c.writeto(TM1648A_I2C_ADDR, TM1648A_DATA) # 测试程序 tm1648a_init() while True: for i in range(16): tm1648a_set_led(i, True) time.sleep(0.1) for i in range(16): tm1648a_set_led(i, False) time.sleep(0.1) ``` 这个例程定义了一些常量,包括TM1648A的I2C地址和指令,以及控制指令和数据缓存。然后定义了一些函数,包括初始化函数、设置单个LED灯状态的函数、设置多个LED灯状态的函数、清空所有LED灯的函数。最后是一个测试程序,循环点亮和熄灭所有LED灯。请注意,这个例程仅供参考,具体实现还需要根据硬件接口和具体应用场景进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值