最近用TM1650驱动的数码管做了一个万年历,特地把TM1650的STM32驱动程序分享出来以供大家使用,亲测可以用!!!!
接线:
1.SCL接PB10;
2.SDA接PB11;
源程序如下:
tm1650.c:
-
#include "stm32f10x.h"
-
#include "sys_conf.h"
-
#include
-
-
void DelayXms(unsigned int count)
-
{
-
unsigned int i,j;
-
for(i=0; i
-
{
-
//WatchDOG();
-
for(j=0; j<7968; j++)
-
{
-
__NOP();
-
-
}
-
-
}
-
}
-
-
-
void DelayXus(unsigned int count)
-
{
-
unsigned int i,j;
-
for(i=0; i
-
{
-
for(j=0; j<8; j++)
-
{
-
__NOP();
-
-
}
-
-
}
-
}
-
void IIC_Init(void)
-
{
-
GPIO_InitTypeDef GPIO_InitStructure;
-
-
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
-
-
-
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
-
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-
GPIO_Init(GPIOB, &GPIO_InitStructure);
-
-
-
}
-
-
void SDA_IN(void)
-
{
-
GPIO_InitTypeDef GPIO_InitStructure;
-
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
-
GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
-
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-
GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
-
}
-
-
void SDA_OUT(void)
-
{
-
GPIO_InitTypeDef GPIO_InitStructure;
-
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
-
GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
-
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-
GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
-
}
-
-
-
-
/***************************************************************************
-
- 功能描述:STM32f103 模拟IIC起始信号函数
-
- 隶属模块:STM32 IIC操作
-
- 函数属性:外部,使用户使用
-
- 参数说明:无
-
- 返回说明:无
-
- 函数实现步骤:
-
(1)首先将SDA配置为输出
-
(2)在SCL为高电平期间,SDA有下降沿的变化
-
***************************************************************************/
-
void IIC_Start(void)
-
{
-
SDA_OUT(); //sda线输出
-
Set_IIC_SDA;
-
Set_IIC_SCL;
-
DelayXus(4);
-
Clr_IIC_SDA;//START:when CLK is high,DATA change form high to low
-
DelayXus(4);
-
Clr_IIC_SCL;//钳住I2C总线,准备发送或接收数据
-
}
-
/***************************************************************************
-
- 功能描述:STM32f103 模拟IIC终止信号函数
-
- 隶属模块:STM32 IIC操作
-
- 函数属性:外部,使用户使用
-
- 参数说明:无
-
- 返回说明:无
-
- 函数实现步骤:
-
(1)首先将SDA配置为输出
-
(2)在SCL为高电平期间,SDA有上升沿的变化
-
***************************************************************************/
-
void IIC_Stop(void)
-
{
-
SDA_OUT();//sda线输出
-
Clr_IIC_SCL;
-
Clr_IIC_SDA;//STOP:when CLK is high DATA change form low to high
-
DelayXus(4);
-
Set_IIC_SCL;
-
Set_IIC_SDA;//发送I2C总线结束信号
-
DelayXus(4);
-
}
-
-
/***************************************************************************
-
- 功能描述:STM32f103 模拟IIC等待应答函数
-
- 隶属模块:STM32 IIC操作
-
- 函数属性:外部,使用户使用
-
- 参数说明:无
-
- 返回说明:返回值:1,接收应答失败;0,接收应答成功
-
- 函数说明:
-
(1)首先将SDA配置为输入
-
(2)如果返回0,表示接收应答成功;如果为1,接收应答失败
-
(3)注意在IIC_STOP()中 ,将SDA置为了输出,所以再满足250条件后,产中IIC停止线号,
-
对输出线SDA读SDA输入值是为0的,所以才退出循环。
-
***************************************************************************/
-
u8 IIC_Wait_Ack(void)
-
{
-
u8 ucErrTime=0;
-
SDA_IN(); //SDA设置为输入
-
Set_IIC_SDA;
-
DelayXus(1);
-
Set_IIC_SCL;
-
DelayXus(1);
-
while(READ_SDA)
-
{
-
ucErrTime++;
-
if(ucErrTime>250)
-
{
-
IIC_Stop();
-
return 1;
-
}
-
}
-
Clr_IIC_SCL;//时钟输出0
-
return 0;
-
}
-
/***************************************************************************
-
- 功能描述:STM32f103 模拟IIC应答信号函数
-
- 隶属模块:STM32 IIC操作
-
- 函数属性:外部,使用户使用
-
- 参数说明:无
-
- 返回说明:无
-
- 函数实现步骤:
-
(1)首先将SDA配置为输出
-
(2)在SCL的一个时钟周期期间,SDA为低
-
***************************************************************************/
-
//产生ACK应答
-
void IIC_Ack(void)
-
{
-
Clr_IIC_SCL;
-
SDA_OUT();
-
Clr_IIC_SDA;
-
DelayXus(2);
-
Set_IIC_SCL;
-
DelayXus(2);
-
Clr_IIC_SCL;
-
}
-
/***************************************************************************
-
- 功能描述:STM32f103 模拟IIC不应答信号函数
-
- 隶属模块:STM32 IIC操作
-
- 函数属性:外部,使用户使用
-
- 参数说明:无
-
- 返回说明:无
-
- 函数实现步骤:
-
(1)首先将SDA配置为输出
-
(2)在SCL的一个时钟周期期间,SDA为高电平
-
***************************************************************************/
-
void IIC_NAck(void)
-
{
-
Clr_IIC_SCL;
-
SDA_OUT();
-
Set_IIC_SDA;
-
DelayXus(2);
-
Set_IIC_SCL;
-
DelayXus(2);
-
Clr_IIC_SCL;
-
}
-
/***************************************************************************
-
- 功能描述:STM32f103 模拟IIC 发送一个字节函数
-
- 隶属模块:STM32 IIC操作
-
- 函数属性:外部,使用户使用
-
- 参数说明:无
-
- 返回说明:无
-
- 函数实现步骤:
-
(1)首先将SDA配置为输出
-
(2)在SCL为低电平期间,置位SDA的数据为0或者1,延时后拉高SCL,取走数据,循环8次
-
***************************************************************************/
-
void IIC_Send_Byte(u8 txd)
-
{
-
u8 t;
-
SDA_OUT();
-
Clr_IIC_SCL;//拉低时钟开始数据传输
-
for(t=0;t<8;t++)
-
{
-
//IIC_SDA=(txd&0x80)>>7;
-
if ((txd&0x80)>>7)
-
Set_IIC_SDA;
-
else Clr_IIC_SDA;
-
txd<<=1;
-
DelayXus(2); //对TEA5767这三个延时都是必须的
-
Set_IIC_SCL;
-
DelayXus(2);
-
Clr_IIC_SCL;
-
DelayXus(2);
-
}
-
}
-
-
/***************************************************************************
-
- 功能描述:STM32f103 模拟IIC 发送一个字节函数
-
- 隶属模块:STM32 IIC操作
-
- 函数属性:外部,使用户使用
-
- 参数说明:ack 用于决定是是否回应ACK
-
- 返回说明:无
-
- 函数实现步骤:
-
(1)首先将SDA配置为输入
-
(2)在SCL的一个时钟周期后,读SDA的数据,保存在receive中
-
(3)读1个字节,ack=1时,发送ACK,ack=0,发送nACK
-
-
***************************************************************************/
-
u8 IIC_Read_Byte(unsigned char ack)
-
{
-
unsigned char i,receive=0;
-
SDA_IN();//SDA设置为输入
-
for(i=0;i<8;i++ )
-
{
-
Clr_IIC_SCL;
-
DelayXus(2);
-
Set_IIC_SCL;
-
receive<<=1;
-
if(READ_SDA)receive++;
-
DelayXus(1);
-
}
-
if (!ack)
-
IIC_NAck();//发送nACK
-
else
-
IIC_Ack(); //发送ACK
-
return receive;
-
}
-
-
-
-
void TM1650_Set(unsigned char add,unsigned char dat) //数码管显示
-
{
-
-
IIC_Start();
-
IIC_Send_Byte(add);
-
IIC_Ack();
-
IIC_Send_Byte(dat);
-
IIC_Ack();
-
IIC_Stop();
-
}
-
-
void LCD_Init(void)
-
{
-
IIC_Init();
-
TM1650_Set(0x48,0x01);
-
}
-
-
void LCD_Display(unsigned char state,unsigned int NUM)
-
{
-
unsigned char CODE[20] = {0xdd,0x05,0xb9,0xad,0x65,0xec,0xfc,0x85,0xfd,0xed,0xf5,0xfd,0xd8,0xdd,0xf8,0xf0,0x00}; //0~9 dot: +2
-
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
-
unsigned char CODE1[20] = {0x00,0x05,0xb9,0xad,0x65,0xec,0xfc,0x85,0xfd,0xed,0xf5,0xfd,0xd8,0xdd,0xf8,0xf0,0x00}; //0~9 dot: +2
-
-
TM1650_Set(0x48,0x01);
-
switch(state)
-
{
-
case led_normal:
-
TM1650_Set(0x68,CODE1[NUM/100]);
-
TM1650_Set(0x6A,CODE[NUM%100/10]+2);
-
TM1650_Set(0x6C,CODE[NUM%100%10]);
-
break;
-
case led_set1:
-
if(timer_count < TIME_500MS)
-
TM1650_Set(0x68,CODE[1]+2);
-
else
-
TM1650_Set(0x68,CODE[16]);
-
-
TM1650_Set(0x6A,CODE1[NUM/10]);
-
TM1650_Set(0x6C,CODE[NUM%10]+2);
-
break;
-
case led_set2:
-
if(timer_count < TIME_500MS)
-
TM1650_Set(0x68,CODE[2]+2);
-
else
-
TM1650_Set(0x68,CODE[16]);
-
TM1650_Set(0x6A,CODE1[NUM/10]);
-
TM1650_Set(0x6C,CODE[NUM%10]+2);
-
break;
-
case led_error:
-
TM1650_Set(0x68,CODE[14]+2);
-
TM1650_Set(0x6A,CODE[NUM/10]);
-
TM1650_Set(0x6C,CODE[NUM%10]);
-
break;
-
case led_no_dis:
-
TM1650_Set(0x68,CODE[11]);
-
TM1650_Set(0x6A,CODE[11]);
-
TM1650_Set(0x6C,CODE[11]);
-
break;
-
default:
-
TM1650_Set(0x68,CODE1[8]+2);
-
TM1650_Set(0x6A,CODE1[8]+2);
-
TM1650_Set(0x6C,CODE1[8]+2);
-
break;
-
}
-
}
-
-
tm1650.h
-
#ifndef _I2C_H //宏定义,定义文件名称
-
#define _I2C_H
-
-
/*---------------------------头文件引用--------------------------------------*/
-
#include "stm32f10x.h"
-
#include "sys_conf.h"
-
#include
-
-
#define IIC_SCL_PIN GPIO_Pin_10
-
#define IIC_SCL_PORT GPIOB
-
#define IIC_SCL_CLK RCC_APB2Periph_GPIOB
-
-
#define IIC_SDA_PIN GPIO_Pin_11
-
#define IIC_SDA_PORT GPIOB
-
#define IIC_SDA_CLK RCC_APB2Periph_GPIOB
-
-
-
-
/*********************************************************
-
- I2C宏定义:
-
- I2C时钟操作:
-
- Set_IIC_SCL: 此处是将SCL拉为高电平
-
- Clr_IIC_SCL: 此处是将SCL拉为低电平
-
- 说明:通过这两个宏定义就可以模拟IIC的时钟电平SCL的高低变化了
-
*********************************************************/
-
#define Set_IIC_SCL GPIO_SetBits(IIC_SCL_PORT,IIC_SCL_PIN)
-
#define Clr_IIC_SCL GPIO_ResetBits(IIC_SCL_PORT,IIC_SCL_PIN)
-
-
-
/*********************************************************
-
- I2C宏定义:
-
- I2C数据线操作:
-
- Set_IIC_SDA: 此处是将SDA拉为高电平
-
- Clr_IIC_SDA: 此处是将SDA拉为低电平
-
- READ_SDA : 此处是读取SDA线上的位数据
-
- 说明:通过这两个宏定义就可以模拟IIC的数据线SDA电平的高低变化了
-
*********************************************************/
-
#define Set_IIC_SDA GPIO_SetBits(IIC_SDA_PORT,IIC_SDA_PIN)
-
#define Clr_IIC_SDA GPIO_ResetBits(IIC_SDA_PORT,IIC_SDA_PIN)
-
#define READ_SDA GPIO_ReadInputDataBit(IIC_SDA_PORT, IIC_SDA_PIN)
-
-
-
-
-
-
-
-
-
-
/*********************************************************
-
- I2C模拟操作函数的声明:
-
*********************************************************/
-
//IIC所有操作函数
-
void IIC_Init(void); //初始化IIC的IO口
-
void IIC_Start(void); //发送IIC开始信号
-
void IIC_Stop(void); //发送IIC停止信号
-
void IIC_Send_Byte(u8 txd); //IIC发送一个字节
-
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
-
u8 IIC_Wait_Ack(void); //IIC等待ACK信号
-
void IIC_Ack(void); //IIC发送ACK信号
-
void IIC_NAck(void); //IIC不发送ACK信号
-
void LCD_Init(void);
-
void SDA_IN(void);
-
void SDA_OUT(void);
-
void TM1650_Set(unsigned char add,unsigned char dat);//数码管显示
-
void LCD_Display(unsigned char state,unsigned int NUM);
-
#endif
-