打印
[51单片机]

大侠帮我,为什么我这个一直在加,我只想按一下键再加

[复制链接]
2369|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雷雷|  楼主 | 2014-1-19 20:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 雷雷 于 2014-1-19 20:28 编辑

大侠帮我看一下,为什么我这个一直在加,我只想按一下键再加


#include<reg51.h>
unsigned int shu[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned int huan[8];
unsigned int a,b,c,d,number,k,g,count;

void delay(unsigned char i)                  //*************一毫秒延时****************//
{
unsigned int j;
for(i;i > 0;i--)
for(j = 0;j < 200;j++);
}

        
bit key()                        //*************按键扫描*********************//
{
static bit wei = 1;
if((P2^7 == 0)&&(wei != 0))
{
wei = 0;
return 1;
}
else
wei = P2^7;
return 0;
}


int main()                   //************主程序***************//
{


while(1)
{
if(g == 0x00)
{
while(1)
{
if(key())
{number++;
}


for(k = 0;k < 8;k++)
{
huan[0] = shu[number/1000];
huan[1] = shu[number%1000/100];
huan[2] = shu[number%100/10];
huan[3] = shu[number%10];
huan[4] = shu[a];
huan[5] = shu;
huan[6] = shu[c];
huan[7] = shu[d];
P1 = 0xff;
P0 = huan[k];
P1 = ~(1 << k);
delay(1);

}
}
}
}
}

相关帖子

沙发
popeye021| | 2014-1-19 21:42 | 只看该作者
你这个问题如果单步跟踪调试的话,应该很容易解决。最好靠自己找到原因,收获更大。
努力吧,骚年!!!!:lol

使用特权

评论回复
板凳
549747249| | 2014-1-19 21:43 | 只看该作者
huan[0] = shu[number/1000];//奇怪,number/1000  那数组shu[number/1000]指向哪个元素?shu[number%1000]
//
  x=number;
  for(i=0;i<8;i++)
  {huan[i]=shu[x%10];
  x=x/10;
  }//用来装载数值各位数字的显示代码
还有你估计是用P1来完成数码管的切换吧,用K左移后置反的值?用个动态变量不耗什么吧,二进制的编码是那么的用?
再有按键扫描怎么没有延时去抖动?


使用特权

评论回复
地板
雷雷|  楼主 | 2014-1-20 00:17 | 只看该作者
popeye021 发表于 2014-1-19 21:42
你这个问题如果单步跟踪调试的话,应该很容易解决。最好靠自己找到原因,收获更大。
努力吧,骚年!!!!: ...

我是菜鸟,你就告诉我吧,我用了你的方法,也没找到问题,按理说,只有在我按下了P2^7才可以对number进行自加的,而我这个程序载入到单片机里,数码管的显示就是在那里不断的自加,我没有对他有按键按下

使用特权

评论回复
5
ayb_ice| | 2014-1-20 08:06 | 只看该作者
P2^7不等于P2.7

使用特权

评论回复
6
popeye021| | 2014-1-20 09:01 | 只看该作者
雷雷 发表于 2014-1-20 00:17
我是菜鸟,你就告诉我吧,我用了你的方法,也没找到问题,按理说,只有在我按下了P2^7才可以对number进行 ...

根据结果反推啊,先确认是因为不断执行key()函数使得number自加,再去分析key()函数,分析函数返回1的原因,顺藤摸瓜就能找到答案了。好好查查硬件电路,也许是硬件的问题。

使用特权

评论回复
7
liaohongcai8204| | 2014-1-20 09:54 | 只看该作者
你用万用表量一下P2.7口是不是一直为高!

使用特权

评论回复
8
xiaogui990045| | 2014-1-20 11:01 | 只看该作者
你好,我帮你分析一下吧:首先是这个函数
if((P2^7 == 0)&&(wei != 0))
{
wei = 0;
return 1;
}
你的意思是如果P27输入低电平,返回值为1,即这个子函数key() 一直为1对吧。

那么,主函数函数里调用了key() ;如下:
while(1)
{
if(key())     // 此时函数key() 的值一直为1啊!if语句这里一直处于死循环哦!number++当然是一直加下去,而且是没完没了的。
{number++;  //在这里,你的意思应该是按一次键,number加一次,加完之后你并没有做处理。比如退出if函数还是做其他处理?
}

使用特权

评论回复
9
549747249| | 2014-1-20 13:12 | 只看该作者
1,首先要判断number是否在没有按下按键下在自加(直接从IO口输出,看二进制数值)
2,数码管在扫描显示证明:number自加函数没有进死循环,key()!=1
3,8位显示数码管函数
for(k=0;k<8;k++)
{ nusigned int x;
  unsigned char i;
  x=number;
  for(i=0;i<4;i++)
  {huan[i]=shu[x%10];
  x=x/10;
  }//用来装载数值各位数字的显示
  huan[4]=shu[a];
  huan[5]=shu[0];
  huan[6]=shu[c];
  huan[7]=shu[d];
  P1=0xff;
  P0=huan[k];
  if(k==0) P1=~0x01;
  if(k==1) P1=~0x02;
  if(k==2) P1=~0x04;
  if(k==3) P1=~0x08;
  if(k==4) P1=~0x10;
  if(k==5) P1=~0x20;
  if(k==6) P1=~0x40;
  if(k==7) P1=~0x80;
  delay(1);
}
4:如果要计八位数值为什么不用长整形long?
5:数码管显示代码数组用char字符型就足够
6;一个按键根本不用另作扫描函数,直接判断如果是0加延时再确定是否还是0,还是的话number++;(如果要按住不放只加一,像你之前加个标识)

使用特权

评论回复
10
wang168506| | 2014-1-20 13:22 | 只看该作者
你是想检测到1之后返回给1  主函数扫描key函数返回值,这种思路乍一看是没错的,可是你忘了一点,就是当你按下按键松开之后的处理,应该二次检测一下  如果检测之后P27已经被按下又松开了  你应该把标志位清0

使用特权

评论回复
11
ZG11211| | 2014-1-20 21:04 | 只看该作者
还是按7楼说的,先拿万用表测一下P2^7是不是高电平再说吧。

使用特权

评论回复
12
ningling_21| | 2014-1-21 08:52 | 只看该作者
为什么不用 sbit 定义管脚呢?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
雷雷 + 1 最简单的一句话,最有用的一句话!.
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

37

帖子

0

粉丝