你说的,有时按下好几次才会有反应,是因为你程序里没有做按键复位的判断。看下我的这个,应该可以帮到你。 void KeyCheck() { if(Key == 0) //检测按键是否被按下 { delay_ms(10); //消抖动 if(Key == 0) { while(!Key) //等待按键松开 {delay_ms(1);} LED1 = ~LED1; //LED状态取反 } } } |
不要用延时 用状态机处理 |
LED1=0; //定义初始状态 if (key1==0)判断按下 { delay(20);//消抖 if (key1==0) LED1=~LED1; //LED取反 } |
给你一个简单的思路 LED1=0; //定义初始状态 if (key1==0)判断按下 { delay(20);//消抖 if (key1==0) LED1=~LED1; //LED取反 } |
看看我这个,肯定是可以的,已经用很久了。 if(k1==0)//扫描键盘k1 { Delay10ms(1);//按下消抖 if(k1==0) {//以下内容就是你想干的事儿 if(j==0xff)//如果全灭 { j=0x00;//则全开 GPIO_LED=j; } else//反之 { j=0xff;//则全灭 GPIO_LED=j; } while((i<50)&&(k1==0))//松开消抖 { Delay10ms(1); i++; } i=0; } } 这不是我的程序,是我买的板子的资料。 |
为何要去控制中断,中断一旦关闭,也就失去了中断的用处了.思路还要重新理顺. |
float dis_key=0; void delay10ms(void) //误差 0us { unsigned char a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); } void keyscan() { if(key1==0) { delay10ms();//消抖 if(key1==0) { dis_key=0; } } if(key2==0) { delay10ms();//消抖 if(key2==0) { dis_key=100.0; } } } void display_key() { unsigned int i=0,dis[4]; dis[0]=(int)(dis_key*10)/1000;//百位 dis[1]=(int)(dis_key*10)%1000/100;//十位 dis[2]=(int)(dis_key*10)%100/10;//个位 dis[3]=(int)(dis_key*10)%10;//十分位 for(i=0;i<4;i++) { P1=dispbitcode[i];//位选择 P0=dispcode[i]; delay10ms(); P1=0;P0=0;//消隐 } } 给你一个差不多的例子 |