找回密码
 立即注册
查看: 252|回复: 7

TM1638模块无法读取按键值 | 已经解决, 在STC各位技术专家指导下

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:156
  • 最近打卡:2026-04-06 11:30:05
已绑定手机

22

主题

2445

回帖

3458

积分

论坛元老

积分
3458
发表于 2025-11-11 13:04:27 | 显示全部楼层 |阅读模式
买了一块TM1638模块。8个按键的,但现在无法读取按键值:


网上有用STM32的,也碰到这个问题:

他的帖子是这样的:

【TM1638不能成功读回按键值】


截图202511111304226861.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:156
  • 最近打卡:2026-04-06 11:30:05
已绑定手机

22

主题

2445

回帖

3458

积分

论坛元老

积分
3458
发表于 2025-11-11 13:06:01 | 显示全部楼层
led+8按键+8数码管。主函数调用TM1638_ReadData2,打印了返回值,无论是否按键,都一直打印255,为什么全是1,看来读数据函数有问题啊。

  1. /*******************************************************************************
  2.   * 函数名:TM1638_ReadKey
  3.   * 功  能:TM1638读按键数据
  4.   * 参  数:无
  5.   * 返回值:读出的数据
  6.   * 说  明:实际该显示板只有8个按键,返回值1~8分别为Key1~Key8;
  7.             所有按键连接K3,无法实现组合按键,只允许一次按一个键;
  8. *******************************************************************************/
  9. uint8_t TM1638_ReadKey(void)
  10. {
  11.     uint8_t u8Data[4], i;
  12.     uint8_t u8Key = 0;
  13.     TM1638_STBReset();
  14.     TM1638_WriteData(0x42);
  15.     for (i = 0; i < 4; i++)
  16.     {
  17.         u8Data[i] = TM1638_ReadData();//读BYTE1~BYTE4的数据
  18.     }
  19.     TM1638_STBSet();
  20.     for (i = 0; i < 4; i++)//取出4个BYTE中的键值
  21.     {
  22.         if (((u8Data[i] >> 0) & 0x01) == 0x01)//第0位,B0,对应按键为1、3、5、7,计算公式是i*2+1
  23.         {
  24.             u8Key = (i * 2 + 1);
  25.             break;
  26.         }else
  27.         {
  28.             if (((u8Data[i] >> 4) & 0x01) == 0x01)//第4位,B4,对应按键为2、4、6、8,计算公式是i*2+2
  29.             {
  30.                 u8Key = (i * 2 + 2);
  31.                 break;
  32.             }
  33.         }
  34.     }
  35.     return u8Key;
  36. }
复制代码

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:156
  • 最近打卡:2026-04-06 11:30:05
已绑定手机

22

主题

2445

回帖

3458

积分

论坛元老

积分
3458
发表于 2025-11-11 13:10:38 | 显示全部楼层
仔细看,是这里有问题:


TM1638读取按键要注意:

读按键数据时,输出转为输入要电位上拉:GPIO_InitStruct.Pull 2 = GPIO_PULLUP;,可解决大问题

对应的程序:
  1. void DIO_Init(int state)
  2. {
  3.         __HAL_RCC_GPIOA_CLK_ENABLE();
  4.         GPIO_InitTypeDef GPIO_InitStruct = {0};
  5.         if(state==0)
  6.         {
  7.                 GPIO_InitStruct.Pin = DIO_Pin;
  8.                 GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  9.                 GPIO_InitStruct.Pull = GPIO_PULLUP;
  10.                 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  11.         }
  12.         else
  13.         {
  14.                 HAL_GPIO_WritePin(GPIOA, DIO_Pin|CLK_Pin|STB_Pin, GPIO_PIN_RESET);
  15.                 GPIO_InitStruct.Pin = DIO_Pin;
  16.                 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  17.                 GPIO_InitStruct.Pull = GPIO_NOPULL;
  18.                 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  19.                 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  20.         }
  21. }
复制代码
我没玩过STM32,不知道如何套用在砸门STC32G12K128上?
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:156
  • 最近打卡:2026-04-06 11:30:05
已绑定手机

22

主题

2445

回帖

3458

积分

论坛元老

积分
3458
发表于 2025-11-11 13:24:00 | 显示全部楼层
读STM32的程序,好像每次执行读写的时候,都可能有设置管脚动作:


