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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 362|回復: 6
打印 上一主題 下一主題
收起左側

使用單片機判斷撥碼開關位數時,返回結果異常

[復制鏈接]
跳轉到指定樓層
樓主
ID:1143744 發表于 2025-5-22 16:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
硬件情況:
             單片機型號是STC8G2K64S4 ,LQFP48封裝
             P0 P2是接收端口(準雙向置1),P1 P4是驅動端口(準雙向置0)

             撥碼開關 是多組獨立開關的集合體,有4組,6組,8組,9組等
工程原理:
             將撥碼開關引腳與單片機端口相連,閉合開關后,檢測接收端口0 的個數,來判斷當前開關的位數(檢測前已確保所有開關閉合)
             由于STC8G系列一組IO只有8個引腳,如果要測量的撥碼開關位數大于8,就必須啟用兩組IO來組合實現
             程序中,先將兩組IO的檢測結果(8位)組合為16位,然后再從高位往低位計數 “0”的個數,即可得出撥碼開關的位數
源代碼:
              P1=0x00;P4=0x00;
             _nop_();_nop_();
      
             bits=detect_bit(con_bit(P0,P2));


             unsigned int con_bit (unsigned char vol_high,unsigned char vol_low){
                                return (vol_high<<8)|vol_low ;
                                }


              unsigned char detect_bit(unsigned int vol) {
                                  unsigned int mask = 0x8000;
                                  unsigned char cnt = 0;
                                  while (mask && !(vol & mask)) {       // 當mask位為0時計數
                                   cnt++;
                                  mask >>= 1;
                                   }
                                return cnt;                          // 返回連續高位0的個數(0-16)
                                }
問題:
           經實踐,當撥碼開關位數<8時,返回的bits 是0;當撥碼開關位數>=8時,返回的bits 是8 ,無法按照期望正確返回待測的撥碼開關位數
求助大伙,這是什么原因導致的?

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1121801 發表于 2025-5-23 08:28 | 只看該作者
程序模擬運行一下,單步運行,設置位然后觀察變量變化.這是單片機程序最簡單的檢查方法.而且你程序不長,很容易發現問題的.
回復

使用道具 舉報

板凳
ID:332444 發表于 2025-5-23 08:51 | 只看該作者
為什么一定要組合?如果是做表決器,一組單獨處理后相加即可.
回復

使用道具 舉報

地板
ID:1143744 發表于 2025-5-23 11:17 | 只看該作者
cyi8 發表于 2025-5-23 08:28
程序模擬運行一下,單步運行,設置位然后觀察變量變化.這是單片機程序最簡單的檢查方法.而且你程序不長,很容 ...

謝謝您的意見
回復

使用道具 舉報

5#
ID:1143744 發表于 2025-5-23 11:21 | 只看該作者
xianfajushi 發表于 2025-5-23 08:51
為什么一定要組合?如果是做表決器,一組單獨處理后相加即可.

因為后續程序也會使用到這個組合后的結果,如果分開的話,后面每個調用這個結果的語句及函數都需要進行修改

不過,問題已經找到了,8位的char 左移8位結果會全部丟失,需要強制類型轉換
再加上硬件端口排布的小問題

感謝您的回復
回復

使用道具 舉報

6#
ID:1133081 發表于 2025-5-23 13:14 | 只看該作者
#define PD P0<<8|P1


unsigned int con_bit()
{
        static unsigned int num=0;
        if(num!=PD)
        {
                num=PD;
                return num;
        }       
}
回復

使用道具 舉報

7#
ID:332444 發表于 2025-5-23 15:06 | 只看該作者
ziqidong 發表于 2025-5-23 11:21
因為后續程序也會使用到這個組合后的結果,如果分開的話,后面每個調用這個結果的語句及函數都需要進行修 ...

如果用賦值十進制讀取十進制再轉二進制計算0的個數或1的個數是很容易的,也容易理解,代碼也簡潔易讀;
多組IO讀取一組處理一組,順理成章的;
況且,還可以只使用1組IO當輸入,其他IO當控制公共端,可以組成8組8輸入,64人表決器。
例如使用51單片機的P0端作為獨立按鍵輸入,按鍵公共端由另外IO控制,賦值P0=255,讀取也是十進制的值,按鍵1按下時讀取到的值254即11111110,254轉二進制,逢0計數即得1,假如按鍵2按下讀取到253轉二進制也得1即11111101,按鍵1、2按下讀取到252轉二進制即得2即11111100。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

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