大家给看看这个代码

2019-07-15 22:02发布

本来想按一次按键加一的,可是实际情况是按一次按键加三
这是在《单片机C语言程序设计实训100例》中的例子,我看了好几遍代码了,找不到问题,大家帮忙给看看
1234.PNG



#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar Num_Buffer[]={0,0,0};
uchar Key_Code,Key_Counts=0;
void DelayMS(int x)
{
uchar i;
while(x--)for(i=0; i<120; i++);
}

void Show_Counts_ON_DSY()
{
uchar i,j=0x01;
Num_Buffer[2]=Key_Counts/100;
Num_Buffer[1]=Key_Counts/10%10;
Num_Buffer[0]=Key_Counts%10;
for(i=0; i<3; i++)
{
  j=_cror_(j,1);
  P0=0xff;
  P0=DSY_CODE[Num_Buffer];
  P2=j;
  DelayMS(1);
}
}
void main()
{
uchar i;
P0=0xff;
P1=0xff;
P2=0x00;
Key_Code=0xff;
while(1)
{
  Show_Counts_ON_DSY();
  P1=0xff;
  Key_Code=P1;
  if(Key_Code!=0xff)
   for(i=0; i<30; i++)Show_Counts_ON_DSY();
  switch(Key_Code)
  {
   case 0xfe: if(Key_Counts<255)Key_Counts++;
              break;
   case 0xfd: if(Key_Counts>0)Key_Counts--;
              break;
   case 0xfb: Key_Counts=0;
  }
  Key_Code=0xff;
}
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
青菜家族凯
1楼-- · 2019-07-15 22:04
没有消抖吧,按键,按下去的时候你要检测是否真的按下去了,还有释放的时候也是。要有相应的消抖程序。
duoluoxiaosheng
2楼-- · 2019-07-16 01:33
青菜家族凯 发表于 2013-10-21 10:16
没有消抖吧,按键,按下去的时候你要检测是否真的按下去了,还有释放的时候也是。要有相应的消抖程序。 ...

问题是不管是按加,还是按减,都是变化3个数,而且我是用软件仿真的说
122553120
3楼-- · 2019-07-16 05:12
 精彩回答 2  元偷偷看……
yupoxiaok
4楼-- · 2019-07-16 07:46
路过,看看,看看
duoluoxiaosheng
5楼-- · 2019-07-16 08:43
本帖最后由 duoluoxiaosheng 于 2013-10-24 14:49 编辑
122553120 发表于 2013-10-23 15:55
if(Key_Code!=0xff)
   for(i=0; i

这个真有效诶,我该成60的时候按一次加2,改成90的时候就按一次加1了,大神能给解释一下吗,难道是因为延时不够,导致程序多次执行,嗯……我觉得是这样的
122553120
6楼-- · 2019-07-16 11:43
duoluoxiaosheng 发表于 2013-10-24 14:46
这个真有效诶,我该成60的时候按一次加2,改成90的时候就按一次加1了,大神能给解释一下吗,难道是因为延 ...

恩、、应该是吧、、延时不够的话、当你一次按下按键、程序执行太快可能会误判为长按、就会一直往上加了(个人是这么理解的)....、  还有啊、我不是什么大神啊、我是个初学者、、

一周热门 更多>