折腾了四五个小时,官方给的datasheet有不少的问题,这里纠正一下按键读取时序错误:
读取的数据跟文档里面的数据提前了一位,在这里给大家提个醒!
下面贴上代码
c文件:
#include "TUBE_KEY.h"
#include "LED.h"
#include "delay.h"
#define SCL_Set (GPIOB->BSRR = 1<<5)
#define SDA_Set (GPIOB->BSRR = 1<<6)
#define SCL_Reset (GPIOB->BSRR = 1<<(16+5))
#define SDA_Reset (GPIOB->BSRR = 1<<(16+6))
#define SCL_Read (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5))
#define SDA_Read (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6))
#define IIC_uS 10
u8 KEY_EXTI= 0;
static void TM1650_Init(void);
static void IIC_Init(void);
static void IIC_Start(void);
static void IIC_Stop(void);
static void IIC_Ack(void);
static void IIC_NoAck(void);
static u8 IIC_Wait_Ack(void);
static void IIC_Wr_Byte(u8 Data);
static u8 IIC_Rd_Byte(void);
static void TM1650_Wr_RAM(u8 Address, u8 Data);
static u8 KEYtm_Scan(void);
static void EXTI_KEY_Init(void);
/*
*函数功能:数码管按键初始化
*提 示:tm1650挂载4个按键,外部中断挂载两个按键
*输入参数:无
*输出参数:无
*返回值 :无
*/
void Tube_Key_Init(void)
{
/*按键外部中断初始化*/
EXTI_KEY_Init();
/*TM1650初始化*/
TM1650_Init();
}
/*
*函数功能:TM1650初始化
*提 示:tm1650挂载4个按键,外部中断挂载两个按键
*输入参数:无
*输出参数:无
*返回值 :无
*/
static void TM1650_Init(void)
{
IIC_Init();
Delay_mS(50);
TM1650_Wr_RAM(0x48,0x00);//关闭显示
}
/*
*函数功能:数码管显示数字
*提 示:仅4位支持整数
*输入参数:u16 Num:显示的数字
*输出参数:无
*返回值 :无
*/
const u8 NUM[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0~9对应的值
void Tube_DisNum(u16 Num)
{
u8 Temp[4];
/*数据分离*/
Temp[0] = Num%10000/1000;
Temp[1] = Num%1000/100;
Temp[2] = Num%100/10;
Temp[3] = Num%10;
/*显示*/
TM1650_Wr_RAM(0x68, NUM[Temp[0]]);
TM1650_Wr_RAM(0x6A, NUM[Temp[1]]);
TM1650_Wr_RAM(0x6C, NU