aip650驱动

aip650.h

#ifndef __AIP650E_H__
#define __AIP650E_H__

#define AIP650E_SIZE 4

struct _650e_drv_
{
    // 用户数据
    uint8_t temp;       // 数码管显示  50 60 90 120

    uint8_t _buf[AIP650E_SIZE]; // 数据存储
};

extern struct _650e_drv_ sg_650e_drv;
#define GET_650E() (&sg_650e_drv)

extern void aip650e_init(struct _650e_drv_ *drv);           // 初始化
extern void aip650e_display_update(struct _650e_drv_ *drv); // 屏显数据更新
extern void aip650e_update(struct _650e_drv_ *drv);         // 执行刷新

/*测试模式定义 -- 如需开启测试模式, 请打开下面的宏定义*/
// #define AIP650_TEST_MODE
#ifdef AIP650_TEST_MODE
extern void test_aip650e(void);
#endif

#endif

aip650.c

#include "myinclude.h"
#include "aip650e.h"

/*管脚操作定义*/
#define SDA_PORT 
#define SDA_PIN 
#define SDA_SOURCE 
#define CLK_PORT 
#define CLK_PIN 
#define CLK_SOURCE 

#define SDA_SET GPIO_WriteBit(SDA_PORT, SDA_PIN, Bit_SET);	  // 拉高
#define SDA_RESET GPIO_WriteBit(SDA_PORT, SDA_PIN, Bit_RESET) // 拉低  SDA
#define SCL_SET GPIO_WriteBit(CLK_PORT, CLK_PIN, Bit_SET)	  // 拉高
#define SCL_RESET GPIO_WriteBit(CLK_PORT, CLK_PIN, Bit_RESET) // 拉低  SCL

#define SDA_READ() GPIO_ReadInputDataBit(SDA_PORT, SDA_PIN)

struct _650e_drv_ sg_650e_drv;

// 0 1 2 3 4 5 6 7 8 9 NULL -
uint8_t leddata[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x00, 0x40};

/*指令集*/
#define SYS_CMD 0x4801 // 48是系统指令,设置系统参数	;01是显示指令,设置为工作模式,8段显示,8级亮度,显示开

/*延时最小单元*/
#define TIME_UINT 1

static void delay_us(uint32_t nus)
{
	uint32_t Delay = nus;
	do
	{
		__NOP();
	} while (Delay--);
}

// IIC开始信号
static void start_i2c(void)
{
	SDA_SET;
	delay_us(TIME_UINT);
	SCL_SET;
	delay_us(TIME_UINT);
	SDA_RESET;
	delay_us(TIME_UINT);
	SCL_RESET;
	delay_us(TIME_UINT);
}

// static void stop_i2c(void)
 IIC停止信号
//{
//	SCL_SET;
//	delay_us(TIME_UINT);
//	SDA_RESET;
//	delay_us(TIME_UINT);
//	SDA_SET;
//	delay_us(TIME_UINT);
//	SDA_RESET;
//	SCL_RESET;
//}

// 数据传输-传送一个字节, 先读高位
static void send_byte(unsigned char dat)
{
	unsigned char i;
	for (i = 0; i < 8; i++)
	{
		SCL_RESET;
		if (dat & 0x80)
		{
			SDA_SET;
		}
		else
		{
			SDA_RESET;
		}
		SCL_SET;
		dat = dat << 1;
	}
	SCL_RESET;
	delay_us(TIME_UINT);
	SDA_RESET; // ACK信号
	delay_us(TIME_UINT);
	SCL_SET;
	delay_us(TIME_UINT);
	delay_us(TIME_UINT);
	SCL_RESET;
	delay_us(TIME_UINT);
}

