打印
[51单片机]

读取P1口时的小问题,与大家分享。

[复制链接]
1401|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lnulibin|  楼主 | 2014-8-22 23:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天,写一个小程序,想读取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!");即可。

试了一下,果然如此。

愿所有的爱好者不再因此而浪费时间,郁闷一下午了。

相关帖子

沙发
ningling_21| | 2014-8-23 08:57 | 只看该作者
不少电工曾犯过这样的错误...

使用特权

评论回复
板凳
qxxgyz| | 2014-8-23 10:43 | 只看该作者
这种错误不好找,也不报错

使用特权

评论回复
地板
集成| | 2014-8-23 10:58 | 只看该作者
看不明白

使用特权

评论回复
5
chenluck| | 2014-8-23 11:10 | 只看该作者
你的if(P1&0X10 == 0)
改为if((P1&0X10) == 0)
这样就OK了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

186

帖子

2

粉丝