2022-07-23 18:08:23 +08:00

96 lines
2.4 KiB
C

/*
* TM1650.c
*
* Created on: 2022年03月12日
* Author: User
*/
#include <Main.h>
// 数码管显示数组
static uint8_t tab[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F, // 9
0x00, // 10 = Null
0x61, // 11 = 上c
};
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};
static void Init(void)
{
TM1650_Set(&IIC_1, 0x48, 0x31); //打开通道1 设置亮度3级 开显示
}
static void TM1650_Set(IIC_t *Channel, uint8_t Add, uint8_t Value)
{
IIC_t *const COM = Channel;
COM->start(); // iic开始
COM->write(Add); // iic写功能或者地址
COM->ACK(); //等待应答信号
COM->write(Value); // iic写设置数据或显示数据
COM->ACK(); //等待应答信号
COM->stop(); // iic停止
}
void TM1650_Display(IIC_t *Channel, uint16_t Value, uint8_t dot)
{
IIC_t *const IIC = Channel;
if (Value < 100)
{
TM1650_Set(IIC, DIG1, tab[10]); //如果温度不到100 关闭最高位数码管
}
else
{
TM1650_Set(IIC, DIG1, tab[Value % 1000 / 100]);
}
if (dot == 1) //判断是否加点
{
TM1650_Set(IIC, DIG2, (tab[Value % 100 / 10] | 0x80));
}
else
{
TM1650_Set(IIC, DIG2, tab[Value % 100 / 10]);
}
TM1650_Set(IIC, DIG3, tab[Value % 10 / 1]);
TM1650_Set(IIC, DIG4, tab[11]); //不带点 显示小c
}
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]); //第四位显示关闭
}
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]); //关闭显示
}