三行代码
#define KEYPORT KB1 | (KB2<<1) | (KB3<<2) | (KB4<<3) | 0xf0
void Key_Read( void )
{
unsigned char ReadData = (KEYPORT)^0xff; // 1
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3
}
Name : Key_Read
Function:
(1) No key : ReadData=0;Trg=0;Cont=0;
(2) D0 is 0 : KEYPORT=0xfe; ReadDate=0x01; Trg=0x01&(0x01^0x00) = 0x01; Cont=0x01;
(3) when D0 is always 0 : Trg=0x01&(0x01^0x01)=0 ; Cont=0x01;
(4) when D0 is 1: Trg=0x00&(0x00^0x01)=0 Cont=0;
运用
u16 key_time=0; //来统计B1按键长按的时间
if(key_flag) //10ms调用一次 key_time
{
key_flag=0;
Key_Read();
if(Trg==0x01) //B1按键
{
}
if(Trg==0x02) //B2按键
{
}
if(Trg==0x04) //B3按键
{
}
if(Trg==0x08) //B4按键
{
}
if(Cont==0x01) //B1的长按检测
{
key_time++; //小细节 每次key_flag10ms检测按键所以在这里key_time++相当于10ms加一次
if(key_time>=50) //超过500ms
{
key_time=0;
}
}
if(Trg==0x00 && Cont==0x00) //松手检测
{
key_time=0;
}
}
长按单次触发
_Bool key1_release=1;
if(Cont==0x01)
{
key_time++;
if(key_time>=50 && key_release==1)
{
key_time = 0;
key_release = 0;
lcd_number+=10;
}
}
if(Trg==0x00 && Cont==0x00)
{
key_time=0;
key_release = 1;
}
区别长按与短按(长按单次)
if(Cont==0x01)
{
key_time++;
if(key_time>=50 && key_release==1 )
{
key1_release = 0;
lcd_number+=10;
}
}
if(Trg==0x00 && Cont==0x00)
{
if(key_time>0 && key_time<50 && key_release==1)
{
lcd_number++;
}
key_time=0;
key_release=1;
}