📄 key_time.h
字号:
/* ================================================= */
/* */
/* KEY_TIME.H */
/* (c) 2001 Author HONGLEISHI */
/* */
/* 时间和查询按键 */
/* */
/* ================================================= */
#ifndef _KEY_TIME_H
#define _KEY_TIME_H
#include <string.h>
/* 定义T0中断时间 */
//#define T0_2MS5
//#define T0_5MS
#define T0_10MS
//#define T0_20MS
#ifdef T0_2MS5
#define T0TIME 2.5
#endif
#ifdef T0_5MS
#define T0TIME 5
#endif
#ifdef T0_10MS
#define T0TIME 10
#endif
#ifdef T0_20MS
#define T0TIME 20
#endif
#define KEY0 0 /* 无按键代码 */
#define KEY1 1 /* 按键1编码 */
#define KEY2 2 /* 按键2编码 */
#define KEY3 3 /* 按键3编码 */
#define KEY4 4 /* 按键4编码 */
#define KEY5 5 /* 按键5编码 */
#define KEY6 6 /* 按键6编码 */
#define KEY7 7 /* 按键7编码 */
#define KEY8 8 /* 按键8编码 */
#define KEY_NO KEY0 /* 无按键 */
#define KEY_EXCEED 0XFF /* 按键超时 */
#define KEY_BUFF_LEN 5 /* 按键缓冲区大小 */
#define KEY_EXCEED_TIME 60 /* 按键超时,秒 */
#define KEY_PRESS_TIME 2000 /*长按时间,毫秒 */
#define KEY_INTERVAL_TIME 20 /*长按间隔,毫秒 */
unsigned char keybuff[KEY_BUFF_LEN]; /* 按键缓冲区 */
unsigned char keytail=0; /* 按键指针尾 */
unsigned char B_keymark; /* 有按键标志 */
unsigned char keypress; /* 当前按键 */
unsigned char keylast3; /* 第三次按键 */
unsigned char keylast4; /* 第四次按键 */
unsigned char keycontinue=0; /* 长按键计数 */
unsigned char getkeytime; /* 按键超时长 */
/* 判断按键,根据实际改动 */
sbit JP1 = P3^3;
sbit JP2 = P3^4;
sbit JP3 = P3^5;
unsigned char encode()
{
unsigned char k;
JP1=JP2=JP3=1;
if(!JP1)k=KEY1;
else if(!JP2)k=KEY2;
else if(!JP3)k=KEY3;
else k=KEY0;
return k;
}
/* 按键初始化 */
void InitKey(void)
{
keytail=0;
B_keymark=0;
keypress=0;
keylast3=0;
keylast4=0;
keycontinue=0;
getkeytime=KEY_EXCEED_TIME;
}
/* 判断按键是否有效 定时器0中断调用 */
void keydowith(void)
{
keypress=encode();
if (!B_keymark) /* 第一次按键标志 */
{
if(keypress!=KEY0) /* 第一次按键 */
{
B_keymark=1;
keycontinue=0;
keylast3=keypress;
}
}
else
{
if(keypress!=KEY0) /* 按键未释放 */
{
if(keycontinue==3)keylast3=keypress;
if(keycontinue==4)keylast4=keypress;
if(keycontinue>KEY_PRESS_TIME/T0TIME) /*长按时间*/
{
if(keytail<KEY_BUFF_LEN)
keybuff[keytail++]=keylast3;
keycontinue=(KEY_PRESS_TIME-KEY_INTERVAL_TIME)/T0TIME;
}
else keycontinue++;
}
else
{
B_keymark=0;
if(keytail<KEY_BUFF_LEN &&
keycontinue>4 &&
keylast3==keylast4)
keybuff[keytail++]=keylast3;
}
getkeytime=KEY_EXCEED_TIME;
}
return;
}
/* 读按键,立即返回,不清缓冲区 */
unsigned char ReadKey(void)
{
return (!keytail)? KEY0:keybuff[0];
}
/* 读按键,有按键返回,不清缓冲区 */
unsigned char ReadKeyValid(void)
{
unsigned char k;
while((k=ReadKey())==KEY_NO)
{
if(!getkeytime)return KEY_EXCEED;
//ExWdtReset(); /* 复位看门狗 */
//wdt_reset();
};
return k;
}
/* 取按键,立即返回,清缓冲区 */
unsigned char GetKey(void)
{
unsigned char k;
if(!getkeytime)return KEY_EXCEED;
if(!keytail)return(KEY0);
k=keybuff[0];
memcpy((void *)keybuff,
(void *)(keybuff+1),
--keytail);
return(k);
}
/* 取按键,有按键返回,清缓冲区 */
unsigned char GetKeyValid(void)
{
unsigned char k;
while((k=GetKey())==KEY_NO)
{
if(!getkeytime)return KEY_EXCEED;
//ExWdtReset(); /* 复位看门狗 */
//wdt_reset();
}
return k;
}
/* ================================================= */
/* */
/* KEY_TIME.H */
/* (c) 2001 Author */
/* */
/* Description */
/* */
/* ================================================= */
/* 2.5 ms:0xf7 */
/* 5ms:0xee13 */
/* 10ms:0xdc */
/* 20ms:0xb8 */
#ifdef T0_2MS5
#define T0RELOADH 0xf7
#endif
#ifdef T0_5MS
#define T0RELOADH 0xee
#endif
#ifdef T0_10MS
#define T0RELOADH 0xdc
#endif
#ifdef T0_20MS
#define T0RELOADH 0xb8
#endif
#define T0RELOADL 0x00
unsigned char time_nms; // 10ms
unsigned char time_100ms; // 100ms
unsigned char time_second; // 1s
unsigned char time_minute; // 1m
unsigned char time_hour; // 1h
unsigned char soft_timer_nms0; // n 0
unsigned char soft_timer_nms1; // n 1
unsigned char soft_timer_nms2; // n 2
unsigned char soft_timer_100ms0; // 200 0
unsigned char soft_timer_100ms1; // 200 1
unsigned char soft_timer_100ms2; // 200 2
unsigned char soft_timer_second0; // 1 0
unsigned char soft_timer_second1; // 1 1
unsigned char soft_timer_second2; // 1 2
unsigned char soft_timer_minute0; // 1 0
unsigned char soft_timer_minute1; // 1 1
unsigned char soft_timer_minute2; // 1 2
/*****************************************************
* 定时器 0 *
*****************************************************/
void InitTimer0(void)
{
TR0=0; // 0
ET0=0;
TMOD=(TMOD&0xf0)|0x01;
TH0=T0RELOADH,TL0=T0RELOADL;
ET0=1;
TR0=1; // T0
return;
}
void timer0(void) interrupt 1
{
TR0=0;
TH0=T0RELOADH;
TL0=T0RELOADL;
TR0=1;
if(soft_timer_nms0)soft_timer_nms0--;
if(soft_timer_nms1)soft_timer_nms1--;
if(soft_timer_nms2)soft_timer_nms2--;
if (++time_nms==10){
time_nms=0;
if(soft_timer_100ms0)soft_timer_100ms0--;
if(soft_timer_100ms1)soft_timer_100ms1--;
if(soft_timer_100ms2)soft_timer_100ms2--;
if (++time_100ms==10){
time_100ms=0;
if(getkeytime)getkeytime--; //
if(soft_timer_second0)soft_timer_second0--;
if(soft_timer_second1)soft_timer_second1--;
if(soft_timer_second2)soft_timer_second2--;
if (++time_second==60){
time_second=0;
if(soft_timer_minute0)soft_timer_minute0--;
if(soft_timer_minute1)soft_timer_minute1--;
if(soft_timer_minute2)soft_timer_minute2--;
if (++time_minute ==60){
time_minute=0;
if (++time_hour ==24)time_hour=0;
}//minute
}//second
}//200ms
}//20ms
keydowith();
return;
} //timer0 end
#endif
/* ================================================= */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -