找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 681|回复: 19
打印 上一主题 下一主题
收起左侧

请教TM1638按键问题 数码管可以累加计数,但不知如何得到键值

[复制链接]
跳转到指定楼层
楼主
发贴的时候有文字的,不知怎么没有了,补一下:

电路如图,接了8个按键,参考坛子里的代码,按SW1、SW2、SW3、SW5、SW7时,数码管可以累加计数。但不知如何得到键值,试验了很多种方法都不行。

要求是按SW1、SW2时,能得到1、2或0x01、0x02就行。





  1. unsigned char Read_key(void)
  2. {
  3.         unsigned char c[4],i,key_value=0;
  4.         STB=0;
  5.         TM1638_Write(0x42);                           //读键扫数据 命令
  6.         for(i=0;i<4;i++)               
  7.                 c[i]=TM1638_Read();
  8.         STB=1;                                                   //4个字节数据合成一个字节
  9.         for(i=0;i<4;i++)
  10.                 key_value|=c[i]<<i;
  11.         for(i=0;i<8;i++)
  12.                 if((0x01<<i)==key_value)
  13.                         break;
  14.         return i;
  15. }
复制代码
  1.     while (1)
  2.     {  
  3.                
  4. //以下为读按键

  5.         i=Read_key();                          //读按键值
  6.                 if(i<8)
  7.                 {
  8.                                 num[i]++;
  9.                                 while(Read_key()==i);                       //等待按键释放
  10.                                 if(num[i]>15)
  11.                                 num[i]=0;
  12.                                 Write_DATA(i*2,tab[num[i]]);
  13. //                                Write_allLED(1<<i);
  14.                 }        

  15. }
复制代码









分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1109793 发表于 2025-10-3 17:33 | 只看该作者
看不懂啊,目的是啥
回复

使用道具 举报

板凳
ID:1144680 发表于 2025-10-3 20:50 | 只看该作者
xiaobendan001 发表于 2025-10-3 17:33
看不懂啊,目的是啥

发贴的时候有文字的,不知怎么没有了,补一下:

电路如图,接了8个按键,参考坛子里的代码,按SW1、SW2、SW3、SW5、SW7时,数码管可以累加计数。但不知如何得到键值,试验了很多种方法都不行。

要求是按SW1、SW2时,能得到1、2或0x01、0x02就行。



回复

使用道具 举报

地板
ID:1109793 发表于 2025-10-4 07:50 | 只看该作者
dcc60 发表于 2025-10-3 20:50
发贴的时候有文字的,不知怎么没有了,补一下:

电路如图,接了8个按键,参考坛子里的代码,按SW1、SW ...

接K1,c[i ]里面大概是04或者40,所以第二个循环能得到啥结果?
为啥非要把键值弄成一个数字?
读出来啥就用啥不行吗?不知道读出来的啥?直接先放数码管上面显示一下不就行了?
然后记录下来,再放代码里面嘛。
如果接K3,你这代码应该可以用吧
回复

使用道具 举报

5#
ID:1109793 发表于 2025-10-4 10:12 | 只看该作者
xiaobendan001 发表于 2025-10-4 07:50
接K1,c里面大概是04或者40,所以第二个循环能得到啥结果?
为啥非要把键值弄成一个数字?
读出来啥就用 ...

""是斜体字的意思?
回复

使用道具 举报

6#
ID:241128 发表于 2025-10-4 10:22 | 只看该作者
    while (1)
    {  
               
//以下为读按键

        i=Read_key();                          //读按键值
                if(i<8)
                {
                                num[i]++;
                                while(Read_key()==i);                       //等待按键释放
                                if(num[i]>15)
                                num[i]=0;
                                if(i==1)Write_DATA(i*2,tab[num[1]]);
                                                                if(i==2)Write_DATA(i*2,tab[num[2]]);
                                                                if(i==3)Write_DATA(i*2,tab[num[3]]);
                                                                if(i==4)Write_DATA(i*2,tab[num[4]]);
                                                                if(i==5)Write_DATA(i*2,tab[num[5]]);
                                                                if(i==6)Write_DATA(i*2,tab[num[6]]);
                                                                if(i==7)Write_DATA(i*2,tab[num[7]]);
                                                                if(i==8)Write_DATA(i*2,tab[num[8]]);
//                                Write_allLED(1<<i);
                }        

}
直接复制替换你的大循环函数试试
回复

使用道具 举报

