#define IO_KEY1 P00 //复用LED_SegA //按键复用
#define IO_KEY2 P01 //复用LED_SegB
#define IO_KEY3 P02 //复用LED_SegC
#define IO_KEY4 P03 //复用LED_SegD
#define IO_KEY5 P04 //复用LED_SegE
//*********************** 按键值 *************************************
#define KEYVALUE_Key1 0x01 //IO_KEY1按键有效的对应值
#define KEYVALUE_Key2 0x02 //IO_KEY2按键有效的对应值
#define KEYVALUE_Key3 0x04 //IO_KEY3按键有效的对应值
#define KEYVALUE_Key4 0x08 //IO_KEY4按键有效的对应值
#define KEYVALUE_Key5 0x10 //IO_KEY5按键有效的对应值
unsigned char bdata KEYFlag =0; //按键状态寄存器
sbit KEYFlag1 = KEYFlag^0; //IO_KEY1的按键状态
sbit KEYFlag2 = KEYFlag^1; //IO_KEY2的按键状态
sbit KEYFlag3 = KEYFlag^2; //IO_KEY3的按键状态
sbit KEYFlag4 = KEYFlag^3; //IO_KEY4的按键状态
sbit KEYFlag5 = KEYFlag^4; //IO_KEY5的按键状态
unsigned char keydata_temp; //按键扫描值
unsigned char keydata_old; //上次的按键值
unsigned int keypresscount; //按键按下计时寄存器
unsigned int NOPressTime; //按键没有按的计时寄存器???????
void keyscan(void)
{
unsigned char i;
wei1=0;wei2=0; wei3=0; wei4=0;wei5=0;wei6=0;
P0M = 0xE0; //0b11100000 //0为输入,1为输出 输入输出控制寄存器,将各个段码改为输入
P0UR = 0x1F; //0b00011111 //内置上拉寄存器 1上拉 0无上拉
for(i=0;i<10;i++)//20us
{
_nop_ ();
_nop_ ();
}
keydata_temp = 0;
if(IO_KEY1 == 0)
{
keydata_temp |= KEYVALUE_Key1;
}
if(IO_KEY2== 0)
{
keydata_temp |= KEYVALUE_Key2;
}
if(IO_KEY3 == 0)
{
keydata_temp |= KEYVALUE_Key3;
}
if(IO_KEY4 == 0)
{
keydata_temp |= KEYVALUE_Key4;
}
if(IO_KEY5 == 0)
{
keydata_temp |= KEYVALUE_Key5;
}
P0M = 0xFF; //0b11111111 //0为输入,1为输出 输入输出控制寄存器,将各个段码改为输入
P0UR = 0x00; //0b00000000
}
void KeyService(void)
{ uchar t;
if(keydata_temp == 0)
{//按键未按下
keypresscount = 0;
keydata_old = 0;
NOPressTime++;
if(NOPressTime>=2500) NOPressTime=2501;
}
else
{
if(keydata_temp == keydata_old)
{
NOPressTime = 0;
keypresscount++;
if(keypresscount>60000) keypresscount =60000;
if(keypresscount == 25)
{
if(keydata_temp == KEYVALUE_Key1)
{
KEYFlag1 =1;
}
if(keydata_temp == KEYVALUE_Key2)
{
KEYFlag2 =1;
}
if(keydata_temp == KEYVALUE_Key3)
{
KEYFlag3 =1;
}
if(keydata_temp == KEYVALUE_Key4)
{
KEYFlag4 =1;
}
if(keydata_temp == KEYVALUE_Key5)
{
KEYFlag5 =1;
}
}
}
else
{
if(keypresscount < 5)
{
keypresscount = 0;
keydata_old = keydata_temp;
}
}
}
|