硬件情況:
單片機型號是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 ,無法按照期望正確返回待測的撥碼開關位數
求助大伙,這是什么原因導致的?
|