欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 945|回復: 19
收起左側

請教TM1638按鍵問題 數碼管可以累加計數,但不知如何得到鍵值

[復制鏈接]
ID:1144680 發表于 2025-10-3 15:05 | 顯示全部樓層 |閱讀模式
發貼的時候有文字的,不知怎么沒有了,補一下:

電路如圖,接了8個按鍵,參考壇子里的代碼,按SW1、SW2、SW3、SW5、SW7時,數碼管可以累加計數。但不知如何得到鍵值,試驗了很多種方法都不行。

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



bde5be0b-4a05-4a28-b671-6cbf65796679.png

  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. }
復制代碼









回復

使用道具 舉報

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,你這代碼應該可以用吧
回復

使用道具 舉報

ID:1109793 發表于 2025-10-4 10:12 | 顯示全部樓層
xiaobendan001 發表于 2025-10-4 07:50
接K1,c里面大概是04或者40,所以第二個循環能得到啥結果?
為啥非要把鍵值弄成一個數字?
讀出來啥就用 ...

""是斜體字的意思?
回復

使用道具 舉報

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);
                }        

}
直接復制替換你的大循環函數試試
回復

使用道具 舉報

ID:1109793 發表于 2025-10-4 11:40 | 顯示全部樓層
fzhlpp 發表于 2025-10-4 10:22
while (1)
    {  
               

意思是8個按鍵分別給8個數碼管++?
回復

使用道具 舉報

ID:1144680 發表于 2025-10-4 14:29 | 顯示全部樓層
fzhlpp 發表于 2025-10-4 10:22
while (1)
    {  
               

試了,所有按鍵不起作用。
回復

使用道具 舉報

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

回復

使用道具 舉報

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
回復

使用道具 舉報

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]); 8個數碼管.png

回復

使用道具 舉報

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。
回復

使用道具 舉報

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. }
復制代碼
回復

使用道具 舉報

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是不同的值。
回復

使用道具 舉報

ID:1144680 發表于 2025-10-5 23:37 | 顯示全部樓層

謝謝!我試試。。。。。
回復

使用道具 舉報

ID:584814 發表于 2025-10-16 16:01 | 顯示全部樓層
1、看芯片手冊自己完成代碼,老的手冊可能有現成的代碼;
2、網上或廠家找例程,這樣少走彎路,并且過關率超高;
3、本論壇仔細找找,大概率有你想要的找到可偷著樂。
回復

使用道具 舉報

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.                 }       
復制代碼
回復

使用道具 舉報

ID:1144680 發表于 2025-10-20 20:38 | 顯示全部樓層
man1234567 發表于 2025-10-16 16:01
1、看芯片手冊自己完成代碼,老的手冊可能有現成的代碼;
2、網上或廠家找例程,這樣少走彎路,并且過關率 ...

就是本論壇找的,怎么也搞不明白。
回復

使用道具 舉報

ID:1109793 發表于 2025-10-21 07:26 | 顯示全部樓層
dcc60 發表于 2025-10-20 20:37
用你的方法成功顯示1234567,對應的按鈕會固定顯示一個數字。我想要的是個按鈕,如下面的代碼,按下顯示0 ...

還是不懂,你得到的鍵不是0-7嗎?哪個按鍵按下顯示0?松開又顯示1?所有的,還是第0個?或者第一個?
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表