📄 key.c
字号:
// 键,其通码为0xE0 0x14,断码为0xE0 0xF0 0x14。
// 第三类特殊按键有两个,print screen键通码为0xE0 0x12 0xE0 0x7C,断码为0xE0
// 0xF0 0x7C 0xE0 0xF0 0x12; pause键通码为0x E1 0x14 0x77 0xE1 0xF0
// 0x14 0xF0 0x77,断码为空。
// djyos的键盘驱动支持前两类按键,不考虑第三类特殊按键。
//参数: my_event,键盘服务事件类型。
//返回: 无
//----------------------------------------------------------------------------
void key_scan(struct event_script *my_event)
{
static struct key_script key_temp;
uint16_t key_value_now[2]={0,0};
uint16_t key_value_bak[2]={0,0};
uint16_t key_value_temp[2]={0,0};
static ufast_t holding=5;
ufast_t get_key=false;
ufast_t key_num,key_num_bak;
while(1)
{
y_timer_sync(10);
key_num = key_scan_hard(key_value_now);
if((key_value_now[0] != key_value_temp[0])
||(key_value_now[1] != key_value_temp[1])
||(key_num != key_num_bak))
{
holding = 0;
key_num_bak = key_num;
key_value_temp[0] = key_value_now[0];
key_value_temp[1] = key_value_now[1];
}
//状态改变后保持相同状态7次就往下走,超过7次不计.
holding++;
if(holding < 7)
continue;
if(holding > 7)
{
holding = 7;
continue;
}
if(key_num == 0)
{//没有扫描到按键
if(get_key == 0)
continue;
key_temp.time = y_get_time();
key_temp.key_value[1] = cn_break_code;
key_temp.key_value[2] = key_value_bak[0]>>8;
key_temp.key_value[0] = key_value_bak[0];
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
if(get_key == 2)
{//从有2个按键变成无按键,发出第2个断码
key_temp.key_value[2] = key_value_bak[1]>>8;
key_temp.key_value[0] = key_value_bak[1];
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
}
get_key = 0;
continue;
}
key_temp.time = y_get_time();
if(key_num==1)
{//扫描到有1个按键
if(get_key == 0 )
{//从无按键到有按键,发通码
key_temp.key_value[1] = key_value_now[0]>>8;
key_temp.key_value[0] = key_value_now[0];
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
}else if(get_key == 1)
{//持续有按键, 两次按键必不相同,发送备份按键的断码和新按键的通码
key_temp.key_value[2] = key_value_bak[0]>>8;
key_temp.key_value[1] = cn_break_code;
key_temp.key_value[0] = key_value_bak[0];
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
key_temp.key_value[1] = key_value_now[0]>>8;
key_temp.key_value[0] = key_value_now[0];
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
}else if(get_key == 2)
{//原来有两个按键,查看哪个按键弹起,发送断码
if(key_value_bak[0] == key_value_now[0])
{// key_value_bak[1]键弹起
key_temp.key_value[2] = key_value_bak[1]>>8;
key_temp.key_value[0] = key_value_bak[1];
}else
{// key_value_bak[0]键弹起
key_temp.key_value[2] = key_value_bak[0]>>8;
key_temp.key_value[0] = key_value_bak[0];
}
key_temp.key_value[1] = cn_break_code;
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
}
key_value_bak[0] = key_value_now[0];
get_key = 1;
}if(key_num == 2)
{//扫描到有2个按键
if(get_key == 0 )
{//从无按键到有2按键,发2个通码
key_temp.key_value[1] = key_value_now[0]>>8;
key_temp.key_value[0] = key_value_now[0];
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
key_temp.key_value[1] = key_value_now[1]>>8;
key_temp.key_value[0] = key_value_now[1];
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
}else if(get_key == 1)
{//从1个按键到有2个按键,发新按键通码
if(key_value_bak[0] == key_value_now[0])
{//新按键是 key_value_now[1]
key_temp.key_value[1] = key_value_now[1]>>8;
key_temp.key_value[0] = key_value_now[1];
}else
{//新按键是 key_value_now[0]
key_temp.key_value[1] = key_value_now[0]>>8;
key_temp.key_value[0] = key_value_now[0];
}
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
}else if(get_key == 2)
{//原来有两个按键,查看哪个按键不同,分别发送断码和通码
if((key_value_bak[0] != key_value_now[0])
&&(key_value_bak[0] != key_value_now[1]))
{// key_value_bak[0]键弹起
key_temp.key_value[2] = key_value_bak[0]>>8;
key_temp.key_value[0] = key_value_bak[0];
key_temp.key_value[1] = cn_break_code;
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
}
if((key_value_bak[1] != key_value_now[0])
&&(key_value_bak[1] != key_value_now[1]))
{// key_value_bak[1]键弹起
key_temp.key_value[2] = key_value_bak[1]>>8;
key_temp.key_value[0] = key_value_bak[1];
key_temp.key_value[1] = cn_break_code;
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
}
if((key_value_now[0] != key_value_bak[0])
&&(key_value_now[0] != key_value_bak[1]))
{// key_value_now[0]键按下
key_temp.key_value[1] = key_value_now[0]>>8;
key_temp.key_value[0] = key_value_now[0];
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
}
if((key_value_now[1] != key_value_bak[0])
&&(key_value_now[1] != key_value_bak[1]))
{// key_value_now[0]键按下
key_temp.key_value[1] = key_value_now[1]>>8;
key_temp.key_value[0] = key_value_now[1];
dev_write(pg_key_rhdl,(ptu32_t)&key_temp,0,0);
}
}
key_value_bak[0] = key_value_now[0];
key_value_bak[1] = key_value_now[1];
get_key = 2;
}
continue;
}
}
//----读一个按键---------------------------------------------------------------
//功能: 从键盘设备中读取一个按键,若缓冲区无按键可读,就等待timeout毫秒,仍然没
// 有就返回失败
//参数: key,接收读取到的按键的缓冲区
// timeout,无按键可读时等待的毫秒数,cn_timeout_forever=无穷等待。
//返回: true = 有按键,false = 无按键
//-----------------------------------------------------------------------------
bool_t key_read(struct key_script *key,uint32_t timeout)
{
uint32_t len;
len = dev_read(pg_key_lhdl,(ptu32_t)key,0,timeout);
return (len!=0);
}
//----读一个按键(不阻塞)-------------------------------------------------------
//功能: 从键盘设备中读取一个按键,如果缓冲区中没有按键,直接返回false
//参数: key,接收读取到的按键的缓冲区
//返回: true = 有按键,false = 无按键
//-----------------------------------------------------------------------------
bool_t key_read_direct(struct key_script *key)
{
uint32_t len;
len = dev_read(pg_key_lhdl,(ptu32_t)key,0,0);
return (len!=0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -