再顶一下,望前辈指点 |
188610329 发表于 2023-3-9 13:22 前辈,请教一下,我的板子上上拉10K也有,101的电容也有,三条线还串联了180电阻。显示和按键都正常使用,但是在强电磁干扰下会读到很多意外的按键,甚至亮度都会变成最低,这个怎样解决? |
要得到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; } |
TM1638 按要求是 需要在 DIO 放置 10K 上拉 以及 100P 电容滤波的,你买的现成板子大概率 没有加这个部分的,那么如果 12T 的学习板单片机操作(速度慢板载有上拉) 一般是没有这个问题的,但是遇到 STC8 这种1T单片机,你就要在 CLK =0 之后给与足够的 延时等待,以及IO口 要设置内部上拉开,并且不是推挽模式,才能读到正确的键值。 |
![]() 我看不懂楼主的语言,我只知道汇编,我用过这个1638和楼主一样很熟悉,思路应该是一样的 这个1638按键没有返回概念,用它的按键只能一直不停读取键值,好像一共三个字节 ,每一个按键对应一个位数据,然后把固定的键值做比对,对上就说明按键按下,再去 执行,提醒楼主,同一个读键脚上的按键不一定在同一个字节里 |