单组合键改成一个键工具组合键。

  雷柏V500S是爆款机械雷柏V500的升级版,V500S除了在硬件配置方面全面升级,程序功能也有诸多提升改进。本文将对雷柏V500S的驱动和宏定义编程功能做出详细介绍。V500S驱动及安装下载:  雷柏V500S机械游戏键盘的驱动安装程序,可以在雷柏官网的下载中心页面下载:/DownloadCenter.aspx  雷柏官网下载中心安装:  双击下载好的驱动安装程序,即可进入安装界面,在安装过程中用户可以跟许自己的需求选择驱动语言以及驱动安装位置。驱动程序安装完成后,需重启一次电脑以保证驱动程序能够完全安装,重启过后只需点击桌面上的快捷方式即可启动V500S驱动。  双击安装程序  选择安装语言  安装完成,重启电脑即可使用V500S的驱动来进行键盘设置了。V500S驱动使用  V500S驱动的主界面简洁明了,左上角有&键盘设置&、&&宏管理器&两个选项,点击图标即可进入相应界面。键盘的右下角有&恢复默认&和&应用&两个按钮,用户无论进行任何设置更改,都需要点击&&应用&按钮,设置才会生效。  V500S驱动主界面按键设置:  雷柏V500S采用87键两区键盘布局,具有92个按键。除Win锁键、M模式键外的90个按键均可以进行自定义编程。  鼠标点击任意可编程按键便会弹出一个按键设置面板来对此按键进行功能设置,按键功能面板具有&单键/组合键&&宏定义&&基本功能&&高级功能&4个选项,面板左上角显示按键当前功能。  按键功能设计页面  在&单键/组合键&页面,我们可以将按键设置为任意其他单个按键,或者是任意Ctrl、Alt、Shift、Win开头的组合键,如图所示我们在勾选Ctrl选项后输入C键,即将Ctrl+C的组合键设置在了R键上。  单键/组合键设置页面  在&基本功能&页面,我们可以将按键设置为列表中任意功能,V500S的驱动除了包含了&关闭窗口&、&锁定电脑&、&查找&等功能,还可以选择&左键点击&、&右键点击&等鼠标按键功能。  基本功能设置页面  &高级功能&页面包含&播放声音&、&启动程序&、&打开文件&、&打开目录&4项功能,这些功能可以帮助用户一键打开电脑中的某个程序或文件。  以&启动程序&功能为例,勾选&启动程序&选项,点击右侧的&浏览&选项。  选中电脑中的V500S驱动程序,点击&打开&。  点击确定并应用设置,即可通过点击R键来启动V500S驱动程序。  勾选&按键设定面板&左下角的&禁用按键&选项,按键就会被禁用、失去任何功能。  通过驱动界面右上角的&上传率设置&选项,可以设置V500S的上传率。雷柏V500S支持125/500/1000Hz三档USB回报率设置,最大响应速度1毫秒,上传率选择数值越高,响应速度越快。  点击&上传率设置&选项,打开上传率设置页面  根据自己的需求选择合适数值,确定并应用即可改变V500S的上传率  V500S具有五组配置文件,每组文件可保存不同的按键设置以对应不同的应用情景。  在配置文件下方还有一个关联文件选项,这个选项可以帮助用户将配置文件与应用程序关联,当用户运行指定应用程序时,V500S会自动切换到相应的配置文件。  在&配置文件2&页面下,勾选关联程序选项  选中电脑中的启动程序,点击打开。  点击应用按钮,即可将配置文件与QQ关联,只要启动QQ,V500S会自动将按键设置切换到&配置文件2&。宏管理器:  宏,又被称为宏命令,即通过特殊的自定义编写,将一系列动作简便化;即一种批处理的程序。键盘的宏命令设置,是一款键盘处理能力和自定义性能综合体现。用户可以在该界面中根据个人使用需求来设置一系列宏命令,将众多繁琐的命令操作,一键输出,实现简化游戏操作的目的。  点击主界面左上角的&宏管理器&选项,即可进入宏定义主界面。  宏定义主界面  我们以游戏&&为例,设置一个宏命令。首先,点击&宏列表&框下方的&加号&,新建一个宏。  双击&新建宏&,可以对宏进行重命名,我们将名字改为我们要设置的技能名&八神八稚女&。  接下来我们进行宏命令的录制,点击界面右侧的&开始录制&,依次输&下&&左&&下&&右&&A&,点击&停止录制&,即完成了此条宏命令设置。  在录制完成后,可以通过&时间列表&下方的选项来增删和修改已经录制好的宏事件。  在前面的图中,单个按键指令之间,有一个间隔时间,如第一行显示的&125ms&。如果需要设置的宏命令不需要考虑各个按键指令(事件)之间的时间间隔。可以在录制前,勾选右侧的&忽略事件之间的延迟&选项,此时录制的事件列表样式,如下图。  此外,在页面右侧还可以选择宏命令的循环方式。&循环次数&选项可以设置按下一次按键后宏命令自动执行指定次数;&切换开关连续播放&选项为按一次按键宏命令不停循环播放,再按一次按键则停止播放;&按下时播放&选项为按下按键时宏命令不停循环播放,抬起按键后则停止播放。玩家可以根据自己的需求选择模式。  而且V500S的宏定义功能还新添增了鼠标按键录制,通过右下角的虚拟鼠标,即可将鼠标操作录制到宏命令当中。  将右键左键命令录制下来,即可一键完成射击游戏中的&瞬狙&。  在设置好宏之后,回到键盘设置界面,点开任何一个按键的设置菜单,在&宏定义&选项中选择已经设置好的宏,点击&确定&并应用之后,即可一键完成宏命令。  确定并应用后,即可在游戏中通过R键,一键释放此技能了。