7#
ID:1109793 发表于 2025-10-4 11:40 | 只看该作者
fzhlpp 发表于 2025-10-4 10:22
while (1)
    {  
               

意思是8个按键分别给8个数码管++?
回复

使用道具 举报

8#
ID:1144680 发表于 2025-10-4 14:29 | 只看该作者
fzhlpp 发表于 2025-10-4 10:22
while (1)
    {  
               

试了,所有按键不起作用。
回复

使用道具 举报

9#
ID:1144680 发表于 2025-10-4 14:45 | 只看该作者
xiaobendan001 发表于 2025-10-4 07:50
接K1,c里面大概是04或者40,所以第二个循环能得到啥结果?
为啥非要把键值弄成一个数字?
读出来啥就用 ...

就是不知道读出来的是啥,也放在数码管里试了。
没按之前i应该是0,那几个键按了之后好象都是8。
  1. i=Read_key();         
  2.         Write_DATA(0,tab[i]);
  3.         Write_DATA(2,tab[i+1]);               
  4.         Write_DATA(4,tab[i-1]);       
复制代码


分别显示8、9、7

回复

使用道具 举报

10#
ID:1144680 发表于 2025-10-4 14:45 | 只看该作者
fzhlpp 发表于 2025-10-4 10:22
while (1)
    {  
               

i=Read_key();         
        Write_DATA(0,tab[ i]);
        Write_DATA(2,tab[i+1]);               
        Write_DATA(4,tab[i-1]);        

用上面的代码试验,按下显示8、9、7
回复

使用道具 举报

11#
ID:241128 发表于 2025-10-5 10:55 | 只看该作者
dcc60 发表于 2025-10-4 14:45
i=Read_key();         
        Write_DATA(0,tab);
        Write_DATA(2,tab);               

快了,你应该马上找到原因并解决了,能显示897肯定能显示任何你想要的数字,我刚开始学1638的时候也是复制别人的代码然后再慢慢分析吸收利用实现自己的功能,只是开始对代码的分析还不到位,比如你的数码管位数,在代码里就是那个024,也就是0代表实际你数码管第一个的意思,对不对?2代表实际你的第三个数码管的意思对吧?那么你应该是实际有8个数码管是不是?你可以先直接像这样012345678替换*号试试Write_DATA(  * ,tab[i+1]);

回复

使用道具 举报

12#
ID:1109793 发表于 2025-10-5 13:56 | 只看该作者
dcc60 发表于 2025-10-4 14:45
i=Read_key();         
        Write_DATA(0,tab);
        Write_DATA(2,tab);               

组合试试这样:
  1. //组合
  2. key_value = c[0]>>2|c[1]>>1|c[2]|c[3]<<1;
复制代码

然后取出键值0-7。
回复

使用道具 举报

13#
ID:1109793 发表于 2025-10-5 18:15 | 只看该作者
  1. unsigned char Read_key(void)
  2. {
  3.         unsigned char c[4],i,key_value=0;
  4.         STB=0;
  5.         TM1638_Write(0x42);                           //读键扫数据 命令
  6.         for(i=0;i<4;i++)               
  7.                 c[i]=TM1638_Read();
  8.         STB=1;                                                   //4个字节数据合成一个字节
  9. key_value = c[0]>>2|c[1]>>1|c[2]|c[3]<<1;        for(i=0;i<8;i++)
  10.                 if((0x01<<i)==key_value)
  11.                         break;
  12.         return i;
  13. }
复制代码
回复

使用道具 举报

14#
ID:1144680 发表于 2025-10-5 23:36 | 只看该作者
fzhlpp 发表于 2025-10-5 10:55
快了,你应该马上找到原因并解决了,能显示897肯定能显示任何你想要的数字,我刚开始学1638的时候也是复 ...

感谢给出思路。
虽然显示的是897,实际上那个i是个定值8,因为+1、-1了。且不论按哪个键i都是8。
实验中已经把“位”用0-7代替了,我想要的结果是按不同的键,i是不同的值。
回复

使用道具 举报

15#
ID:1144680 发表于 2025-10-5 23:37 | 只看该作者

谢谢!我试试。。。。。
回复

使用道具 举报

16#
ID:584814 发表于 2025-10-16 16:01 | 只看该作者
1、看芯片手册自己完成代码,老的手册可能有现成的代码;
2、网上或厂家找例程,这样少走弯路,并且过关率超高;
3、本论坛仔细找找,大概率有你想要的找到可偷着乐。
回复

使用道具 举报

17#
ID:1144680 发表于 2025-10-20 20:37 | 只看该作者

用你的方法成功显示1234567,对应的按钮会固定显示一个数字。我想要的是个按钮,如下面的代码,按下显示0,松开显示1,却怎么也不成功,能否再指点指点。
  1.                 if(i==0)
  2.                 {
  3.                         Write_DATA(0,tab[0]);
  4.                 }                       
  5.                                
  6.                 else
  7.                 {
  8.                         Write_DATA(0,tab[1]);                       
  9.                 }       
复制代码
回复

使用道具 举报

18#
ID:1144680 发表于 2025-10-20 20:38 | 只看该作者
man1234567 发表于 2025-10-16 16:01
1、看芯片手册自己完成代码,老的手册可能有现成的代码;
2、网上或厂家找例程,这样少走弯路,并且过关率 ...

就是本论坛找的,怎么也搞不明白。
回复

使用道具 举报

19#
ID:1109793 发表于 2025-10-21 07:26 | 只看该作者
dcc60 发表于 2025-10-20 20:37
用你的方法成功显示1234567,对应的按钮会固定显示一个数字。我想要的是个按钮,如下面的代码,按下显示0 ...

还是不懂,你得到的键不是0-7吗?哪个按键按下显示0?松开又显示1?所有的,还是第0个?或者第一个?
回复

使用道具 举报

20#
ID:1144680 发表于 2025-10-30 14:22 | 只看该作者
xiaobendan001 发表于 2025-10-21 07:26
还是不懂,你得到的键不是0-7吗?哪个按键按下显示0?松开又显示1?所有的,还是第0个?或者第一个?

正在学习,如有问题再次请教,谢谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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