![]() |
你說的,有時按下好幾次才會有反應,是因為你程序里沒有做按鍵復位的判斷。看下我的這個,應該可以幫到你。 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;//消隱 } } 給你一個差不多的例子 |