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

📄 key.c

📁 用51模拟的TFT RGB接口驱动程序(HS,VS,DE,PCLK时序)
💻 C
字号:
/****************************************************************************
* 公司名称:SITRONIX         										        *
* 模块名称:KEY.C			                                			    *
* 模块功能:扫描并处理按键                                       			*
* 创建人员:Jim Yuan															*
* 创建日期:2007-6-8															*
* 修改日期:2007-6-26														*
****************************************************************************/

#include "key.h"


uint8 keybuf[KEYBUF_SIZE];   //按键BUFF
uint8 key_in=0;              //按键输入数据位置
uint8 key_out=0;             //按键输出数据位置

extern idata volatile uint8 bl_ctl;		 //backlight control
extern idata volatile uint8 rom_bank;    //A16_A17_A18
extern idata volatile uint8 rom_cs;      //00:bank0_01:bank1_10:bank2_11:bank3
extern idata volatile uint8 key_scanx;   //ken scan address

idata volatile uint8 keypress_count[KEYID_MAX + 1];
idata volatile uint8 key_value;//取得的键盘值
idata volatile uint8 key_count;

sbit KEYSCAN_PIN=P3^4;

/******************************************************************************
*函数名称:key_init                                                           *
*功能描述:按键初始化                                                         *
*输    入:无                                                                 *
*返    回:无                                                                 *
*创建  人:袁杰                                                               *
*创建日期:2007/4/22                                                           *
*修改日期:                                                                   *
*修 改 者:                                                                   *
*版    本:0                                                                  *
******************************************************************************/
void key_init(void)
{
	uint8 i;
	key_in = 0;
	key_out = 0;
	key_scanx = 0;
	key_value = KEY_NULL;
	for(i = KEYID_MIN;i <= KEYID_MAX;i++)       //按键代码
	{keypress_count[i] = CLR;}                //按键纪录次数清零
}

/******************************************************************************
*函数名称:keybuflen                                                          *
*功能描述:按键可用缓冲的大小                                                 *
*输    入:无                                                                 *
*返    回:按键缓冲大小                                                       *
*创建  人:袁杰                                                               *
*创建日期:2006/9/9                                                           *
*修改日期:                                                                   *
*修 改 者:                                                                   *
*版    本:0                                                                  *
******************************************************************************/
uint8 keybuflen (void)
{
	return (key_in - key_out);  	
}

/******************************************************************************
*函数名称:key_input                                                          *
*功能描述:按键数据输入                                                       *
*输    入:按键数据                                                           *
*返    回:无                                                                 *
*创建  人:袁杰                                                               *
*创建日期:2006/9/9                                                           *
*修改日期:                                                                   *
*修 改 者:                                                                   *
*版    本:0                                                                  *
******************************************************************************/
void key_input(uint8 value)
{
	if(((key_in - key_out)&~(KEYBUF_SIZE - 1)) == 0)
    {
    	keybuf[key_in&(KEYBUF_SIZE - 1)] = value;
    	key_in++;
    }
}

/******************************************************************************
*函数名称:key_output                                                         *
*功能描述:按键数据输出                                                       *
*输    入:按键数据                                                           *
*返    回:无                                                                 *
*创建  人:袁杰                                                               *
*创建日期:2006/9/9                                                           *
*修改日期:                                                                   *
*修 改 者:                                                                   *
*版    本:0                                                                  *
******************************************************************************/
uint8 key_output(void)
{
	if(keybuflen() == 0){return KEY_NULL;}
	return (keybuf[(key_out++)&(KEYBUF_SIZE - 1)]);
}


/******************************************************************************
*函数名称:key_scan                                                           *
*功能描述:按键扫描,把扫描到的键值放入BUF                                    *
*输    入:无                                                                 *
*返    回:无                                                                 *
*创建  人:袁杰                                                               *
*创建日期:2007/4/22                                                          *
*修改日期:                                                                   *
*修 改 者:                                                                   *
*版    本:0                                                                  *
******************************************************************************/
void key_scan(void)
{
	uint8 id;
	for(id = KEYID_MIN;id <= KEYID_MAX;id++)
	{
		KEYSCAN_PIN = SET;                                 //扫描检测PIN置位
		key_scanx = id;                                    //待扫描的按键ID
		XBYTE[0X0000] = (rom_bank & 0x07)|((bl_ctl & 0x01)<<3)|((rom_cs & 0x03)<<4)|((key_scanx & 0x03)<<6);
		if(KEYSCAN_PIN == 0)                               //发现按键
		{
			keypress_count[id]++;                          //按键有效计数
			if(keypress_count[id] >= KEYPRESS_COUNT_MAX)   //达到最大计数值
				{keypress_count[id] = KEYPRESS_COUNT_MAX;}
			os_wait(K_TMO, KEYSCAN_DELAY, 0);
		}
		else
		{
			if(keypress_count[id] >= KEYPRESS_SHORT_NUM)   //短按键
			{
				if(keypress_count[id] >= KEYPRESS_LONG_NUM)//长按键
					{key_input(id|KEYPRESS_LONG_SET);}
				else
					{key_input(id);}
				key_count = keypress_count[id];
			} 				 
			keypress_count[id] = CLR;
		}                                                  //继续扫描下一个按键
	}		
}

volatile uint8 key_read(void)
{
	uint8 tmp;
	tmp = key_value;
	key_value = KEY_NULL;
	return tmp; 
}

volatile uint8 key_test(void)
{
	return key_count;
}

/******************************************************************************
*函数名称:keyin_task                                                         *
*功能描述:键盘输入任务                                                       *
*输    入:无                                                                 *
*返    回:无                                                                 *
*创建  人:袁杰                                                               *
*创建日期:2007/4/22                                                          *
*修改日期:                                                                   *
*修 改 者:                                                                   *
*版    本:0                                                                  *
******************************************************************************/
void keyin_task(void)
{
	key_scan();
}

//#define VK_LEFT           0x25
//#define VK_UP             0x26
//#define VK_RIGHT          0x27
//#define VK_DOWN           0x28
//#define VK_PAUSE          0x03
//#define VK_OFF			0xF0
//#define KEY_NULL          0xFF
//scan0 ------- sw2 ------- b/l
//scan1 ------- sw3 ------- pause
//scan2 ------- sw4 ------- on/off(f1)
//scan3 ------- sw5 ------- f2

/******************************************************************************
*函数名称:keyout_task                                                        *
*功能描述:KEY输出任务,等待读取超时,就放弃该次键值,输出BUF中下一个         *
*输    入:无                                                                 *
*返    回:无                                                                 *
*创建  人:袁杰                                                               *
*创建日期:2007/4/22                                                          *
*修改日期:                                                                   *
*修 改 者:                                                                   *
*版    本:0                                                                  *
******************************************************************************/
void keyout_task(void)
{
	uint8 wait;	
	if (key_value == KEY_NULL){key_value = key_output();}
	if (key_value != KEY_NULL)
	{
		wait = KEYREAD_TIMEOUT;
		while (wait--)               //等待按键读取
		{
			if (key_value == KEY_NULL)break;
			os_wait(K_TMO, 1, 0);	
		}
		key_value = key_read();      //内部读取,清空按键
	}
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -