昨天,写一个小程序,想读取P1口的8个引脚的电平。(按键按下,低电平,否则高电平)
if(P1&0X01 == 0)SendString("key 1 has pressed!");
if(P1&0X02 == 0)SendString("key 2 has pressed!");
if(P1&0X04 == 0)SendString("key 3 has pressed!");
if(P1&0X08 == 0)SendString("key 4 has pressed!");
if(P1&0X10 == 0)SendString("key 5 has pressed!");
if(P1&0X20 == 0)SendString("key 6 has pressed!");
if(P1&0X40 == 0)SendString("key 7 has pressed!");
if(P1&0X80 == 0)SendString("key 8 has pressed!");
可是不管我按哪个按键都没有反应。串口助手都收不到字符串。(SendString函数是没问题的,先试过了,可以发数据到串口助手里。)
试了半天,确切说是浪费了一下午,也没搞明白。
第二天一早,又开始试验,终于发现:
如果把程序改成如下形式就好用了。(当然需要事先在头文件里用sbit伪指令定义一下位地址。)
if(P10 == 0)SendString("key 1 has pressed!");
if(P11 == 0)SendString("key 2 has pressed!");
if(P12 == 0)SendString("key 3 has pressed!");
if(P13 == 0)SendString("key 4 has pressed!");
if(P14 == 0)SendString("key 5 has pressed!");
if(P15 == 0)SendString("key 6 has pressed!");
if(P16 == 0)SendString("key 7 has pressed!");
if(P17 == 0)SendString("key 8 has pressed!");
脑袋一转,忽然明白,可能先前的表达式不对。
查找C51方面的书籍一看,果然,
原来运算符“==”的优先级刚好比运算符“&”的优先级高一级。
所以前面的表达式应该改成
if((P1&0X01) == 0)SendString("key 1 has pressed!");即可。
试了一下,果然如此。
愿所有的爱好者不再因此而浪费时间,郁闷一下午了。 |