static void sda_set_input(void)
{
	// sda配置为输入引脚
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_StructInit(&GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Pin = SDA_PIN;
	GPIO_Init(SDA_PORT, &GPIO_InitStruct);
}

static void sda_set_output(void)
{
	// sda配置为输出引脚
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_StructInit(&GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Pin = SDA_PIN;
	GPIO_Init(SDA_PORT, &GPIO_InitStruct);
	GPIO_WriteBit(SDA_PORT, SDA_PIN, (BitAction)(1));
}

static void wait_ack_i2c(void)
{
	uint8_t i = 1;
	sda_set_input();

	SCL_RESET;
	delay_us(TIME_UINT);
	SCL_SET;

	while (SDA_READ() && i <= 10)
	{
		i++;
	}

	SDA_SET;
	delay_us(TIME_UINT);
	SCL_RESET; // 时钟输出0
	sda_set_output();
	delay_us(TIME_UINT);
}

static void writeCMD(uint16_t cmd)
{
	start_i2c();
	send_byte(cmd >> 8);
	send_byte(cmd & 0xff);
	wait_ack_i2c();
}

/// @brief aip650e初始化
/// @param drv
void aip650e_init(struct _650e_drv_ *drv)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_StructInit(&GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Pin = SDA_PIN;
	GPIO_Init(SDA_PORT, &GPIO_InitStruct);
	GPIO_PinAFConfig(SDA_PORT, SDA_SOURCE, AF0_GPIO);
	GPIO_WriteBit(SDA_PORT, SDA_PIN, (BitAction)(1));

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStruct.GPIO_Pin = CLK_PIN;
	GPIO_Init(CLK_PORT, &GPIO_InitStruct);
	GPIO_PinAFConfig(CLK_PORT, CLK_SOURCE, AF0_GPIO);
	GPIO_WriteBit(CLK_PORT, CLK_PIN, (BitAction)(1));

	memset(drv->_buf, 0x00, AIP650E_SIZE);
	aip650e_update(drv); // 上电第一次清空显示
}

/// @brief 显示数据更新
/// @param drv

uint8_t test_i = 0;uint8_t temp = 0;
void aip650e_display_update(struct _650e_drv_ *drv)
{
	temp = 1;
	// 温度显示
	switch (temp)
	{
	case 0:
		// 温度显示---
		drv->_buf[0] = (drv->_buf[0] & ~0x7f) | leddata[11]; // -
		drv->_buf[1] = (drv->_buf[1] & ~0x7f) | leddata[11];
		drv->_buf[2] = (drv->_buf[2] & ~0x7f) | leddata[11];
		break;
	case 1:
		// 温度显示60
		drv->_buf[0] = (drv->_buf[0] & ~0x7f) | leddata[10]; // null
		drv->_buf[1] = (drv->_buf[1] & ~0x7f) | leddata[6];
		drv->_buf[2] = (drv->_buf[2] & ~0x7f) | leddata[0];
		break;
	case 2:
		// 温度显示90
		drv->_buf[0] = (drv->_buf[0] & ~0x7f) | leddata[10]; // null
		drv->_buf[1] = (drv->_buf[1] & ~0x7f) | leddata[9];
		drv->_buf[2] = (drv->_buf[2] & ~0x7f) | leddata[0];
		break;
	case 3:
		// 温度显示120
		drv->_buf[0] = (drv->_buf[0] & ~0x7f) | leddata[1];
		drv->_buf[1] = (drv->_buf[1] & ~0x7f) | leddata[2];
		drv->_buf[2] = (drv->_buf[2] & ~0x7f) | leddata[0];
		break;
	default:
		break;
	}

#ifdef AIP650_TEST_MODE
	drv->_buf[0] = (drv->_buf[0] & ~0x7f) | leddata[test_i];
	drv->_buf[1] = (drv->_buf[1] & ~0x7f) | leddata[test_i];
	drv->_buf[2] = (drv->_buf[2] & ~0x7f) | leddata[test_i];

	test_i++;
	if (test_i > 9)
		test_i = 0;
#endif
}

/// @brief 刷新屏显
/// @param drv
void aip650e_update(struct _650e_drv_ *drv)
{
	writeCMD(SYS_CMD); // 开显示,8级显示(0x4801);睡眠使能。时钟停振(0x4804)

	writeCMD(0x6800 | drv->_buf[0]); // com0显示
	writeCMD(0x6A00 | drv->_buf[1]); // com1显示
	writeCMD(0x6C00 | drv->_buf[2]); // com2显示
	writeCMD(0x6E00 | drv->_buf[3]); // com3显示
}

#ifdef AIP650_TEST_MODE
static void test_display(uint8_t data1, uint8_t data2, uint8_t data3, uint8_t data4)
{
	writeCMD(SYS_CMD); // 开显示,8级显示(0x4801);睡眠使能。时钟停振(0x4804)

	writeCMD(0x6800 | data1); // com0 显示
	writeCMD(0x6A00 | data3); // com1显示
	writeCMD(0x6C00 | data2); // com2显示
	writeCMD(0x6E00 | data4); // com3显示
}

/// @brief 测试程序
/// @param
uint8 test_dat = 0x01;
void test_aip650e(void)
{
	test_display(test_dat,
				 test_dat,
				 test_dat,
				 test_dat);

	test_dat = test_dat << 1;

	if (test_dat == 0)
	{
		test_dat = 0x01;
	}
}
#endif

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AIP650芯片是一款由无锡中微爱芯推出的带有键盘扫描电路接口的LED驱动控制专用芯片。可以使用KeilC51代码来编写AIP650驱动程序,只需简单修改GPIO宏定义即可套用程序。该程序可以应用于触摸按键指示灯。 在淘宝上可能没有带有按键检测的AIP650模组,所以有人选择自己画一个块来进行调试验证。 另外,如果你想获取AIP650芯片的详细信息和使用手册,你可以在资源中下载。链接为https://download.csdn.net/download/wanglong3713/40836173。该芯片的驱动程序也可以通用于GN1637和AIP1637等芯片。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [LED驱动,按键扫描芯片AIP650驱动程序](https://download.csdn.net/download/oHuanYing123/12552181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [[MM32生态]【MM32+模块】系列:07、数码管显示(二)](https://blog.csdn.net/ic2121/article/details/128048124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [4位数码管显示模块TM1637芯片C语言驱动程序](https://blog.csdn.net/wanglong3713/article/details/121110104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值