void KeyScan_Service(void) { Port_Key_Data = KEY_MASK; Key_Sample1 = Port_Key_Data&KEY_MASK; Key_Sample1 = Key_Sample1^KEY_MASK; /////这里是不是有错(Key_Sample1应该是 Key_Sample2 if(Key_Sample1==Key_Sample2) { //连续两次扫描的键值相同,有效,则处理 if(Key_Sample1) //是否有键按下?如有则处理 { if(Key_Down_flag==0) //如果键值还没有被消抖确认,则确认是否与之前的键值一至 { if(Key_Sample1==Key_Scan_old) { Key_Down_Counter++; if(Key_Down_Counter>=KEY_DOWN_COUNTER_S) { Key_Down_Counter = 0; Key_Down_Counter_l=KEY_DOWN_COUNTER_S; Key_Down_flag = 1; Key_Value = Key_Sample1; //将确认的键值载入缓存器中,供键抬起后处理用 } } else { Key_Down_Counter = 0; //重新计数,即重新消抖 Key_flag_long=0; } } else //如已经过消抖,则判断是否有组合键按下?如无则直接退出处理 { Key_Down_Counter_l++;// if(Key_Down_Counter_l>=KEY_DOWN_COUNTER_L) { Key_flag_long=1; Key_Down_Counter_l=KEY_DOWN_COUNTER_L-KEY_DOWN_COUNTER_M; } } } else //否则就处理之前是否有键是经过确认的 { //如果已经有键按下,并确认消抖后则处理键值 if(Key_Down_flag==1) { Key_Down_flag = 0;// Key_Data = Key_Value; Key_flag = 1; Key_Down_Counter = 0; Key_flag_long=0; } if(Key_Release_flag==1) { Key_Release_flag=0; Key_flag = 0; } } Key_Scan_old = Key_Sample1; //保存这次的有效键值 } Key_Sample2 = Key_Sample1; //保存当次的值 } |