关于keilc编写单片机程序问题

请问哪位高手告诉我一下第一个程序和第二个有什么不同吗?为什么第一个程序运行不好使而第二个就好使呢?本程序的目的是通过p3口读出8路开关的状态,通过p0口送数码管显示。1.... 请问哪位高手告诉我一下第一个程序和第二个有什么不同吗?为什么第一个程序运行不好使而第二个就好使呢?本程序的目的是通过p3口读出8路开关的状态,通过p0口送数码管显示。
1.
#include <reg51.h>
tab[]={0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20};
void delay(void);
main()
{int i;
P3=0xfF;
while(1)
for(i=0;i<=7;i++)
{
if(P3==~(0x01<<i))
{P0=tab[i];
delay();
break;}
}
}
void delay(void)
{int i;
for(i=0;i<=600;i++);
}
2.#include <reg51.h>
tab[]={0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20};
void delay(void);
main()
{int i;
P3=0xfF;
while(1)
for(i=0;i<=7;i++)
{ P1=~(0x01<<i);
if(P3==P1)
{P0=tab[i];
delay();
break;}
}
}
void delay(void)
{int i;
for(i=0;i<=600;i++);
}
先声明一下,第一个程序运行没有反应,第二个运行能得到满意答案,而且我认为第二个程序中P1只是一个中间变量,和一般的变量没有什么区别,在编程中相当于只借用了一下0x90这个地址,我感觉和扫没扫描没有关系。还有在程序1中多加一个括号我也试过了,不好使。望各位高手继续帮忙研究一下,谢谢!
展开
 我来答
wenfuafeng
2011-01-05 · TA获得超过231个赞
知道小有建树答主
回答量:149
采纳率:0%
帮助的人:136万
展开全部
当然不同了,不同的就这两条程序,P1=~(0x01<<i); if(P3==P1)。第一个程序是扫描P3口的就是P3=~(0x01<<i),如有按键就输出P0。第二个就不同了,不同在扫描的是P1口按键,在判断是否与P3口相等,如果P3不等于P1口,就不输出P0。所以第二个程序只有P1和P3对应的口同时按下才有P0输出TABLE的功能。
lianghaijuan20
2011-01-05 · 超过11用户采纳过TA的回答
知道答主
回答量:25
采纳率:0%
帮助的人:17.9万
展开全部
先指出不同之处:
程序1:
。。。
{
if(P3==~(0x01<<i))
。。。

程序2:
。。。
{P1=~(0x01<<i);
if(P3==P1)
。。。

以上,是两个程序的不同之处。

程序2的错误在于不能用P1作为中转,可以用另外一个变量作为中转,但P1却不行。
为什么呢?我来解释当程序执行到程序2那两行语句时,单片机做了些什么。
上面那行,给P1赋值
紧接着,用P2口的状态与P1口的状态进行比较,此时,P1口的8个脚是当做输入点使用,外部的电平直接影响P1口的值,而并非上面那句赋给P1的值。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yongfeng9420
2011-01-05 · TA获得超过116个赞
知道小有建树答主
回答量:190
采纳率:0%
帮助的人:142万
展开全部
你把if(P3==~(0x01<<i))
改成
if(P3==(~(0x01<<i)))
试试。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhuzhu7671
2011-01-05
知道答主
回答量:13
采纳率:0%
帮助的人:0
展开全部
都一样的........软件问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式