找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4909|回复: 19
收起左侧

51单片机P1口输入输出

[复制链接]
ID:64810 发表于 2014-8-15 21:51 | 显示全部楼层 |阅读模式
#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灯会闪烁,想不明白啊

回复

使用道具 举报

ID:19715 发表于 2014-8-15 21:53 | 显示全部楼层
延时时间多长了
回复

使用道具 举报

ID:1 发表于 2014-8-15 23:57 | 显示全部楼层
DELAY();加哪里的
回复

使用道具 举报

ID:63752 发表于 2014-8-16 00:07 来自触屏版 | 显示全部楼层
这延时,不知你加哪了
回复

使用道具 举报

ID:58502 发表于 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++);
        }
}

评分

参与人数 1威望 +15 黑币 +20 收起 理由
admin + 15 + 20 很给力!

查看全部评分

回复

使用道具 举报

ID:64810 发表于 2014-8-16 16:52 | 显示全部楼层
liaolinhui 发表于 2014-8-16 00:14
觉得你这程序很不合逻辑
#include
#include

对,基本想法如你所说,延时主要想取消按键抖动影响。可是想不明白加入延时之后LED灯亮度变暗,不停闪烁。当我把DELAY();取消后LED灯就不闪烁了O O
回复

使用道具 举报

ID:64810 发表于 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;
回复

使用道具 举报

ID:64810 发表于 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;
回复

使用道具 举报

ID:64810 发表于 2014-8-16 16:58 | 显示全部楼层
明白 发表于 2014-8-15 21:53
延时时间多长了

12M晶振,10MS吧
回复

使用道具 举报

ID:2318 发表于 2014-8-16 19:02 来自触屏版 | 显示全部楼层
用的软件放纵一下就知道时间了
回复

使用道具 举报

ID:2318 发表于 2014-8-16 19:02 来自触屏版 | 显示全部楼层
软件仿真
回复

使用道具 举报

ID:63752 发表于 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;}
回复

使用道具 举报

ID:64810 发表于 2014-8-19 13:13 | 显示全部楼层
XUSHENG 发表于 2014-8-18 13:06
unsigned char k;
        unsigned char k_temp;
        k = P1;

你的意思是去掉中间转换的变量k_temp,直接去判断两次k==0xFE?,这样做和原来区别在哪里呀?
回复

使用道具 举报

ID:64810 发表于 2014-8-19 19:04 | 显示全部楼层
XUSHENG 发表于 2014-8-18 13:06
unsigned char k;
        unsigned char k_temp;
        k = P1;

我知道原因了,想明白了~~
回复

使用道具 举报

ID:64810 发表于 2014-8-19 19:04 | 显示全部楼层
liaolinhui 发表于 2014-8-16 00:14
觉得你这程序很不合逻辑
#include
#include

我知道原因了~~
回复

使用道具 举报

ID:60266 发表于 2014-8-19 20:27 | 显示全部楼层
找到就好 我也想知道原因  能不能说一下
回复

使用道具 举报

ID:64810 发表于 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函数写错地方了~~

评分

参与人数 1威望 +5 黑币 +5 收起 理由
heise + 5 + 5 赞一个!

查看全部评分

回复

使用道具 举报

ID:60266 发表于 2014-8-19 22:15 | 显示全部楼层
共同学习 学习
回复

使用道具 举报

ID:87800 发表于 2015-8-7 09:09 | 显示全部楼层
学学!
回复

使用道具 举报

ID:87823 发表于 2015-8-7 12:35 | 显示全部楼层
这种程序太烂了,没有一点移植性
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表