标题: 51单片机P1口输入输出 [打印本页]

作者: highffff    时间: 2014-8-15 21:51
标题: 51单片机P1口输入输出
#include <reg52.h>
#include <stdio.h>

sbit L4 = P1^4;

void DELAY();


void main()
{
        unsigned char k;
        unsigned char k_temp;
        k = P1;
        if (k == 0xFE)
        {
                DELAY();
                k_temp = P1;
                if(k_temp == k)
                {
                //P2 = 0xFE;
                L4 = 0;
                }
                else
                {
                        L4 = 1;
                }
        }

}

void DELAY()
{
        int i,j;
        for (i = 0;i < 1000;i++)
        {
                for (j = 0;j < 10;j++);
        }
}

为什么加了DELAY();后LED灯会闪烁,想不明白啊


作者: 明白    时间: 2014-8-15 21:53
延时时间多长了
作者: admin    时间: 2014-8-15 23:57
DELAY();加哪里的

作者: XUSHENG    时间: 2014-8-16 00:07
这延时,不知你加哪了
作者: liaolinhui    时间: 2014-8-16 00:14
本帖最后由 liaolinhui 于 2014-8-16 12:20 编辑

觉得你这程序很不合逻辑
#include <reg52.h>
#include <stdio.h>

sbit L4 = P1^4;

void DELAY();


void main()
{
        unsigned char k;
        unsigned char k_temp;
        k = P1; //这里你让k=P1,
        if (k == 0xFE)
        {
                DELAY();
                k_temp = P1;//这里你又让k_temp=P1
                if(k_temp == k)//所以这里你是想通过延时一段时间后判断按键是否松开,对吧,但是单片机执行指令是很快的,延时完了你没及时松开,程序就直接判断k_temo==k,所以执行L4=0,而如果你延时程序没延时完及时松开了,那么程序就判断k_temp不等于k,而执行L4=1,
                {
                //P2 = 0xFE;
                L4 = 0;
                }
                else
                {
                        L4 = 1;
                }
        }

}

void DELAY()
{
        int i,j;
        for (i = 0;i < 1000;i++)
        {
                for (j = 0;j < 10;j++);
        }
}
作者: highffff    时间: 2014-8-16 16:52
liaolinhui 发表于 2014-8-16 00:14
觉得你这程序很不合逻辑
#include
#include

对,基本想法如你所说,延时主要想取消按键抖动影响。可是想不明白加入延时之后LED灯亮度变暗,不停闪烁。当我把DELAY();取消后LED灯就不闪烁了O O
作者: highffff    时间: 2014-8-16 16:53
XUSHENG 发表于 2014-8-16 00:07
这延时,不知你加哪了

sorry,下次加注释,这次忘了~~
unsigned char k;
        unsigned char k_temp;
        k = P1;
        if (k == 0xFE)
        {
                DELAY();  //延时
                k_temp = P1;
作者: highffff    时间: 2014-8-16 16:58
admin 发表于 2014-8-15 23:57
DELAY();加哪里的

sorry,下次加注释,这次忘了~~
unsigned char k;
        unsigned char k_temp;
        k = P1;
        if (k == 0xFE)
        {
                DELAY();  //延时
                k_temp = P1;
作者: highffff    时间: 2014-8-16 16:58
明白 发表于 2014-8-15 21:53
延时时间多长了

12M晶振,10MS吧

作者: hkccd    时间: 2014-8-16 19:02
用的软件放纵一下就知道时间了
作者: hkccd    时间: 2014-8-16 19:02
软件仿真
作者: XUSHENG    时间: 2014-8-18 13:06
highffff 发表于 2014-8-16 16:53
sorry,下次加注释,这次忘了~~
unsigned char k;
        unsigned char k_temp;

unsigned char k;
        unsigned char k_temp;
        k = P1;
        if (k == 0xFE)//K是否OXFE//
        {
                DELAY();  //延时
              if(k == 0xFE)//再次确认K是否OXFE//
                {k_temp = P1;}
作者: highffff    时间: 2014-8-19 13:13
XUSHENG 发表于 2014-8-18 13:06
unsigned char k;
        unsigned char k_temp;
        k = P1;

你的意思是去掉中间转换的变量k_temp,直接去判断两次k==0xFE?,这样做和原来区别在哪里呀?
作者: highffff    时间: 2014-8-19 19:04
XUSHENG 发表于 2014-8-18 13:06
unsigned char k;
        unsigned char k_temp;
        k = P1;

我知道原因了,想明白了~~
作者: highffff    时间: 2014-8-19 19:04
liaolinhui 发表于 2014-8-16 00:14
觉得你这程序很不合逻辑
#include
#include

我知道原因了~~
作者: heise    时间: 2014-8-19 20:27
找到就好 我也想知道原因  能不能说一下
作者: highffff    时间: 2014-8-19 21:42
heise 发表于 2014-8-19 20:27
找到就好 我也想知道原因  能不能说一下

在P1口输出时我用的是P1^4,但是在扫描输入时我用的是P1全口定义,在P1^4= 0后,k==0xFE已经是判断不成立了,所以会把P1^4= 1,如此反复循环,LED就亮灭闪烁~~还有我的else函数写错地方了~~
作者: heise    时间: 2014-8-19 22:15
共同学习 学习
作者: 飞翔的耗子    时间: 2015-8-7 09:09
学学!
作者: yangganglone    时间: 2015-8-7 12:35
这种程序太烂了,没有一点移植性




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1