⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.c

📁 通用OSD控制(51单片机控制的TFTLCD源码,MTV018)
💻 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 + -