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

📄 key.c

📁 新一代基于事件的嵌入式操作系统dyos在三星的s3c44b0的arm芯片上的完整移植代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//              键,其通码为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 + -