📄 key.c
字号:
/***********************************************************
Key scan progrem
************************************************************/
#include <comm.h>
extern uchar key_press_flag;
extern uchar key_save_port;
extern uchar keyin_point;
extern uchar keyout_point;
extern uchar interrupt_request;
extern uchar key_buf[KEY_BUFF_MAX];
extern uchar SETUPLOCK;
void Key_Initialize_Wait(void)
{
keyin_point=0;
keyout_point=0;
key_save_port=0XF0;
interrupt_request=interrupt_request&~KEY_PRESS;
}
void Key_Scan(void)
{
static uchar i,k,j;
EA=0;
SELECT_KEY_PORT;
P2MDOUT=0;
P2=0xff;
i=P2;//Read key port
SETUPLOCK=P2&0x01;
EA=1;
i=i&0xf0;
if(i==0xf0)
{//No key pressed
key_press_flag=0;
key_save_port=i;
return;
}
if(0xf0==key_save_port)
{//The first time Key pressed
key_save_port=i;
return;
}
//The second time key pressed
if(i!=key_save_port)
{
key_save_port=0xf0;
return;//two times not same
}
if(key_press_flag) return;
key_press_flag=1;
k=0X10;
for(j=0;j<4;j++)
{
RESET_WATCHDOG;
if((i&k)==0) break;
k=k<<1;
}
if(j<=3)
{
key_buf[keyin_point++]=j+0x30;
if(keyin_point==KEY_BUFF_MAX) keyin_point=0;
interrupt_request=interrupt_request|KEY_PRESS;
}
}
uchar Key_Get(void)
{
uchar i;
if(keyin_point==keyout_point)//Key buffer is empty,no key be read
{
interrupt_request=interrupt_request&~KEY_PRESS;//Clear int event
return(0);
}
i=key_buf[keyout_point++];
if(keyout_point==KEY_BUFF_MAX) keyout_point=0;
if(keyin_point==keyout_point)
{//Key buffer is read end,clear interrupt flag
interrupt_request=interrupt_request&~KEY_PRESS;//Clear int event
}
return(i);
}
void Key_Buffer_Clear(void)
{
keyin_point=0;
keyout_point=0;
key_save_port=0xF0;
interrupt_request=interrupt_request&~KEY_PRESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -