📄 key.c
字号:
#pragma REGISTERBANK(0)
#include "Header.H"
bit key_on = 0;
unsigned char key_last;
//static struct timer_list timer;
#define DEBOUNCE_MS 50L
#define REPEAT_HZ 5
#define DEFINE_KEY(key, pin) \
sbit PIN_KEY_##key = pin; \
static bit pin_##key##_i; \
static bit pin_##key;
static unsigned char key_count = 0;
#define CHK_KEY(key) \
do { \
if (PIN_KEY_##key != 0) { \
count_##key = DEBOUNCE_MS*HZ/1000; \
} else if (count_##key && --count_##key == 0) { \
count_##key = rephz_##key ? HZ/rephz_##key : 0; \
if (!key_on) { \
key_last = KEY_##key; \
key_on = 1; \
} \
} \
} while (0)
DEFINE_KEY(UP, P1 ^ 2)
DEFINE_KEY(MENU, P3 ^ 7)
DEFINE_KEY(DEC, P1 ^ 1)
DEFINE_KEY(INC, P1 ^ 0)
DEFINE_KEY(DOWN, P1 ^ 3)
void check_key(void)
{
if (pin_DOWN_i != PIN_KEY_DOWN) {
pin_DOWN_i = PIN_KEY_DOWN;
key_count = DEBOUNCE_MS*HZ/1000;
return;
}
if (pin_MENU_i != PIN_KEY_MENU) {
pin_MENU_i = PIN_KEY_MENU;
key_count = DEBOUNCE_MS*HZ/1000;
return;
}
if (pin_DEC_i != PIN_KEY_DEC) {
pin_DEC_i = PIN_KEY_DEC;
key_count = DEBOUNCE_MS*HZ/1000;
return;
}
if (pin_INC_i != PIN_KEY_INC) {
pin_INC_i = PIN_KEY_INC;
key_count = DEBOUNCE_MS*HZ/1000;
return;
}
if (pin_UP_i != PIN_KEY_UP) {
pin_UP_i = PIN_KEY_UP;
key_count = DEBOUNCE_MS*HZ/1000;
return;
}
if (key_count && --key_count == 0) {
#if 0
if (pin_POWER != pin_POWER_i) {
pin_POWER = pin_POWER_i;
if (PIN_POWER && !pin_POWER)
key_count = 2000L*HZ/1000;
else {
key_count = 0;
if (!key_on) {
if (!pin_POWER)
key_last = KEY_POWER;
else
key_last = KEY_VIDEO;
key_on = 1;
}
}
return;
}
#endif
if (!pin_DEC_i || !pin_INC_i)
key_count = HZ/REPEAT_HZ;
else
key_count = 0;
if (key_on)
return;
if (!pin_DOWN) {
key_last = KEY_DOWN;
goto key_on_ret;
}
if (!pin_MENU_i) {
key_last = KEY_MENU;
goto key_on_ret;
}
if (!pin_DEC_i) {
key_last = KEY_DEC;
goto key_on_ret;
}
if (!pin_INC_i) {
key_last = KEY_INC;
goto key_on_ret;
}
if (!PIN_KEY_UP) {
key_last = KEY_UP;
key_on = 1;
return;
}
// CHK_KEY(POWER);
// CHK_KEY(MENU);
// CHK_KEY(INC);
// CHK_KEY(DEC);
return;
}
key_on_ret:
key_on = 1;
return;
}
bit int0bh_pending = 0;
unsigned char th1_val = 0, th1_old = 0;
unsigned char c_last = 0;
unsigned char c_bits = 8;
unsigned char c_index = 0;
unsigned char c_code;
bit c_error = 0;
#define T_100US (F_OSC1/12/10000)//100uS. 12M
//#define T_100US (F_OSC/12/8000)//100uS. 9.6M
#define T_ZERO_MIN (T_100US*10)//遥控码低电平最小宽度
#define T_ZERO_MAX (T_100US*18)//遥控码低电平最大宽度
#define T_ONE_MIN (T_100US*20)//遥控码高电平最小宽度
#define T_ONE_MAX (T_100US*28)//遥控码高电平最大宽度
#define T_REP_MIN (T_100US*110)//遥控码重复码最小宽度
#define T_REP_MAX (T_100US*120)//遥控码重复码最大宽度
#define T_START_MIN (T_100US*130)//遥控启始码最小宽度
#define T_START_MAX (T_100US*150)//遥控启始码最大宽度
#define TH_ZERO_MIN (T_ZERO_MIN>>8)
#define TH_ZERO_MAX (T_ZERO_MAX>>8)
#define TH_ONE_MIN (T_ONE_MIN>>8)
#define TH_ONE_MAX (T_ONE_MAX>>8)
#define TH_REP_MIN (T_REP_MIN>>8)
#define TH_REP_MAX (T_REP_MAX>>8)
#define TH_START_MIN (T_START_MIN>>8)
#define TH_START_MAX (T_START_MAX>>8)
#define CODE1 0x83//遥控代码
#define CODE2 0x7c//遥控反代码
#define INIT_T0 (65536L - (F_OSC/12)/HZ)
#define INIT_TH0 (INIT_T0 >> 8)
void int0_bh(void)
{
unsigned char temp = th1_val;
th1_val -= th1_old;
if (temp < th1_old)
th1_val -= INIT_TH0;
th1_old = temp;
// if (th1_val > TH_START_MAX)
// goto err_out;
if (th1_val >= TH_START_MIN)
goto reset_out;
// if (th1_val > TH_REP_MAX)
// goto err_out;
if (th1_val >= TH_REP_MIN) {
if (key_last == KEY_INC || key_last == KEY_DEC)
key_on = 1;
goto reset_out;
}
if (c_error)
return;
// if (th1_val > TH_ONE_MAX)
// goto err_out;
if (th1_val >= TH_ONE_MIN) {
c_last = (c_last >> 1) | 0x80;
goto bit_rcv;
}
// if (th1_val > TH_ZERO_MAX)
// goto err_out;
if (th1_val >= TH_ZERO_MIN) {
c_last >>= 1;
goto bit_rcv;
}
goto err_out;
bit_rcv:
if (--c_bits)
return;
switch (c_index++) {
case 0:
if (c_last != CODE1)//if(c_last ==CODE1)goto out;
goto err_out; //else goto out;
goto out;
case 1:
if (c_last != CODE2)
goto err_out;
goto out;
case 2:
c_code = c_last;
goto out;
case 3:
if (c_last != ~c_code)
goto err_out;
break;
}
if (key_on) {
goto reset_out;
}
switch (c_code) {
// case 0x03:
// key_last = KEY_POWER;
// break;
case 0x07:
key_last = KEY_MENU;
break;
case 0x0e:
key_last = KEY_INC;
break;
case 0x0c:
key_last = KEY_DEC;
break;
case 0x09:
key_last = KEY_UP;
break;
case 0x11:
key_last = KEY_DOWN;
break;
// case 0x17:
// key_last = KEY_VIDEO;
// break;
default:
key_last = KEY_INVALID;
goto reset_out;
}
key_on = 1;
goto reset_out;
err_out:
c_error = 1;
goto out;
reset_out:
c_error = 0;
c_index = 0;
goto out;
out:
c_last = 0;
c_bits = 8;
}
void key_init(void)
{
pin_DOWN = pin_DOWN_i = PIN_KEY_DOWN;
pin_MENU = pin_MENU_i = PIN_KEY_MENU;
pin_DEC = pin_DEC_i = PIN_KEY_DEC;
pin_INC = pin_INC_i = PIN_KEY_INC;
pin_UP = pin_UP_i = PIN_KEY_UP;
IT0 = 1;
EX0 = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -