|
人机交互的界面,其中之一就是键盘.键盘扫描的方法很多,状态机是其中一种,调试了好几天,终于调好了 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; } } |
微信公众号
手机版
进一次中断就检测一下有没有按键啊,本来想用定时器中断的,可还不熟悉
你的键盘处理也在中断中,这个有点不合理
关于消抖,建议你看看状态机按键原理就明白了