149 lines
3.5 KiB
C

/*
* TM1650.c
*
* Created on: 2022年03月12日
* Author: User
*/
#include <Main.h>
// 数码管显示数组
static xdata uint8_t tab[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x40, // 10 = -
0x79, // 11 = E
0x50, // 12 = r
0x00, // 13 = Null
0x09, // 14
0x58, // 15 = 下c
0x1c, // 16 = u
0x63, // 17 = 上o
0x39, // 18 = C
0x5C, // 19 = 下o
0x0f, // 20 = 大反C
0x61, // 21 = 上c
0x71, // 22 = F
0x37, // 23 = N
0x77, // 24 = A
0x10, // 25 下|
0x14 // 26 下|下|
};
static void Init(void); // tm1650初始化
static void TM1650_Set(IIC_t *Channel, uint8_t Add, uint8_t Value); //设置tm1650寄存器的值
static void Display_OFF(IIC_t *Channel); //显示OFF 字符
static void Display_Close(IIC_t *Channel); //显示暂时关闭
void TM1650_Display(IIC_t *Channel, uint16_t Value, uint8_t dot); //显示使能
TM1650_t TM1650 = {
1,
Init,
Display_OFF,
Display_Close};
/*
* @name Init
* @brief 1650初始化
* @param None
* @retval None
*/
static void Init(void)
{
TM1650_Set(&IIC_1, 0x48, 0x31); //打开通道1 设置亮度3级 开显示
}
/*
* @name TM1650_Set
* @brief 1650写数据
* @param Channel Add Value
* @retval None
*/
static void TM1650_Set(IIC_t *Channel, uint8_t Add, uint8_t Value)
{
IIC_t *const COM = Channel;
EA = 0;
COM->start(); // iic开始
COM->write(Add); // iic写功能或者地址
COM->ACK(); //等待应答信号
COM->write(Value); // iic写设置数据或显示数据
COM->ACK(); //等待应答信号
COM->stop(); // iic停止
EA = 1;
}
/*
* @name TM1650_Set
* @brief 1650显示函数
* @param Channel Value CHANNEL
* @retval None
*/
void TM1650_Display(IIC_t *Channel, uint16_t Value, uint8_t CHANNEL)
{
IIC_t *const IIC = Channel;
Init(); //每次显示以前初始化TM1650
if (CHANNEL == 1) //判断显示通道
{
TM1650_Set(IIC, DIG1, tab[25]); //显示|
}
else
{
TM1650_Set(IIC, DIG1, tab[26]); //显示||
}
if (Value < 100)
{
TM1650_Set(IIC, DIG2, tab[13]); //如果温度不到100 关闭最高位数码管
}
else
{
TM1650_Set(IIC, DIG2, tab[Value % 1000 / 100]);
}
TM1650_Set(IIC, DIG3, tab[Value % 100 / 10]);
TM1650_Set(IIC, DIG4, tab[Value % 10 / 1]);
// TM1650_Set(IIC, DIG1, tab[Value / 1000]);
// TM1650_Set(IIC, DIG2, tab[Value / 100 % 10]);
// TM1650_Set(IIC, DIG3, tab[Value / 10 % 10]);
// TM1650_Set(IIC, DIG4, tab[Value / 1 % 10]);
}
/*
* @name Display_OFF
* @brief TM1650显示OFF
* @param Channel
* @retval None
*/
static void Display_OFF(IIC_t *Channel)
{
IIC_t *const IIC = Channel;
TM1650_Set(IIC, DIG1, tab[0]); //第一位显示O
TM1650_Set(IIC, DIG2, tab[22]); //第二位显示F
TM1650_Set(IIC, DIG3, tab[22]); //第三位显示F
TM1650_Set(IIC, DIG4, tab[13]); //第四位显示关闭
}
/*
* @name Display_Close
* @brief 1650显示关闭
* @param Channel
* @retval None
*/
static void Display_Close(IIC_t *Channel)
{
IIC_t *const IIC = Channel;
TM1650_Set(IIC, DIG1, tab[13]); //关闭显示
TM1650_Set(IIC, DIG2, tab[13]); //关闭显示
TM1650_Set(IIC, DIG3, tab[13]); //关闭显示
TM1650_Set(IIC, DIG4, tab[13]); //关闭显示
}