硬件情况:
单片机型号是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 ,无法按照期望正确返回待测的拨码开关位数
求助大伙,这是什么原因导致的?
|