TM1650数码管驱动芯片驱动数码管读取按键程序

博客介绍了在使用TM1650数码管驱动芯片过程中遇到的官方datasheet中按键读取时序错误,并提供了修正后的代码,帮助读者避免相同问题。
摘要由CSDN通过智能技术生成

折腾了四五个小时,官方给的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
以下是一个基于STM32的TM1650读取按键数码管显示的程序,你可以参考一下: ```c #include "stm32f10x.h" #include "tm1650.h" #define KEY1_GPIO_PORT GPIOB #define KEY1_GPIO_PIN GPIO_Pin_12 #define KEY2_GPIO_PORT GPIOB #define KEY2_GPIO_PIN GPIO_Pin_13 void init_key(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOB clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* Configure Key1 pin as input floating */ GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure); /* Configure Key2 pin as input floating */ GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure); } int main(void) { TM1650_Init(); init_key(); uint8_t buf[4] = {0}; uint8_t key_state = 0; while(1) { /* 读取TM1650的数据 */ TM1650_ReadKeyAndDisplay(buf); /* 检测按键状态 */ if(GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_GPIO_PIN) == 0) key_state |= 0x01; else key_state &= ~0x01; if(GPIO_ReadInputDataBit(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == 0) key_state |= 0x02; else key_state &= ~0x02; /* 根据按键状态更新TM1650的数据 */ if(key_state & 0x01) buf[0] = (buf[0] < 9) ? (buf[0] + 1) : 0; if(key_state & 0x02) buf[1] = (buf[1] < 9) ? (buf[1] + 1) : 0; /* 更新TM1650的显示 */ TM1650_WriteData(buf); } } ``` 在这个程序中,我们首先初始化了TM1650按键的GPIO口,并且定义了一个长度为4的数组`buf`,用来存储TM1650的数据。然后我们进入了一个无限循环中,在每次循环中,我们首先读取TM1650的数据和按键状态,然后根据按键状态来更新TM1650的数据,最后再将更新后的数据写入TM1650中。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值