标题:
TM1650的驱动程序 在GD32f105单片机已经验证
[打印本页]
作者:
张明211
时间:
2023-3-16 10:18
标题:
TM1650的驱动程序 在GD32f105单片机已经验证
最近用到了TM1650,折腾一下,写驱动时严格按着时序要求。
#include "gd32f10x.h"
#include "Header.h"
#include "systick.h"
//产生IIC总线起始信号
static void TM1650_IIC_start(void)
{
TM1650_IIC_SCL_HIGH; //SCL=1
TM1650_IIC_SDA_HIGH; //SDA=1
DelayUs(100);
TM1650_IIC_SDA_LOW; //SDA=0
DelayUs(100);
TM1650_IIC_SCL_LOW; //SCL=0
}
//产生IIC总线结束信号
static void TM1650_IIC_stop(void)
{
TM1650_IIC_SDA_LOW; //SDA=0
DelayUs(100);
TM1650_IIC_SCL_HIGH;
DelayUs(100);
TM1650_IIC_SDA_HIGH; //SDA=1
DelayUs(100);
TM1650_IIC_SCL_LOW; //SCL=0
TM1650_IIC_SDA_LOW; //SDA=0
}
//通过IIC总线发送一个字节
static void TM1650_IIC_write_byte(uint8_t dat)
{
uint8_t i;
TM1650_IIC_SCL_LOW;
for(i=0;i<8;i++)
{
TM1650_IIC_SDA_WR(dat&0x80);
DelayUs(100);
TM1650_IIC_SCL_HIGH;
DelayUs(100);
TM1650_IIC_SCL_LOW;
DelayUs(100);
dat<<=1;
}
}
//通过IIC总线接收从机响应的ACK信号
void TM1650_IIC_wait_ack(void)
{
TM1650_IIC_SDA_HIGH; //SDA=1
DelayUs(100);
DelayUs(100);
TM1650_IIC_SCL_HIGH;
//TM1650_IIC_SDA_MODE_IF; //控制引脚为浮空输入
DelayUs(100);
//while(TM1650_IIC_SDA_RD()) //ack_signal = 1; //如果读取到的是NACK信号
//TM1650_IIC_SDA_MODE_OD; // 控制引脚为开漏输出
DelayUs(100);
TM1650_IIC_SCL_LOW;
DelayUs(100);
}
//TM1650初始化
void TM1650_init(void)
{
rcu_periph_clock_enable(RCU_AF);
rcu_periph_clock_enable(RCU_GPIOA); // 开时基
rcu_periph_clock_enable(RCU_GPIOC);
gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE); // 将PA15定义成普通IO
TM1650_IIC_SCL_MODE_OD; //SCL开漏输出
TM1650_IIC_SDA_MODE_OD; //SDA开漏输出
TM1650_IIC_SDA_HIGH; //释放SDA线
TM1650_IIC_SCL_HIGH; //释放SCL线
TM1650_cfg_display(TM1650_BRIGHT5); //初始化为5级亮度,打开显示
TM1650_clear(); //将显存内容清0
delay_1ms(20);
}
//作用:设置显示参数
//备注:这个操作不影响显存中的数据
//用例:
// 设置亮度并打开显示: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++)
{
TM1650_print(dig,0); //将显存数据刷为0
}
}
//往一个指定的数码管位写入指定的显示数据
//共阴数码管段码表:
//const uint8_t TUBE_TABLE_0[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴,0~9的数字
//const uint8_t TUBE_TABLE_0[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴,0~9~A~F
//用例:
// 在DIG1位上显示数字3: TM1650_print(TM1650_DIG1,TUBE_TABLE_0[3]);
void TM1650_print(uint8_t dig,uint8_t seg_data)
{
TM1650_IIC_start();
TM1650_IIC_write_byte(dig*2+0x68); TM1650_IIC_wait_ack(); //显存起始地址为0x68
TM1650_IIC_write_byte(seg_data); TM1650_IIC_wait_ack(); //发送段码
TM1650_IIC_stop();
}
复制代码
TM1650.h
#ifndef TM1650_H_
#define TM1650_H_
#include "header.h"
#include "gd32f10x.h"
#define GPIO_SCL GPIOC
#define GPIO_Pin_SCL GPIO_PIN_12
#define GPIO_SDA GPIOA
#define GPIO_Pin_SDA GPIO_PIN_15
//==========【配置IIC驱动引脚】========
//配置驱动SCL的gpio为开漏输出模式
#define TM1650_IIC_SCL_MODE_OD gpio_init(GPIO_SCL, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_Pin_SCL)
//配置驱动SDA的gpio为开漏输出模式
#define TM1650_IIC_SDA_MODE_OD gpio_init(GPIO_SDA, GPIO_MODE_OUT_PP , GPIO_OSPEED_50MHZ, GPIO_Pin_SDA)
#define TM1650_IIC_SDA_MODE_IF gpio_init(GPIO_SDA, GPIO_MODE_IN_FLOATING , GPIO_OSPEED_50MHZ, GPIO_Pin_SDA)
//=====================================
//========【配置IIC总线的信号读写和时序】=======
//主机拉高SCL
#define TM1650_IIC_SCL_HIGH gpio_bit_set(GPIO_SCL,GPIO_Pin_SCL)
//主机拉低SCL
#define TM1650_IIC_SCL_LOW gpio_bit_reset(GPIO_SCL,GPIO_Pin_SCL)
//主机拉高SDA
#define TM1650_IIC_SDA_HIGH gpio_bit_set(GPIO_SDA,GPIO_Pin_SDA)
//主机拉低SDA
#define TM1650_IIC_SDA_LOW gpio_bit_reset(GPIO_SDA,GPIO_Pin_SDA)
//参数b为0时主机拉低SDA,非0则拉高SDA
#define TM1650_IIC_SDA_WR(b) do{ \
if(b) gpio_bit_set(GPIO_SDA,GPIO_Pin_SDA); \
else gpio_bit_reset(GPIO_SDA,GPIO_Pin_SDA); \
}while(0)
//主机读取SDA线电平状态,返回值为0为低电平,非0则为高电平
#define TM1650_IIC_SDA_RD() gpio_input_bit_get(GPIO_SDA,GPIO_Pin_SDA)
//软件延时2us
//#define TM1650_IIC_DELAY_2US do{for(int ii_=0;ii_<22;ii_++);}while(0)
//软件延时4us
//#define TM1650_IIC_DELAY_4US do{for(int ii_=0;ii_<40;ii_++);}while(0)
//================================
//显示参数
#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 TM1650_init(void);
void TM1650_cfg_display(uint8_t param);
void TM1650_clear(void);
void TM1650_print(uint8_t dig,uint8_t seg_data);
#endif //TM1650_H_
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1