应用场景


#ifndef __TM1650_H
#define __TM1650_H
#include "main.h"
//显示参数
#define TM1650_BRIGHT1 0x11 /*一级亮度,打开LED显示*/
#define TM1650_BRIGHT2 0x21 /*二级亮度,打开LED显示*/
#define TM1650_BRIGHT3 0x31 /*三级亮度,打开LED显示*/
#define TM1650_BRIGHT4 0x41 /*四级亮度,打开LED显示*/
#define TM1650_BRIGHT5 0x51 /*五级亮度,打开LED显示*/
#define TM1650_BRIGHT6 0x61 /*六级亮度,打开LED显示*/
#define TM1650_BRIGHT7 0x71 /*七级亮度,打开LED显示*/
#define TM1650_BRIGHT8 0x01 /*八级亮度,打开LED显示*/
#define TM1650_DSP_OFF 0x00 /*关闭LED显示*/
//数码管位选
#define TM1650_DIG1 0
#define TM1650_DIG2 1
#define TM1650_DIG3 2
#define TM1650_DIG4 3
void ALR_TM1650_init(void);
void TM1650_cfg_display(uint8_t param);
void TM1650_clear(void);
//========【配置IIC总线的信号读写和时序】=======
//主机拉高SCL
#define SCL PCout(6)
//主机拉高SDA
#define SDA PCout(5)
//主机读取SDA线电平状态,返回值为0为低电平,非0则为高电平
#define TM1650_IIC_SDA_RD() PCin(5)// GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
//软件延时4us
#define TM1650_IIC_DELAY_4US do{for(int ii_=0;ii_<100;ii_++);}while(0)
//================================
void SDA_OUT(void);
void SDA_IN(void);
void Display_Fix(unsigned char add,unsigned char DATA);
void disp(u16 num);
#endif
#include "tm1650.h"
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
//I2C模拟
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
//I2C模拟
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//产生IIC总线起始信号
//数据输入开始条件是CLK高时候,DIO由高变成低
static void TM1650_IIC_start(void)
{
// SDA_OUT();
// TM1650_IIC_SCL_HIGH; //SCL=1
// TM1650_IIC_DELAY_4US;
// TM1650_IIC_SDA_HIGH; //SDA=1
// TM1650_IIC_DELAY_4US;
// TM1650_IIC_SDA_LOW; //SDA=0
// TM1650_IIC_DELAY_4US;
// TM1650_IIC_SCL_LOW;
// TM1650_IIC_DELAY_4US;
SDA_OUT();
SCL = 1; //SCL=1
TM1650_IIC_DELAY_4US;
SDA = 1; //SDA=1
TM1650_IIC_DELAY_4US;
SDA = 0;; //SDA=0
TM1650_IIC_DELAY_4US;
SCL = 0;;
TM1650_IIC_DELAY_4US;
}
//产生IIC总线结束信号
//数据输入结束条件是CLK高时候,DIO由低变成高
static void TM1650_IIC_stop(void)
{
SDA_OUT();
SCL = 0; //SCL=0
TM1650_IIC_DELAY_4US;
SDA = 0; //SDA=0
TM1650_IIC_DELAY_4US;
SCL = 1;
TM1650_IIC_DELAY_4US;
SDA = 1; //SDA=1
TM1650_IIC_DELAY_4US;
}
//通过IIC总线接收从机响应的ACK信号
//TM1650_READ_DIO 是读取SDA信号
static u8 TM1650_IIC_wait_ack(void)
{
uint8_t ack_signal = 0;
SCL = 0;
TM1650_IIC_DELAY_4US;
SDA = 1; //SDA=1
TM1650_IIC_DELAY_4US;
SCL = 1;
TM1650_IIC_DELAY_4US;
SDA_IN();
while(TM1650_IIC_SDA_RD()==1)
{
TM1650_IIC_DELAY_4US;
ack_signal++;
if(ack_signal >= 10)
{
TM1650_IIC_stop();
TM1650_IIC_DELAY_4US;
return 1;
}
}
SCL = 0;
TM1650_IIC_DELAY_4US;
return 0;
}
//通过IIC总线发送一个字节
static void TM1650_IIC_write_byte(uint8_t dat)
{
uint8_t i;
SDA_OUT();
for(i=0;i<8;i++)
{
SCL = 0;
TM1650_IIC_DELAY_4US;
if(dat >> 7)
{
SDA = 1; //SDA=1
}
else
{
SDA = 0;
}
dat <<= 1;
TM1650_IIC_DELAY_4US;
SCL = 1;
}
SCL = 0;
TM1650_IIC_DELAY_4US;
SDA = 1;
TM1650_IIC_DELAY_4US;
}
//数码管显示
void Write_DATA(u8 add, u8 DATA)
{
TM1650_IIC_start();
TM1650_IIC_write_byte(add);
TM1650_IIC_wait_ack();
TM1650_IIC_write_byte(DATA);
TM1650_IIC_wait_ack();
TM1650_IIC_stop();
}
void Display_Fix(unsigned char add,unsigned char DATA) //指定地址写入显示数据
{
if(add>3) return;
else
Write_DATA(0x68+(2*add),DATA);
}
//作用:设置显示参数
//备注:这个操作不影响显存中的数据
//用例:
// 设置亮度并打开显示:TM1650_cfg_display(TM1650_BRIGHTx)
// 关闭显示:TM1650_cfg_display(TM1650_DSP_OFF)
void TM1650_cfg_display(uint8_t param)
{
TM1650_IIC_start();
TM1650_IIC_write_byte(0x48); TM1650_IIC_wait_ack(); //固定命令
TM1650_IIC_write_byte(param); TM1650_IIC_wait_ack(); //参数值
TM1650_IIC_stop();
}
//将显存数据全部刷为0,清空显示
void TM1650_clear(void)
{
uint8_t dig;
for(dig = TM1650_DIG1 ; dig<= TM1650_DIG4 ;dig++)
{
Display_Fix(dig,0XFF); //将显存数据刷为0
}
}
const uint8_t TABLE_0[10] ={0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92,0X82, 0XF8, 0X80,0X90};
void disp(u16 num)
{
u8 a,b,c;
a = num / 100;
b = num %100 /10;
c = num %10;
Write_DATA(0X48,TM1650_BRIGHT1);
Display_Fix(0,0xcf);
Display_Fix(1,TABLE_0[a]);
Display_Fix(2,TABLE_0[b]);
Display_Fix(3,TABLE_0[c]);
}
//TM1650初始化
void ALR_TM1650_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Schmit = GPIO_Schmit_Disable;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
Write_DATA(0X48,TM1650_BRIGHT1);
TM1650_clear(); //将显存内容清0
}