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