📄 key.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 + -