找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1071|回复: 8
收起左侧

单片机TM1638数码管和按键控制器程序 怎么得到按键返回值?

[复制链接]
ID:998050 发表于 2023-3-9 01:18 | 显示全部楼层 |阅读模式
实物图.jpg 实物图
显示可以设置,但按键值不会正确返回,不知道怎么回事。单片机是STC8G系列
  1. #include        <REGX51.H>
  2. #include        <tm1638.h>

  3. unsigned char num[8];                //各个数码管显示的值

  4. int main(void)
  5. {
  6.         unsigned char i;
  7.         init_TM1638();                                   //初始化TM1638
  8.         for(i=0;i<8;i++)
  9.         Write_DATA(i<<1,tab[0]);                       //初始化寄存器
  10.         
  11.         while(1)
  12.         {
  13.                 //★经过测试 i=Read_key(); 不能正确返回按键值
  14.                 i=Read_key();                          //读按键值
  15.                 if(i<8)
  16.                 {
  17.                         num[i]++;
  18.                         while(Read_key()==i);                       //等待按键释放
  19.                         if(num[i]>15)
  20.                         num[i]=0;
  21.                         Write_DATA(i*2,tab[num[i]]);
  22.                         Write_allLED(1<<i);
  23.                 }
  24.         }
  25. }

复制代码
Keil代码下载:
TM1638测试程序C51(源程序无改动).zip (34.25 KB, 下载次数: 19)
回复

使用道具 举报

ID:996773 发表于 2023-3-9 09:45 | 显示全部楼层
225804oo08kajgizttsaji.jpg

我看不懂楼主的语言,我只知道汇编,我用过这个1638和楼主一样很熟悉,思路应该是一样的

这个1638按键没有返回概念,用它的按键只能一直不停读取键值,好像一共三个字节

,每一个按键对应一个位数据,然后把固定的键值做比对,对上就说明按键按下,再去

执行,提醒楼主,同一个读键脚上的按键不一定在同一个字节里
回复

使用道具 举报

ID:278006 发表于 2023-3-9 09:54 | 显示全部楼层
回复

使用道具 举报

ID:624769 发表于 2023-3-9 13:22 | 显示全部楼层
TM1638  按要求是  需要在  DIO 放置 10K 上拉 以及 100P 电容滤波的,你买的现成板子大概率 没有加这个部分的,那么如果 12T 的学习板单片机操作(速度慢板载有上拉) 一般是没有这个问题的,但是遇到 STC8 这种1T单片机,你就要在 CLK =0 之后给与足够的 延时等待,以及IO口 要设置内部上拉开,并且不是推挽模式,才能读到正确的键值。
回复

使用道具 举报

ID:651494 发表于 2023-3-9 17:00 | 显示全部楼层
回复

使用道具 举报

ID:841986 发表于 2023-3-9 17:24 | 显示全部楼层
要得到TM1638按键返回值,需要进行以下步骤:

初始化TM1638控制器:在程序中通过SPI接口向TM1638控制器写入数据,对其进行初始化。具体的初始化操作可以参考TM1638的数据手册。

读取按键状态:通过读取TM1638控制器内部的寄存器,可以得到按键的状态。具体的读取操作可以参考TM1638的数据手册。

解析按键状态:得到按键状态后,需要进行解析,以得到按键的返回值。TM1638控制器可以同时检测多个按键的状态,因此需要对返回值进行判断,以确定哪个按键被按下。

以下是一个简单的示例程序,用于从TM1638控制器读取按键状态:
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit STB = P1^0;  // TM1638控制引脚1
sbit CLK = P1^1;  // TM1638控制引脚2
sbit DIO = P1^2;  // TM1638控制引脚3

void tm1638_write(uint address, uchar data)
{
    STB = 0;  // 开始传输数据
    spi_write(address);  // 发送地址
    spi_write(data);  // 发送数据
    STB = 1;  // 停止传输数据
}

uchar tm1638_read(uint address)
{
    uchar data;

    STB = 0;  // 开始传输数据
    spi_write(address | 0x02);  // 发送读取命令和地址
    data = spi_read();  // 读取数据
    STB = 1;  // 停止传输数据

    return data;
}

uchar get_key(void)
{
    uchar key_code = tm1638_read(0x42);  // 读取按键状态

    switch (key_code)
    {
        case 0x01:  // 第1个按键被按下
            return 1;
        case 0x02:  // 第2个按键被按下
            return 2;
        case 0x04:  // 第3个按键被按下
            return 3;
        case 0x08:  // 第4个按键被按下
            return 4;
        case 0x10:  // 第5个按键被按下
            return 5;
        case 0x20:  // 第6个按键被按下
            return 6;
        case 0x40:  // 第7个按键被按下
            return 7;
        case 0x80:  // 第8个按键被按下
            return 8;
        default:
            return

    }
    return key_code;
}
回复

使用道具 举报

ID:1109793 发表于 2024-1-30 10:46 | 显示全部楼层
188610329 发表于 2023-3-9 13:22
TM1638  按要求是  需要在  DIO 放置 10K 上拉 以及 100P 电容滤波的,你买的现成板子大概率 没有加这个部 ...

前辈,请教一下,我的板子上上拉10K也有,101的电容也有,三条线还串联了180电阻。显示和按键都正常使用,但是在强电磁干扰下会读到很多意外的按键,甚至亮度都会变成最低,这个怎样解决?
回复

使用道具 举报

ID:1109793 发表于 2024-2-2 16:41 | 显示全部楼层
再顶一下,望前辈指点
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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