#ifndef _TM1638_H_#define _TM1638_H_#include "Typedefine.h"#include "Port.h"/*******************************************************************************Macro definitions*******************************************************************************/#define TUBE_DISPLAY_NULL                                        26#define TUBE_DISPLAY_DECIMAL_PIONT_OFFSET        16#define TM1638_STBSet()                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)#define TM1638_STBReset()                                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)#define TM1638_CLKSet()                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET)#define TM1638_CLKReset()                                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET)#define TM1638_DIOSet()                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET)#define TM1638_DIOReset()                                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET)#define TM1638_DIOModeOutput()                        Port_SetMode(GPIOB, GPIO_PIN_9, GPIO_MODE_OUTPUT_PP)#define TM1638_DIOModeInput()                        Port_SetMode(GPIOB, GPIO_PIN_9, GPIO_MODE_INPUT)#define TM1638_DIORead()                                HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9)
  1. #ifndef _TM1638_H_
  2. #define _TM1638_H_
  3. #include "Typedefine.h"
  4. #include "Port.h"
  5. /*******************************************************************************
  6. Macro definitions
  7. *******************************************************************************/
  8. #define TUBE_DISPLAY_NULL                                        26
  9. #define TUBE_DISPLAY_DECIMAL_PIONT_OFFSET        16
  10. #define TM1638_STBSet()                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)
  11. #define TM1638_STBReset()                                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)
  12. #define TM1638_CLKSet()                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET)
  13. #define TM1638_CLKReset()                                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET)
  14. #define TM1638_DIOSet()                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET)
  15. #define TM1638_DIOReset()                                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET)
  16. #define TM1638_DIOModeOutput()                        Port_SetMode(GPIOB, GPIO_PIN_9, GPIO_MODE_OUTPUT_PP)
  17. #define TM1638_DIOModeInput()                        Port_SetMode(GPIOB, GPIO_PIN_9, GPIO_MODE_INPUT)
  18. #define TM1638_DIORead()                                HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_9)
复制代码
头文件说明了:
TM1638_DIOSet()  就是 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET)
我估计这句HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET)就是利用STM32库函数设置管脚状态
相当于我们的STB=0;


下面这句:
TM1638_CLKReset()  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET)
大概就是把CLK复位
相当于我们的STB=1;
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:156
  • 最近打卡:2026-04-06 11:30:05
已绑定手机

22

主题

2445

回帖

3458

积分

论坛元老

积分
3458
发表于 2025-11-11 13:26:44 | 显示全部楼层
搞了2天,晕头转向


先把程序打包发上来:

暂时投降:



TM1638按键.zip

131.77 KB, 下载次数: 3

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:156
  • 最近打卡:2026-04-06 11:30:05
已绑定手机

22

主题

2445

回帖

3458

积分

论坛元老

积分
3458
发表于 2025-11-11 13:28:47 | 显示全部楼层
其实就是不知道下面这句如何套用在STC32上!

“读按键数据时,输出转为输入要电位上拉:GPIO_InitStruct.Pull 2 = GPIO_PULLUP;,可解决大问题”

反正是通信没有成功,dio一直没有被拉低所以主机读取的一串1,所以就是255了,但我用串口打印是8,本来应该是0--7才对啊

点评

使用PxMx寄存器设置IO模式  详情 回复 发表于 2025-11-11 13:37
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:725
  • 最近打卡:2026-03-30 12:09:34
已绑定手机

97

主题

7246

回帖

1万

积分

超级版主

积分
13798
发表于 2025-11-11 13:37:03 | 显示全部楼层
wuzhe*** 发表于 2025-11-11 13:28
其实就是不知道下面这句如何套用在STC32上!

“读按键数据时,输出转为输入要电位上拉:GPIO_InitStruct.P ...

使用PxMx寄存器设置IO模式

截图202511111337537576.jpg
截图202511111337096686.jpg



回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:156
  • 最近打卡:2026-04-06 11:30:05
已绑定手机

22

主题

2445

回帖

3458

积分

论坛元老

积分
3458
发表于 2025-11-11 13:42:54 | 显示全部楼层
Debu*** 发表于 2025-11-11 13:37
使用PxMx寄存器设置IO模式

谢谢大佬!
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-6 22:41 , Processed in 0.126954 second(s), 80 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表