请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
搜索
查看: 1707|回复: 7

程序不是一样的么?哪里出了问题

[复制链接]

1

主题

1

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2020-2-22 13:41:30 | 显示全部楼层 |阅读模式
1金钱
我写的程序
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;

sbit k1=P3^1;
sbit led=P2^0;

void delay(u16 i)
{
        while(i--);       
}

void keypros()
{
        if(k1==0)
        {
                delay(1000);
                if(k1==0);//led灯低电平亮
                {
                        led=~led;               
                }
                while(!k1);//松开是高电平,非 成为低电平
        }
}

void main()
{
        led=1;
        while(1)
        {
                keypros();
        }

}




开发板提供的程序
/*************************************************************************************

*
实验现象:下载程序后按下K1按键可以对D1小灯状态取反
接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)
                                          
注意事项:                                                                               

                                                                                  
**************************************************************************************

*/

#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

sbit k1=P3^1;         //定义P31口是k1
sbit led=P2^0;         //定义P20口是led

/*******************************************************************************
* 函 数 名         : delay
* 函数功能                   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}

/*******************************************************************************
* 函 数 名         : keypros
* 函数功能                   : 按键处理函数,判断按键K1是否按下
*******************************************************************************/
void keypros()
{
        if(k1==0)                  //检测按键K1是否按下
        {       
                delay(1000);   //消除抖动 一般大约10ms
                if(k1==0)         //再次判断按键是否按下
                {
                        led=~led;          //led状态取反
                }
                while(!k1);         //检测按键是否松开
        }               
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       
        led=1;
        while(1)
        {       
                keypros();  //按键处理函数       
        }               
}



这两个是独立按键控制led灯的亮灭
为什么我写的程序按键有时候会失灵,而开发板提供的按键非常准确啊?
我们俩的程序几乎是一样的啊
我知道答案 本帖寻求最佳答案回答被采纳后将获得系统奖励10 金钱 , 目前已有6人回答

回复

使用道具 举报

0

主题

11

帖子

33

积分

新手上路

Rank: 1

积分
33
QQ
发表于 2020-2-23 21:28:20 | 显示全部楼层
把你的代码全部复制到例程的工程文件里面试一下,或者新建工程把你的代码复制进去,看是不是工程问题。
回复

使用道具 举报

0

主题

3

帖子

36

积分

新手上路

Rank: 1

积分
36
发表于 2021-3-8 17:19:28 | 显示全部楼层
  if(k1==0);//led灯低电平亮   括号不需要加;
回复

使用道具 举报

3

主题

6

帖子

37

积分

新手上路

Rank: 1

积分
37
发表于 2021-3-16 00:28:43 | 显示全部楼层
用你的文件在我的A7上没问题
回复

使用道具 举报

0

主题

48

帖子

178

积分

注册会员

Rank: 2

积分
178
发表于 2021-3-19 09:13:36 | 显示全部楼层
怎么会一样呢,你的 if(k1==0);//led灯低电平亮 这一行,在 (ke==0) 的后面多了一个分号,意思又大不一样了,也就是说if后只跟了一个空语句,而下面的花括号现在不归if来管辖了。
回复

使用道具 举报

0

主题

48

帖子

178

积分

注册会员

Rank: 2

积分
178
发表于 2021-3-26 09:21:17 | 显示全部楼层
新手所说的一样,那肯定是不一样
回复

使用道具 举报

3

主题

11

帖子

43

积分

新手上路

Rank: 1

积分
43
发表于 2021-3-29 01:40:14 | 显示全部楼层
在按键判断语句中,延迟后的二次判断按键是否按下,你写的是if(k1==0);   注意你后面有个分号,就是说当k1==1的时候,程序运行语句;  注意单一个引号也算一个语句。  这样的话,延迟后的二次判断相当于作废。
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2021-4-19 13:35 , Processed in 0.125000 second(s), 31 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2020, Tencent Cloud.

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