
人机交互的界面,其中之一就是键盘.键盘扫描的方法很多,状态机是其中一种,调试了好几天,终于调好了 void Key_Scan(void) { static unsigned int KeyStateTemp = 0; //初始化键盘状态变量 static unsigned int KeyTime=0; //初始化按键时间变量 switch(KeyStateTemp) { case StateInit: if(!KEY1_USER) //判断按键是否按下 KeyStateTemp = StateAffirm; break; case StateAffirm: if(!KEY1_USER) { KeyTime = 0; KeyStateTemp = StateSingle; } else KeyStateTemp = StateInit; break; case StateSingle: if(KEY1_USER ) { KeyStateTemp = StateInit; num++; sprintf(buffer,"%-16d",num); //把按键次数转换成字符 display_x(0x98,buffer); //把转换的按键次数显示到液晶上 if(125== num) num = 0; } else if(++KeyTime> 50) //如果按键时间大于50*20MS { KeyStateTemp = StateRepeat; KeyTime = 0; } break; case StateRepeat: if(KEY1_USER ) KeyStateTemp = StateInit; else if(++KeyTime> 10) //如果按键时间大于10*20 { KeyTime = 0; num++; sprintf(buffer,"%-16d",num); display_x(0x98,buffer); if(125== num) num = 0; } break; default: KeyStateTemp = KeyStateTemp = StateInit; break; } } 中断函数的设置 void SysTick_Handler(void) { systick_num++; if(systick_num==20) { Key_Scan(); systick_num =0; } } |
抖动有20MS长吗,第1次中断后,假如是抖动的话,第2次进入中断,如果按键状态保持,就认为是按键了,否则认为是抖动
是20MS进入中断检测一下键盘,不是触发键盘中断
你的键盘处理也在中断中,这个有点不合理
进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
关于消抖,建议你看看状态机按键原理就明白了
你在键盘中断中处理按键,状态机原理有冲突啊?
请问冲突在哪
抖动的时候仍会进中断,状态也跟着抖,如何消抖。