📄 key_service.c
字号:
// 文件名: 595LED.c
// 作 者: xinqiang Zhang(小丑) (email: xinqiang@Mzdesign.com.cn)
// 日 期: 2007/06/29
// 描 述: 通过四个595,共两组,驱动12个LED数码管的显示驱动程序集
//
// 参 考: 无
// 版 本:
// 2007/06/29 First version Mz Design
//========================================================================
#include "LPC213x.H" /* LPC21xx definitions */
#include "type.h"
unsigned int Key_Sample1=0; //当前对按键采样的值
unsigned int Key_Sample2=0; //上一次对按键采样的值
unsigned int Key_Scan_old=0; //上一次有效的键值状态
//(必需连续两次的采样值相同时才能载入该变量中)
unsigned char Key_Down_flag=0; //键盘按下标识,注意是经过消抖后确认的按下标识
unsigned char Key_Down_Counter=0; //用于消抖
unsigned int Key_Value=0; //最终经过确认的键值
unsigned int Key_Data=0;
unsigned char Key_flag=0;
unsigned char Key_flag_long=0; //长时按键标识~
unsigned char Key_Down_Counter_l=0; //长时按键计数器
unsigned char Key_Release_flag=0; //在有些按键中防止长按键时重复响应用的
void Key_Initial(void)
{
PINSEL1 &= ~(0xfffcff00);
PINSEL2 &= ~(0x00000008);
IODIR0 &=~(0xfef00000);
IODIR1 &= ~(1<<20);
}
void KeyScan_Service(void)
{
unsigned int uiTemp;
Key_Sample1 = (IOPIN0&0xfef00000)>>20;//
uiTemp = (IOPIN1&(1<<20))>>9;
Key_Sample1 |= uiTemp;
Key_Sample1 ^=0x0fef;
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>=20)
{
Key_Down_Counter = 0;
Key_Down_Counter_l=20;
Key_Down_flag = 1;
Key_Value = Key_Sample1; //将确认的键值载入缓存器中,供键抬起后处理用
}
}
else
{
Key_Down_Counter = 0; //重新计数,即重新消抖
Key_flag_long=0;
// Key_Down_Counter_l=0;
}
}
else //如已经过消抖,则判断是否有组合键按下?如无则直接退出处理
{
Key_Down_Counter_l++;//
if(Key_Down_Counter_l>=200)
{
Key_flag_long=1;
Key_Down_Counter_l=150;
}
}
}
else //否则就处理之前是否有键是经过确认的
{ //如果已经有键按下,并确认消抖后则处理键值
if(Key_Down_flag==1)
{
Key_Down_flag = 0;//
Key_Data = Key_Value;
Key_flag = 1;
Key_Down_Counter = 0;
// Key_Down_Counter_l=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; //保存当次的值
}
unsigned char Key_Get(void)
{
unsigned char KK=0;
if(Key_Release_flag==1) return KK;
if(Key_flag_long==1)
{
Key_flag_long=0;
switch(Key_Value)
{
case 0x0001: KK = 1;break;
case 0x0002: KK = 2;break;
case 0x0004: KK = 3;break;
case 0x0008: KK = 4;break;
case 0x0020: KK = 5;break;
case 0x0040: KK = 6;break;
case 0x0024: KK = 12;Key_Release_flag = 1; break;
case 0x0080: KK = 0x17; Key_Release_flag =1; break;
case 0x0100: KK = 0x18; Key_Release_flag =1; break;
case 0x0200: KK = 0x19; Key_Release_flag =1; break;
case 0x0400: KK = 0x1a; Key_Release_flag =1; break;
default : KK=0;
}
if(KK!=0)
{
Key_flag=0;
// Key_Down_Counter = 0;
// Key_Down_flag = 0;
return KK;
}
}
if(Key_flag!=0)
{
Key_flag=0;
Key_Down_Counter = 0;
Key_Down_flag = 0;
switch(Key_Data)
{
case 0x0001: KK = 1;break;
case 0x0002: KK = 2;break;
case 0x0004: KK = 3;break;
case 0x0008: KK = 4;break;
case 0x0020: KK = 5;break;
case 0x0040: KK = 6;break;
case 0x0080: KK = 7;break;
case 0x0100: KK = 8;break;
case 0x0200: KK = 9;break;
case 0x0400: KK = 10;break;
case 0x0800: KK = 11;break;
default : break;
// case 0x0002: KK = 2;break;
}
return KK;
}
else return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -