| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1097 人关注过本帖
标题:同样的两个程序,实现的功能却不同,所以请教大家。2个程序哪里有什么区别, ...
只看楼主 加入收藏
csz9981
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2013-5-16
结帖率:0
收藏
已结贴  问题点数:10 回复次数:3 
同样的两个程序,实现的功能却不同,所以请教大家。2个程序哪里有什么区别,请指教,困扰了我3天了,没有想明白。怎样才能使key3.c也能实现key1.c正常的功能


关于4个独立按键的小程序, 实现功能如下:
* 实验名               : 独立按键实验
* 使用的IO         : LED使用P2,键盘使用P3.0、P3.1、P3.2、P3.3
* 实验效果       : 按下K1键,灭掉LED,按下K2键,打开所有的LED,按下K3键,LED左移一位,按下K4键,LED右移一位。


key3.c

#include<reg51.h>
#include<intrins.h>   
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;

void Delay10ms(void)   //误差 0us 延时10ms
{
    unsigned char a,b;
         for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}   

void main(void)
{
    char i;
    P2=0;
    while(1)
    {
        if(K1==0)                     //检测按键K1是否按下
        {
            Delay10ms();             //消除抖动
            if(K1==0)                //再次检测按键是否按下
            P2=0;                     
        
        }        
        if(K2==0)                      //检测按键K2是否按下
        {
            Delay10ms();
            if(K2==0)
                P2=0xff;
            
        }            
        if(K3==0)                       //检测按键K3是否按下
        {
            Delay10ms();
            if(K3==0)
            {
                if((P2==0)||(P2==0xff)) //如果当前状态是全亮的或者全灭的,就点亮他的第一盏灯
                P2=0xfe;
                else
                P2=_crol_(P2,1);            //左移一位
            }
            while((i<50)&&(K3==0))
            {
             Delay10ms();
             i++;
            }
            i=0;
        }
            
        if(K4==0)                    //检测按键K4是否按下
        {
            Delay10ms();
            if(K4==0)
            {
                if((P2==0)||(P2==0xff))
                {
                    P2=0xfe;
                }
                else
                    P2=_cror_(P2,1);        //右移一位
            }
            while((i<50)&&(K4==0))
            {
                Delay10ms();
                i++;
            }
            i=0;
        }
    }               
}





key1.c


#include<reg51.h>
#include<intrins.h>

sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
void delay10ms()
{
char a,b;
for(a=38;a>0;a--)
for(b=130;b>0;b--);
}

void main()
{  char i=0;
while(1)
{
 if(k1==0)
 {
  delay10ms();
  if(k1==0)
  P2=0xff;
 }
 if(k2==0)
 {
  delay10ms();
  if(k2==0)
  P2=0;
 }

 if(k3==0)
 {
  delay10ms();
  if(k3==0)
  {
   if((P2==0)||(P2==0xff))
    P2=0xfe;
   else
    P2=_crol_(P2,1);
  while((i<50)&&(k3==0))
   {
   delay10ms();
   i++;
   }
  i=0;
  }
 }
 if(k4==0)
 {
 delay10ms();
  if(k4==0)
  {
   if((P2==0)||(P2==0xff))
   P2=0xfe;
   else
   P2=_cror_(P2,1);
   }
   while((i<50)&&(k4==0))
   {
   delay10ms();
   i++;
   }
   i=0;
  }
 }
}


key3.c 能够实现正常的功能:按下K1键,灭掉LED,按下K2键,打开所有的LED,按下K3键,LED左移一位,如果按住K3,LED每隔500ms左移一位。按下K4键,LED右移一位。如果按住K4,LED每隔500ms右移一位。

key1.c 却不能实现正常的功能:按下K1键,灭掉LED,按下K2键,打开所有的LED正常。但是当按下K3键,LED不断地连续左移,如果按住K3,LED每隔10ms快速连续地左移。按下K4键,LED不断地连续右移。如果按住K4,LED每隔10ms快速连续地右移。


同样的两个程序,实现的功能却不同,所以请教大家。2个程序哪里有什么区别,请指教,困扰了我3天了,没有想明白。怎样才能使key3.c也能实现key1.c正常的功能?







搜索更多相关主题的帖子: include 键盘 
2016-12-20 21:57
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:10 
我看两个代码实现的功能似乎是一样的。如果你想实现按住的时候循环移动,只要在while循环里加一句就行(循环50次):

 while((i<50)&&(k3==0))
    {
    delay10ms();
    i++;
    P2=_crol_(P2,1);//或者P2=_cror_(P2,1);
    }
2016-12-21 09:58
csz9981
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2013-5-16
收藏
得分:0 
今天上午我又实验的时候发现了问题所在,
在这个
void delay10ms()
{
char a,b;/* 有符号char -127-127 */
for(a=38;a>0;a--)
for(b=130;b>0;b--);/* 但是b=130; 超过了127的范围,所以只执行了for(a=38;a>0;a--)这个计数,*/
}
在按住K3K4的时候,LED灯循环的速度是只有for(a=38;a>0;a--),而没有执行,for(b=130;b>0;b--)。
key1.c中把

void delay10ms()
{
unsigned char a,b;/* 无符号char 0-65535 */
for(a=38;a>0;a--)
for(b=130;b>0;b--);/* b=130;就在正常范围内了,就可以执行两个for语句了。*/
}




2016-12-21 12:52
csz9981
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2013-5-16
收藏
得分:0 
今天上午刚发现的这个问题,一个小失误,耽误了我很多时间,
2016-12-21 12:53
快速回复:同样的两个程序,实现的功能却不同,所以请教大家。2个程序哪里有什么 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064259 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved