51单片机的问题,读引脚和读引脚寄存器的问题

程序如下:#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbitKEY=P1^0;//定义按键输入端口sbitLED... 程序如下:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit KEY=P1^0; //定义按键输入端口
sbit LED=P1^1; //定义led输出端口
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{

KEY=1; //按键输入端口电平置高
while (1) //主循环
{
CY=KEY;
KEY=CY;
if(!KEY) //如果检测到低电平,说明按键按下
LED=0;
else
LED=1; //这里使用if判断,如果按键按下led点亮,否则熄灭
//上述4句可以用一句替代 LED=KEY;
//主循环中添加其他需要一直工作的程序
}
}

程序加上 下面这两条语句和没加结果完全不同,求解释
CY=KEY;
KEY=CY;
(程序已经加上这两语句)
展开
 我来答
百度网友719eb7e
2012-09-19 · TA获得超过455个赞
知道小有建树答主
回答量:257
采纳率:0%
帮助的人:236万
展开全部
你既然已经把KEY即P1^0口作为输入了,用CY=KEY这个没问题。
为什么还要加这一句 KEY=CY 把KEY这个端口又设置成输出呢?
你既然是需要这个端口做输入,就不要加KEY=CY这个语句进去,不然有可能导致程序出现问题的。
因为51单片机不和AVR一样,51单片机没有设定输入输出的寄存器。
而且要把51单片机的IO口设置成输入的话,貌似必须要先让这个引脚先设置成1。
更多追问追答
追问
我就想知道为什么会出问题,51的io口即可做输入也可以做输出的,问题不在这,CY=KEY,CY=KEY执行之后KEY应该不会有所改变才对,只是改变了CY的值
至于引脚先置1再读取,按电路来看是要的,反而加上CY=KEY,CY=KEY这两句后符合先置1在读取
追答
CY=KEY是只改变了CY的值,但是你KEY=CY就是把KEY的IO口设置成了输出的状态,KEY这个IO口就输出CY的值。这样,KEY这个口在后面的程序里面如果没上拉电阻使它置1的话,貌似就不会变成输入状态,从而不能检测到按键状态,导致不能正常做出动作。
总而言之是你KEY=CY这句话是有问题的,如果删去,程序应该就正常了
如果照你这么说,把P1.0口输出1,P1.1口输出0,然后P1.1口和P1.0口用导线连接起来,在此期间,加入一个按钮。然后在P1.0口放一个上拉电阻,之后按下按钮你会发现P1.0口会被拉成低电平,而P1.1口却不会变成高电平。这就说明了,如果IO口做输入,不先置1的话,就只能做输出用,如果置1了的话,才能做输入口用
ywhjp
2012-09-19 · TA获得超过1299个赞
知道小有建树答主
回答量:1002
采纳率:60%
帮助的人:435万
展开全部
CY=KEY; 这句是把P1.0 读入并放进 CY中
KEY=CY; 这句是导致程序问题的根本原因

在没有按键时, 是不会出现问题的
但有按键时, KEY=0 的时候, 问题就出来了, 比过这两句程序之间 P1.0变成了0, 程序一直在这里面循环, 所以P1.0一直是0了, 也就读不到P1.0的其他状态了
更多追问追答
追问
按键按下后,P1.0=0,这时我松开按键,想当于P1.0引脚空置,CY=KEY(汇编MOV)语句会认为KEY等于0,
if(!KEY) (汇编JB)认为KEY等于1,那按你所说,汇编也应该认为是0才对
追答
是的,  前面只要KEY=0输出过一次, 以后就都是0了,  它自己是不会变回1的,  除非你重置KEY=1才行, 不然读进KEY就一直是0了, 汇编也一样
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-09-19
展开全部
没使用指针代码
追问
什么指针代码
追答
逻辑错误
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式