提示:支持键盘“← →”键翻页
产品定位 连接方式
投诉欺诈商家:
天津重庆哈尔滨沈阳长春石家庄呼和浩特西安太原兰州乌鲁木齐成都昆明贵阳长沙武汉郑州济南青岛烟台合肥南京杭州东莞南宁南昌福州厦门深圳温州佛山宁波泉州惠州银川
本城市下暂无经销商求问按键精灵如何单键 代替组合键?_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
求问按键精灵如何单键 代替组合键?
1、例如 按 A
代替 CTRL+C
并且输入文字的时候,A 回到正常状态
为您推荐:
其他类似问题
按键精灵的相关知识
换一换
回答问题,赢新手礼包君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
世界上最全的键盘码表:单键扫描码,ascii,组合键码扫描码,ascii
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口查看: 8166|回复: 39
写了一个独立按键 支持组合键、单键长按,连发功能的例子
本帖最后由 foxpro2005 于
21:53 编辑
学习了马老师的《AVR单片机嵌入式系统原理与应用实践书》 第2版,现也写了一个按键扫描的例子(用WINAVR写的)。
独立按键,支持组合键,单键长按,连发功能等应用,已通过实践测试。
KeyScan.h 部分
/********************************************************************************************************
* FileName....:& & & & KeyScan.h
* MCU.........:& & & & ATmega8 at 8MHz
* Compiler....:& & & & WinAVR-
* Author......:& & & & foxpro2005
* Ver.........:& & & & V1.0
* Time........:& & & &
* Description.:& & & & Key scan.
* History.....:& & & &
******************************************************************************************************/
#ifndef _KeyScan_H_
#define _KeyScan_H_
//------------------------------------------------------------------------------------------------------
#include &avr/io.h&& & & & & & & & & & & & & & & &
//-------------------------------------------------------------------------------------------------------
/*****************************硬件I/O引脚定义,根据实际应用修改******************************/
#define KEY_PORT& & & & PIND& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 独立按键所占用端口.
#define K_STOP& & & & & & & & (1&&PD3)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // &停止&键
#define K_START& & & & (1&&PD4)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // &启动&键
#define K_SEL& & & & & & & & (1&&PD5)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // &选择&键
#define K_ADD& & & & & & & & (1&&PD6)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // &+ &键
#define K_DEC& & & & & & & & (1&&PD7)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // &- &键
#define OneKeyTime& & & & 300& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 单键长按时长 = OneKeyTime * 10ms
#define MuxKeyTime& & & & 500& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 组合键长按时长 = MuxKeyTime * 10ms
#define RepeatTime& & & & 5& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 单键连发功能重复间隔时间 = RepeatTime * 10ms
#define Key_Mask& & & & (K_STOP|K_START|K_SEL|K_ADD|K_DEC)& & & & & & & && && && &// 按键掩码值
//-------------------------------------------------------------------------------------------------------
#define GetKey()& & & & (KEY_PORT & Key_Mask)& & & & & & & & & & & & & & & & & & & && && && &// 读取按键端口值
#define key_state_0& & & & 0& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 初始态.
#define key_state_1& & & & 1& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 确认态.
#define key_state_2& & & & 2& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 组合键,长按键确认态.
#define key_state_3& & & & 3& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 长按连发功能确认态.
#define key_state_4& & & & 4& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 等待释放态.
//-------------------------------------------------------------------------------------------------------
/****************************************数据类型定义**************************************/
typedef enum {NO_KEY,STOP,START,SEL,ADD,DEC,SETUP} eKEY;& & & & // 按键返回值类型定义.
//-------------------------------------------------------------------------------------------------------
/*****************************************函数声明****************************************/
eKEY ReadKey(void);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //读取按键.& & & & & & & & & & & & & & & & & & & &
//-------------------------------------------------------------------------------------------------------
KeyScan.c 部分
/********************************************************************************************************
* FileName....:& & & & KeyScan.c
* MCU.........:& & & & ATmega8 at 8MHz
* Compiler....:& & & & WinAVR-
* Author......:& & & & foxpro2005
* Ver.........:& & & & V1.0
* Time........:& & & &
* Description.:& & & & Key scan.
* History.....:& & & &
******************************************************************************************************/
//------------------------------------------------------------------------------------------------------
#include &KeyScan.h&
//------------------------------------------------------------------------------------------------------
/***********************************全局变量定义区******************************************/
/********************************************************************************************
* eKEY ReadKey(void);
* 功能: 独立按键扫描,10ms扫描一次.
* 返回值:枚举类型,{NO_KEY,STOP,START,SEL,ADD,DEC,SETUP}.
********************************************************************************************/
eKEY ReadKey(void)
& & & & static unsigned int key_time = 0;& & & & & & & & & & & & & & & & & & & & & & & && && && &// 长按键计时
& & & & static unsigned char key_state = 0;& & & & & & & & & & & & & & & & & & & & & & & & // 记录按键扫当前描状态
& & & & static unsigned char key_press_old = 0;& & & & & & & & & & & & & & & & & & & & // 记录上一次按键状态
& & & & static eKEY key_value_old = NO_KEY;& & & & & & & & & & & & & & & & & & & & & & & & // 保存上一次按键返回值
& & & & eKEY key_return = NO_KEY;& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 按键功能返回值
& & & & unsigned char key_
& & & & key_press = GetKey() ^ Key_M& & & & & & & & & & & & & & & & & & & & & & & & // 读按键I/O电平,只保留被按下的键(被按下的键位为1)
& & & & switch (key_state)
& & & & & & & & case key_state_0:& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 1.按键初始态
& & & & & & & & & & & & if (key_press)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & key_state = key_state_1;& & & & & & & & & & & & & & & & & & & & // 键被按下,状态转换到按键确认态
& & & & & & & & & & & & & & & & key_press_old = key_& & & & & & & & & & & & & & & & // 保存当前按键状态
& & & & & & & & & & & & }
& & & & & & & & & & & &
& & & & & & & & case key_state_1:& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 2.按键确认态
& & & & & & & & & & & & if (key_press == key_press_old)& & & & & & & & & & & & & & & & & & & & // 与初始态的按键状态相同?
& && && && && && && && &{
& & & & & & & & & & & & & & & & key_time = 0;& & & & & & & & & & & & & & & & & & & & & & & & & & & & // 清另按键时间计数器
& & & & & & & & & & & & & & & & switch(key_press)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & case K_STOP:
& & & & & & & & & & & & & & & & & & & & & & & & key_state&&= key_state_4; & & & & & & & & & & & & // 转按键释放态
& & & & & & & & & & & & & & & & & & & & & & & & key_return = STOP;& & & & & & & & & & & & & & & & // &停止&键
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & case K_START:
& & & & & & & & & & & & & & & & & & & & & & & & key_state&&= key_state_4; & & & & & & & & & & & & // 转按键释放态
& & & & & & & & & & & & & & & & & & & & & & & & key_return = START;& & & & & & & & & & & & & & & & // &起动&键& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & && & & &
& & & & & & & & & & & & & & & & & & & & case K_SEL:
& & & & & & & & & & & & & & & & & & & & & & & & key_state&&= key_state_2; & & & & & & & & & & & & // 转长按键态
& & & & & & & & & & & & & & & & & & & & & & & & key_return = SEL;& & & & & & & & & & & & & & & & // &选择&键& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & && & & &
& & & & & & & & & & & & & & & & & & & & case K_ADD:
& & & & & & & & & & & & & & & & & & & & & & & & key_state&&= key_state_2; & & & & & & & & & & & & // 转长按键态
& & & & & & & & & & & & & & & & & & & & & & & & key_return = ADD;& & & & & & & & & & & & & & & & // &+&键
& & & & & & & & & & & & & & & & & & & & & & & && & & &
& & & & & & & & & & & & & & & & & & & & case K_DEC:
& & & & & & & & & & & & & & & & & & & & & & & & key_state&&= key_state_2; & & & & & & & & & & & & // 转长按键态
& & & & & & & & & & & & & & & & & & & & & & & & key_return = DEC;& & & & & & & & & & & & & & & & // &-&键
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & case K_STOP|K_SEL:& & & & & & & & & & & & & & & & & & & & // &组合&键,长按键
& & & & & & & & & & & & & & & & & & & & & & & & key_state&&= key_state_2; & & & & & & & & & & & & // 组合键按键仍按下,状态转换到计时1
& & & & & & & & & & & & & & & & & & & & & & & && & & &
& & & & & & & & & & & & & & & & & & & & default:
& & & & & & & & & & & & & & & & & & & & & & & & key_state&&= key_state_4; & & & & & & & & & & & & // 转按键释放态
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & }
& && && && && && && && &}
& & & & & & & & & & & & else if (!key_press)
& & & & & & & & & & & && &&&key_state = key_state_0;& & & & & & & & & & & & & & & & & & & & // 按键已抬起(是干扰),转换到按键初始态
& & & & & & & & & & & & else
& & & & & & & & & & & & & & & & key_state = key_state_4;& & & & & & & & & & & & & & & & & & & & // 按键已发生变化,转到按键释放态
& & & & & & & & & & & & & & & &
& & & & & & & & & & & & key_value_old = key_& & & & & & & & & & & & & & & & & & & & // 保存按键返回值
& & & & & & & & & & & &
& & & & & & & & case key_state_2:& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 3.长按键确认态
& & & & & & & & & & & & if (key_press == key_press_old)
& && && && && && && && &{
& & & & & & & & & & & & & & & & ++key_& & & & & & & & & & & & & & & & & & & & & & & & & & & & // 按键计时
& & & & & & & & & & & & & & & & if (key_press == (K_STOP|K_SEL))& & & & & & & & & & & & // &配置&键?
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & if(key_time &= MuxKeyTime)& & & & & & & & & & & & // 组合键长按计时
& & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & key_state = key_state_4;& & & & & & & & & & & & // 按下时间&=MuxKeyTime,转到按键释放状态
& & & & & & & & & & & & & & & & & & & & & & & & key_return = SETUP;& & & & & & & & & & & & & & & & // 组合键功能,&配置&键
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & else
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & if(key_time &= OneKeyTime)& & & & & & & & & & & & // 单键长按计时
& & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & key_state = key_state_3;& & & & & & & & & & & & // 按下时间&=OneKeyTime,转到连发功能态,用于触发连发功能
& & & & & & & & & & & & & & & & & & & & & & & & key_time = 0;& & & & & & & & & & & & & & & & & & & & // 清按键计数器
& & & & & & & & & & & & & & & & & & & & & & & & key_return = key_value_& & & & & & & & // 返回上一次按键值
& & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & }
& & & & & & & & & & & & else
& & & & & & & & & & & & & & & & key_state = key_state_4;& & & & & & & & & & & & & & & & & & & & // 按键已发生变化,转到按键释放态
& & & & & & & & & & & &
& & & & & & & & case key_state_3:& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 4.按键连发功能
& & & & & & & & & & & & if (key_press == key_press_old)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & if (++key_time &= RepeatTime)& & & & & & & & & & & & & & & & // 按键时间计数
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & key_time = 0;& & & & & & & & & & & & & & & & & & & & & & & & // 按下时间&=0.05s,清0按键计数器
& & & & & & & & & & & & & & & & & & & & key_return = key_value_& & & & & & & & & & & & // 返回上一次按键值
& & & & & & & & & & & & & & & & }& & & & & & & & & & & & & & & &
& & & & & & & & & & & & }
& & & & & & & & & & & & else
& & & & & & & & & & & && &&&key_state = key_state_4; & & & & & & & & & & & & & & & & & & & & // 按键已发生变化,转到按键释放态
& & & & & & & & & & & &
& & & & & & & & case key_state_4:& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 5.等待所有按键释放开
& & & & & & & & & & & & //if (!key_press)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & // 等待所有按键释放,才进入一次新的按键确认过程
& & & & & & & & & & & & if (key_press != key_press_old)& & & & & & & & & & & & & & & & & & & & // 按键发生变化,就进入一次新的确认过程
& & & & & & & & & & & && &&&key_state = key_state_0; & & & & & & & & & & & & & & & & & & & & // 按键已释放,转换到初始态.
& & & & & & & & & & & && & & & & & & & & & & &
& & & & }& & & &
& & return key_
你好,我在调试你贴上的程序,发现单个按键都正常,为什么组合键就不正常呢?代码如下:
#include &iom16v.h&
#define K_STOP& && && && && & (1&&PA0)& && && && && && && && && && && && && && && && && && && && && & // &停止&键
#define K_START& && && && && &(1&&PA1)& && && && && && && && && && && && && && && && && && && && && & // &启动&键
#define K_SEL& && && && && &&&(1&&PA2)& && && && && && && && && && && && && && && && && && && && && & // &选择&键
#define K_ADD& && && && && &&&(1&&PA3)& && && && && && && && && && && && && && && && && && && && && & // &+ &键
#define K_DEC& && && && && &&&(1&&PA4)& && && && && && && && && && && && && && && && && && && && && & // &- &键
#define OneKeyTime& && &&&300& && && && && && && && && && && && && && && && && && && && && && && && & // 单键长按时长 = OneKeyTime * 10ms
#define MuxKeyTime& && &&&500& && && && && && && && && && && && && && && && && && && && && && && && & // 组合键长按时长 = MuxKeyTime * 10ms
#define RepeatTime& && &&&5& && && && && && && && && && && && && && && && && && && && && && && && && &// 单键连发功能重复间隔时间 = RepeatTime * 10ms
#define Key_Mask& && &&&(K_STOP|K_START|K_SEL|K_ADD|K_DEC)& && && && && && && && &// 按键掩码值
#define KEY_PORT& && && && &&&PORTA& && && && && && && && && && && && && && && && && && && && && && &&&// 独立按键所占用端口.
#define KEY_DDR& & & & & & & & & & & & & & & && &DDRA
#define KEY_PIN& & & & & & & & & & & & & & & && &PINA
//-------------------------------------------------------------------------------------------------------
#define GetKey()& && &&&(KEY_PIN & Key_Mask)& && && && && && && && && && && && && && && && &// 读取按键端口值
#define key_state_0& && &&&0& && && && && && && && && && && && && && && && && && && && && && && && && && &&&// 初始态.
#define key_state_1& && &&&1& && && && && && && && && && && && && && && && && && && && && && && && && && &&&// 确认态.
#define key_state_2& && &&&2& && && && && && && && && && && && && && && && && && && && && && && && && && &&&// 组合键,长按键确认态.
#define key_state_3& && &&&3& && && && && && && && && && && && && && && && && && && && && && && && && && &&&// 长按连发功能确认态.
#define key_state_4& && &&&4& && && && && && && && && && && && && && && && && && && && && && && && && && &&&// 等待释放态.
//-------------------------------------------------------------------------------------------------------
/****************************************数据类型定义**************************************/
typedef enum {NO_KEY,STOP,START,SEL,ADD,DEC,SETUP} eKEY;& && &&&// 按键返回值类型定义.
//-------------------------------------------------------------------------------------------------------
/*****************************************函数声明****************************************/
eKEY ReadKey(void);& && && && && && && && && && && && && && && && && && && && && && && && && && && && && & //读取按键.& && && && && && && && && && && && && &
//-------------------------------------------------------------------------------------------------------
unsigned char time_counter,key_stime_& & & & & & & & // 时间计数单元
unsigned char point_on, time_1s_ok,key_stime_
/********************************************************************************************
* eKEY ReadKey(void);
* 功能: 独立按键扫描,10ms扫描一次.
* 返回值:枚举类型,{NO_KEY,STOP,START,SEL,ADD,DEC,SETUP}.
********************************************************************************************/
eKEY ReadKey(void)
& && &&&static unsigned int key_time = 0;& && && && && && && && && && && && && && && && && && &&&// 长按键计时
& && &&&static unsigned char key_state = 0;& && && && && && && && && && && && && && && && &// 记录按键扫当前描状态
& && &&&static unsigned char key_press_old = 0;& && && && && && && && && && && && && & // 记录上一次按键状态
& && &&&static eKEY key_value_old = NO_KEY;& && && && && && && && && && && && && && && && &// 保存上一次按键返回值
& && &&&eKEY key_return = NO_KEY;& && && && && && && && && && && && && && && && && && && && && & // 按键功能返回值
& && &&&unsigned char key_
& && &&&key_press = GetKey() ^ Key_M& && && && && && && && && && && && && && && && &// 读按键I/O电平,只保留被按下的键(被按下的键位为1)
& & & & & & & &
& & & & & & & & switch (key_state)
& && && && && & case key_state_0:& && && && && && && && && && && && && && && && && && && && && & // 1.按键初始态
& && && && && && && && &if (key_press)
& && && && && && && && &{
& && && && && && && && && && &&&key_state = key_state_1;& && && && && && && && && && && && && & // 键被按下,状态转换到按键确认态
& && && && && && && && && && &&&key_press_old = key_& && && && && && && && && && && && &&&// 保存当前按键状态
& && && && && && && && &}
& & & & & & & & & & & & & & & & & & & & & & & &
& && && && && && && && &
& && && && && & case key_state_1:& & & & & & & & & & & && && & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && && & & && &&&// 2.按键确认态
& && && && && && && && &if (key_press == key_press_old)& && && && && && && && && && && && && &&&// 与初始态的按键状态相同?
& && && && && && && && &{
& && && && && && && && && && &&&key_time = 0;& && && && && && && && && && && && && && && && && && &&&// 清另按键时间计数器
& && && && && && && && && && &&&switch(key_press)
& && && && && && && && && && &&&{
& && && && && && && && && && && && && & case K_STOP:
& && && && && && && && && && && && && && && && &key_state&&= key_state_4;& && && && && && && && & // 转按键释放态
& && && && && && && && && && && && && && && && &key_return = STOP;& &&&
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && && && && && && && && && & // &停止&键
& && && && && && && && && && && && && && && && &
& && && && && && && && && && && && && & case K_START:
& && && && && && && && && && && && && && && && &key_state&&= key_state_4;& && && && && && && && & // 转按键释放态
& && && && && && && && && && && && && && && && &key_return = START;& && && && && && && && && && &&&// &起动&键& && && && && && && && && && && && && && && && &
& && && && && && && && && && && && && && && && && && &&&
& && && && && && && && && && && && && & case K_SEL:
& && && && && && && && && && && && && && && && &key_state&&= key_state_2;& && && && && && && && & // 转长按键态
& && && && && && && && && && && && && && && && &key_return = SEL;& && && && && && && && && && &&&// &选择&键& && && && && && && && && && && && && && && && && && && && && &
& && && && && && && && && && && && && && && && && && &&&
& && && && && && && && && && && && && & case K_ADD:
& && && && && && && && && && && && && && && && &key_state&&= key_state_2;& && && && && && && && & // 转长按键态
& && && && && && && && && && && && && && && && &key_return = ADD;& && && && && && && && && && &&&// &+&键
& && && && && && && && && && && && && && && && && && &&&
& && && && && && && && && && && && && & case K_DEC:
& && && && && && && && && && && && && && && && &key_state&&= key_state_2;& && && && && && && && & // 转长按键态
& && && && && && && && && && && && && && && && &key_return = DEC;& && && && && && && && && && &&&// &-&键
& && && && && && && && && && && && && && && && &
& && && && && && && && && && && && && & case K_STOP|K_SEL:& && && && && && && && && && && && && & // &组合&键,长按键
& && && && && && && && && && && && && && && && &key_state&&= key_state_2;& && && && && && && && & // 组合键按键仍按下,状态转换到计时1
& && && && && && && && && && && && && && && && && && &&&
& && && && && && && && && && && && && & default:
& && && && && && && && && && && && && && && && &key_state&&= key_state_4;& && && && && && && && & // 转按键释放态
& && && && && && && && && && && && && && && && &
& && && && && && && && && && &&&}
& && && && && && && && &}
& && && && && && && && &else if (!key_press)
& && && && && && && && && & key_state = key_state_0;& && && && && && && && && && && && && & // 按键已抬起(是干扰),转换到按键初始态
& && && && && && && && &else
& && && && && && && && && && &&&key_state = key_state_4;& && && && && && && && && && && && && & // 按键已发生变化,转到按键释放态
& && && && && && && && && && &&&
& && && && && && && && &key_value_old = key_& && && && && && && && && && && && && & // 保存按键返回值
& & & & & & & & & & & & & & & & & & & & & & & &
& && && && && && && && &
& && && && && & case key_state_2:& && && && && && && && && && && && && && && && && && && && && & // 3.长按键确认态
& && && && && && && && &if (key_press == key_press_old)
& && && && && && && && &{
& && && && && && && && && && &&&++key_& && && && && && && && && && && && && && && && && && &&&// 按键计时
& && && && && && && && && && &&&if (key_press == (K_STOP|K_SEL))& && && && && && && && &// &配置&键?
& && && && && && && && && && &&&{
& && && && && && && && && && && && && & if(key_time &= MuxKeyTime)& && && && && && && && &// 组合键长按计时
& && && && && && && && && && && && && & {
& && && && && && && && && && && && && && && && &key_state = key_state_4;& && && && && && && && &// 按下时间&=MuxKeyTime,转到按键释放状态
& && && && && && && && && && && && && && && && &key_return = SETUP;& && && && && && && && && && &&&// 组合键功能,&配置&键
& && && && && && && && && && && && && & }
& && && && && && && && && && &&&}
& && && && && && && && && && &&&else
& && && && && && && && && && &&&{
& && && && && && && && && && && && && & if(key_time &= OneKeyTime)& && && && && && && && &// 单键长按计时
& && && && && && && && && && && && && & {
& && && && && && && && && && && && && && && && &key_state = key_state_3;& && && && && && && && &// 按下时间&=OneKeyTime,转到连发功能态,用于触发连发功能
& && && && && && && && && && && && && && && && &key_time = 0;& && && && && && && && && && && && && & // 清按键计数器
& && && && && && && && && && && && && && && && &key_return = key_value_& && && && && & // 返回上一次按键值
& && && && && && && && && && && && && & }
& && && && && && && && && && &&&}
& && && && && && && && &}
& && && && && && && && &else
& && && && && && && && && && &&&key_state = key_state_4;& && && && && && && && && && && && && & // 按键已发生变化,转到按键释放态
& && && && && && && && &
& && && && && & case key_state_3:& && && && && && && && && && && && && && && && && && && && && & // 4.按键连发功能
& && && && && && && && &if (key_press == key_press_old)
& && && && && && && && &{
& && && && && && && && && && &&&if (++key_time &= RepeatTime)& && && && && && && && && && &&&// 按键时间计数
& && && && && && && && && && &&&{
& && && && && && && && && && && && && & key_time = 0;& && && && && && && && && && && && && && && && &// 按下时间&=0.05s,清0按键计数器
& && && && && && && && && && && && && & key_return = key_value_& && && && && && && && &// 返回上一次按键值
& && && && && && && && && && &&&}& && && && && && && && && && &&&
& && && && && && && && &}
& && && && && && && && &else
& && && && && && && && && & key_state = key_state_4;& && && && && && && && && && && && && &&&// 按键已发生变化,转到按键释放态
& && && && && && && && &
& && && && && & case key_state_4:& && && && && && && && && && && && && && && && && && && && && & // 5.等待所有按键释放开
& && && && && && && && &//if (!key_press)& && && && && && && && && && && && && && && && && && && && && & // 等待所有按键释放,才进入一次新的按键确认过程
& && && && && && && && &if (key_press != key_press_old)& && && && && && && && && && && && && & // 按键发生变化,就进入一次新的确认过程
& && && && && && && && && & key_state = key_state_0;& && && && && && && && && && && && && &&&// 按键已释放,转换到初始态.
& && && && && && && && && && && && && && && && &
& && &&&}& &
& & & & & & & &
& & & & & & & &
& & return key_
void Key_init(void)
& & KEY_DDR&&&=~ (K_STOP)|(K_START)|(K_SEL)|(K_ADD)|(K_DEC);
& & KEY_PORT |=&&(K_STOP)|(K_START)|(K_SEL)|(K_ADD)|(K_DEC);
void Timer0_Init(void)
& & & & // T/C0 初始化
& & & & TCCR0 = 0x0C;& & & & & & & & & & & & // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
& & & & TCNT0 = 0x00;
& & & & OCR0 = 0x08;& & & & & & & & & & & & // OCR0 = 0x7C(124),(124+1)/62.5=2ms
& & & & //TIMSK = 0x02;& & & & & & & & & & & & // 允许T/C0比较匹配中断
& & & & TIMSK |=(1&&OCIE0);//允许T/C0比较匹配中断
#pragma interrupt_handler Timer0_comp_isr:20
void Timer0_comp_isr(void)
& & //display();& & & & & & & & & & & & & & & & & & & & & & & & // LED扫描显示
& & & & if (++key_stime_counter &=5)
& & & & & & & & key_stime_counter = 0;
& & & & & & & & key_stime_ok = 1;& & & & & & & & & & & & & & & & // 10ms到
& & & & & & & & if (++time_counter &= 100)
& & & & & & & & {
& & & & & & & & & & & & time_counter = 0;
& & & & & & & & & & & & time_1s_ok = 1;& && && && & // 1s到
& & & & & & & & & & & &
& & & & & & & & }
void main(void)
&&Buzz_init();
&&Key_init();
&&Timer0_Init();
&&SREG|=0x80;
&&while(1)
&&& & & & & & & & if (key_stime_ok)& & & & & & & & & & & & & & & &
& & & & & & & & {
& & & & & & & & & & & & key_stime_ok = 0;& & & & & & & & & & & & & & & & // 10ms到
& & & & & & & & & & & & //typedef enum {NO_KEY,STOP,START,SEL,ADD,DEC,SETUP} eKEY;
& & & & & & & & & & & & switch (ReadKey())
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & case STOP:
& & & & & & & & & & & & & & & & & & & & Beep(1,1);
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & case START:& & & &
& & & & & & & & & & & & & & & & & & & & Beep(5,5);
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & case SEL:& & & &
& & & & & & & & & & & & & & & & & & & & Beep(10,10);
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & case ADD:& & & &
& & & & & & & & & & & & & & & & & & & & Beep(15,15);
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & case DEC:& & & &
& & & & & & & & & & & & & & & & & & & & Beep(20,20);
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & case SETUP:& & & &
& & & & & & & & & & & & & & & & & & & & Beep(130,130);
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & }
& & & & & & & & }
yupusong@qhd 发表于
你好,我在调试你贴上的程序,发现单个按键都正常,为什么组合键就不正常呢?代码如下:
#define OneKeyTime& && &&&300& && && && && && && && && && && && && && && && && && && && && && && && & // 单键长按时长 = OneKeyTime * 10ms
#define MuxKeyTime& && &&&500& && && && && && && && && && && && && && && && && && && && && && && && & // 组合键长按时长 = MuxKeyTime * 10ms
#define RepeatTime& && &&&5& && && && && && && && && && && && && && && && && && && && && && && && && &// 单键连发功能重复间隔时间 = RepeatTime * 10ms
case K_STOP|K_SEL:& && && && && && && && && && && && && & // &组合&键,长按键
本程序中,组合键,只定义了: STOP + SEL 键,并且要长按5S中 才会有效。
好的,多谢提示,我再试试看
好东西,正好要用,呵呵
多谢楼主的程序,已经调试通了,很实用
其实我是进来看看有没有其他平台的版本能借用的。
~伸手党~
你这种风格不好,应该把按键扫描和按键功能执行分开,分别做成模块,
1.在这里只是按键的扫描部分,返回的仅是按键值而已(由枚举类型已定义好的,是只为了方便识别),是只代表是哪个按键按下(相当于一个标识符吧),并没有去具体定义按键的任何功能。
2.具体按键功能的实现(处理),是于由它的上层模块来完成。
嘿嘿!做次伸手党,谢谢大神,我好好理解一下!
标记下。。。。
我想知道这个函数执行完了要多长时间,为什么我这个15ms还跑不完呢?
标记下,用的时候再看.
长按键跟短按键值返回都是一样,怎么在应用区别开来呢?
长按键跟短按键值返回都是一样,怎么在应用区别开来呢?
长按与短按返回的值不能一样,&&而持续按键实现连发功能 与 短按的返回的值是一样的。
长按与短按返回的值不能一样,&&而持续按键实现连发功能 与 短按的返回的值是一样的。
短按与长按肯定不能一样.但连发与短按返回值为什么能一样呢.应用怎么调用呢? 这个不解,呵呵.能告诉我下不?
可以这样处理,让短按的键值或上一个数值.返回这个.当然返回的数值不能跟别的冲突了.
连发就是相当于每次扫描的时候,把短按(正常操作)的值返回
学习。。。
连发就是相当于每次扫描的时候,把短按(正常操作)的值返回
提供一个我写的功能类似的按键程序给大家做参考
您好,楼主!看了你的程序,有点疑问想请教一下,你的程序是不是一个按键要么只能短按,要么只能长按,而不能一个按键同时具有短按,长按组合按的功能啊?
支持一个啊啊啊啊
谢谢分享.....
谢谢分享,学习学习
参考一下& && &&&
组合键时.甜腻问题
这个按键程序遇到一个问题,就是当按键按下就会返回短按的状态,而不是抬起才返回,这样子无法实现短按和长按实现不同的功能
mark,按键少的时候很有用
如果能够区分长按和短按就更好了
支持一下!!!!!
谢谢分享。。
#include &Main.h&
eKEY ReadKey(void)& & & & {
& & & & static U16 key_time =0;& & & & & & & & //长按键计时
& & & & static U8 key_state = 0;& & & & //记录按键当前扫描状态
& & & & static U8 key_press_old = 0;& & & & //记录上一次按键状态
& & & & static eKEY key_value_old = NO_KEY;& & & & //保存上一次按键返回值
& & & & eKEY key_return = NO_KEY;& & & & //按键功能返回值
& & & & U8 key_
& & & &
& & & & key_press = GetKey()^ Key_M& & & & //读按键IO电平,只保留被按下的键(被按下的键位为1)
& & & &
& & & & switch (key_state)& & & & {
& & & & & & & & case key_state_0:& & & & //按键初始态
& & & & & & & & & & & & if(key_press)& & & & {
& & & & & & & & & & & & & & & & key_state = key_state_1;& & & & //键被按下,状态转换到按键确认态
& & & & & & & & & & & & & & & & key_press_old = key_& & & & //保存当前按键状态
& & & & & & & & & & & & }
& & & & & & & & & & & &
& & & & & & & & case key_state_1:& & & & //按键确认态
& & & & & & & & & & & & if(key_press == key_press_old)& & & & //与初始态按键状态相同?
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & key_time = 0;& & & & //清零
& & & & & & & & & & & & & & & & switch (key_press)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & [color=DarkOrange]case OPEN:[/color]& & & & //case:K_OPEN ,这样写编译报错& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & key_state = key_state_4;& & & & //转按键释放态
& & & & & & & & & & & & & & & & & & & & & & & & key_return = OPEN;
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & case CLOSE:& & & & & & & & & & & & //case:K_COLSE ,报错
& & & & & & & & & & & & & & & & & & & & & & & & key_state = key_state_4;& & & & //转按键释放态
& & & & & & & & & & & & & & & & & & & & & & & & key_return = CLOSE;
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & default:
& & & & & & & & & & & & & & & & & & & & & & & & key_state = key_state_4;& & & & //转按键释放态
& & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & }
& & & & & & & & & & & & else if(!key_press)& & & &
& & & & & & & & & & & & & & & & key_state = key_state_0;& & & & //按键已抬起(干扰),转初始态
& & & & & & & & & & & & else
& & & & & & & & & & & & & & & & key_state = key_state_4;& & & & //按键已发生变化,转到按键释放态
& & & & & & & & & & & &
& & & & & & & & & & & & key_value_old = key_& & & & //保存按键返回值
& & & & & & & & & & & &
& & & & & & & & & & & && & & &
& & & & & & & & case key_state_4:& & & & //等待所有按键释放开
& & & & & & & & & & & & if(key_press != key_press_old)& & & & //按键发生变化,就进入一次新的确认过程
& & & & & & & & & & & & & & & & key_state = key_state_0;& & & & //按键已释放,转换到初始态
& & & & & & & & & & & &
& & & & }
& & & & return key_
}
void LockProc(void)& & & & {
& & & & switch(ReadKey())& & & & {
& & & & & & & & case OPEN:
& & & & & & & & & & & & & & & & OpenLockOut();
& & & & & & & & & & & &
& & & & & & & & case CLOSE:
& & & & & & & & & & & & & & & & ClosLockOut();
& & & & & & & & & & & &
& & & & & & & & case NO_KEY:
& & & & & & & & default:
& & & & & & & & & & & & & & & & ResetLock();
& & & & }
}
void T10msEvent(void)& & & & {
& & & & LockProc();
}复制代码#ifndef& & & & _PPQC_H
#define& & & & _PPQC_H
#define& & & & OpenLockOut()& & & & do{OpenOut=1;ClosOut=0;}while(0)
#define& & & & ClosLockOut()& & & & do{OpenOut=0;ClosOut=1;}while(0)
#define ResetLock()& & & & & & & & do{OpenOut=0;ClosOut=0;}while(0)
#define OneKeyTime& & & & 300& & & & & & & & // 单键长按时长 = OneKeyTime * 10ms
#define MuxKeyTime&&500& & & & & & & & // 组合键长按时长 = MuxKeyTime * 10ms
#define RepeatTime& & & & 5& & & & & & & & // 单键连发功能重复间隔时间 = RepeatTime * 10ms
#define Key_Mask (K_CLOSE|K_OPEN)& & & & //按键掩码值
#define GetKey()& & & & (KEY_PORT & Key_Mask)& & & & //读取按键端口值
#define key_state_0& & & & & & & & 0& & & & //初始态
#define key_state_1& & & & & & & & 1& & & & //确认态
#define key_state_2& &&&2& & & & //组合键,长按键确认态
#define key_state_3& & & & & & & & 3& & & & //长按连发功能确认态
#define key_state_4& & & & & & & & 4& & & & //等待释放态
typedef enum{NO_KEY,OPEN,CLOSE}eKEY;& & & & //按键返回值类型定义
eKEY ReadKey(void);
void LockProc(void);
void T10msEvent(void);
#endif
复制代码我把这个应用到PIC16F1824中,编译器9.83,proteus仿真结果不对。不知道哪里出错了。
CLOSEOUT一直有输出,K_CLOSE按下时,OPENOUT反而有输出。
问题解决了。
1、对于CLOSEOUT一直有输出,在端口初始化中,将LATC=0放在TRISC=0前面;
2、对于K_CLOSE按下时,OPENOUT反而有输出。将key_state_1里面的switch语句,case OPEN和case CLOSE改成:case 3,和case 1。
1、#define& & & & K_CLOS& & & & & & & & (1&&RA2) 和 K_OPEN& & & & & & & & (1&&RA1),为什么PICC不能像楼主那样写成case K_CLOS 和K_OPEN;
2、为什么case OPEN和case CLOSE改成:case 3,和case 1就仿真成功?3和1是如何得到的?难道PICC将 K_OPEN& & & & & & & & (1&&RA1)转换成了3?
想了几天了,还是不明白#define& && &&&K_CLOS& && && && && & (1&&RA2) ,为什么case :k_CLOS 通不过
想了几天了,还是不明白#define& && &&&K_CLOS& && && && && & (1
case 分支 必须是确定的常量 , 你好像是用的PIC单片机吧, RA2不是常量哦, 而是读取的引脚吧
case 分支 必须是确定的常量 , 你好像是用的PIC单片机吧, RA2不是常量哦, 而是读取的引脚吧&&...
一语中的。我以为PD3就是端口。查资料得知在AVR宏定义中有#define PD3 3。受教了,明白了。多谢。
本帖最后由 zw_7627 于
14:16 编辑
发现key_press = GetKey()^ Key_M只对相同电平输入有效,倘若有2路高入和2路低入同时存在,则无法判断。比如:RA1,RA2内部上拉,则PORTA= 000110;
而Key_Mask=110110; key_press = 110000;造成无法识别状态。
不一定好用啊
谢谢整理,值得学习。
阿莫电子论坛, 原"中国电子开发网"}

我要回帖

更多关于 ctrl v改成单键 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信