精华内容
下载资源
问答
  • 单片机C语言 按键检测 //4*4键盘检测程序,按下键后相应的代码显示在数码管上
  • C语言检测按键

    千次阅读 2019-07-04 09:09:35
    记录一下按键检测的快速算法 typedef struct { uint16_t u16Value;//key value uint16_t u16Trg;//triger uint16_t u16Cont;//continue bool boolPressed; uint16_t u16Release;//release bool boolReleased; ...

    记录一下按键检测的快速算法

    typedef  struct 
    {
    	uint16_t u16Value;//key value
    	
    	uint16_t u16Trg;//triger 
    	
    	uint16_t u16Cont;//continue
    	bool boolPressed;
    	
    	uint16_t u16Release;//release
    	bool boolReleased;				
    	
    }KEY_INFO;
    

    u16Trg : 表示按键按下的状态
    u16Release :表示释放的状态
    u16Cont :按键值

    1.检测

     //1.get key is pressed value.
    u16Value = u16Value & DE_KEY_ALL;      
    
    //2.triger pressed                                                      
    g_KeyInfo.u16Trg     = u16Value & (u16Value ^ g_KeyInfo.u16Cont);      
      
     //3.triger released     
    g_KeyInfo.u16Release = u16Value ^ g_KeyInfo.u16Trg ^ g_KeyInfo.u16Cont; 
    
    //4.the key countinue press	
    g_KeyInfo.u16Cont    = u16Value;										                                 
    

    2.处理

    static void Key_Process(void)
    {
    
    	//get the key released
    	if(g_KeyInfo.u16Release)
    	{
    		g_KeyInfo.u16Value |= g_KeyInfo.u16Release;
    	}
    	//key pressed
    	if(g_KeyInfo.u16Cont)
    	{
    		g_KeyInfo.boolPressed = TRUE;
    	}
    
    	//key released
    	if((!g_KeyInfo.u16Cont)&&(g_KeyInfo.boolPressed))
    	{
    		g_KeyInfo.boolPressed  = FALSE;
    		g_KeyInfo.boolReleased = TRUE;
    	}
    }
    
    1. 传值

      if(g_KeyInfo.boolReleased)
      {
      return g_KeyInfo.u16Value;
      }

    展开全文
  • Linux C语言实现按键和鼠标检测

    千次阅读 2019-04-17 13:08:33
    #include #include #include #include #include #include #include #include #include ...#define KEY_ENENT_DEV1_NAME ...2、按键时长检测 3、鼠标移动绝对位置检测 (第一次鼠标左击确定原点位置)
    #include <stdio.h>
    #include <linux/input.h>
    #include <fcntl.h>
    #include <stdint.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <time.h>
    #include <sys/select.h>
    #include <sys/time.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    #define KEY_ENENT_DEV1_NAME		"/dev/input/event1"
    #define MICE_EVENT_NAME			"/dev/input/mice"
    #define unsigned short   		__u16
    #define signed int				__s32
    
    typedef enum{
    	No_Click,
    	Left_Click,
    	Right_Click,
    	Left_Right_Click,
    	Middle_Click,
    	Middle_Left_Click,
    	Middle_Right_Click,
    	All_Click,
    	StateCount
    }MouceClickState;
    char *clickState[StateCount] = {
    		"No Click",
    		"Left Click",
    		"Right Click",
    		"Left Right Click",
    		"Middle Click",
    		"Middle Left Click",
    		"Middle Right Click",
    		"All Click"
    };
    #define 	THOUSAND				1000
    #define 	LONGPRESSTIME			1500
    
    int sysKeyAndMouseScan(void){
    	int ret = -1;
    	int key_fd = 0;
    	int mice_fd = 0;
    	int max = 0;
    	int absX = 0;
    	int absY = 0;
    	int lock = 0;//use to lock the origin point
    	struct input_event key_event ;
    	char miceBuf[6] = {0};
    	struct timeval tvStart,tvStop,tvAlarm;
    	fd_set readfds;
    	long pressTime = 0;
    	key_fd = open(KEY_ENENT_DEV1_NAME,O_RDONLY);
    	if(key_fd <= 0){
    		printf("open /dev/input/event1 device error!\n");
    		return ret;
    	}
    	mice_fd = open(MICE_EVENT_NAME,O_RDONLY);
    	if(mice_fd <= 0){
    			printf("open /dev/input/mice device error!\n");
    			return ret;
    	}
    	max = ((key_fd > mice_fd)?(key_fd):(mice_fd));
    	tvAlarm.tv_sec = 5;
    	tvAlarm.tv_usec = 0;
    	while(1){
    		FD_ZERO(&readfds);
    		FD_SET(key_fd,&readfds);
    		FD_SET(mice_fd,&readfds);
    		if((ret = select(max+1,&readfds,NULL,NULL,&tvAlarm)) < -1){
    			continue;
    		}else if(ret == 0){
    			//printf("TimeOut\n");
    			continue;
    		}else{
    			if(FD_ISSET(key_fd,&readfds)){
    				ret = read(key_fd,&key_event,sizeof(key_event));
    				if(ret){
    					if(key_event.type == EV_KEY ){
    						//printf("%d ",key_event.value);
    						if(key_event.value == 0){
    							tvStop.tv_sec = key_event.time.tv_sec;
    							tvStop.tv_usec = key_event.time.tv_usec;
    							printf("\trealeased !\n");
    							pressTime = (tvStop.tv_sec-tvStart.tv_sec)*THOUSAND+(tvStop.tv_usec-tvStart.tv_usec)/THOUSAND;
    							printf("press Time: %ld ms ->",pressTime);
    							if(pressTime > LONGPRESSTIME){
    								printf(" Long Press!\n");
    							}else{
    								printf(" Short Press!\n");
    							}
    						}else if(key_event.value == 1){
    							tvStart.tv_sec = key_event.time.tv_sec;
    							tvStart.tv_usec = key_event.time.tv_usec;
    							printf("\tpressed!\n");
    						}else if(key_event.value == 2){
    							continue;
    						}else{
    							printf("other");
    						}
    						if(key_event.code == KEY_ESC)
    						{
    							break;
    						}
    					}
    
    				}
    			}
    			if(FD_ISSET(mice_fd,&readfds)){
    
    				if((ret = read(mice_fd,miceBuf,sizeof(miceBuf))) <= 0){
    					continue;
    				}
    				else{
    					switch(miceBuf[0] & 0x07){
    						case No_Click:
    							absX += miceBuf[1];
    							absY += miceBuf[2];
    							printf("%s\tabsX:%d\tabsY:%d\n",clickState[No_Click],absX,absY);
    							break;
    						case Left_Click:
    							if(lock == 0){ //use to lock the origin point
    								lock = 1;
    								absX = 0;
    								absY = 0;
    							}
    							else{
    								absX += miceBuf[1];
    								absY += miceBuf[2];
    							}
    							printf("%s\tabsX:%d\tabsY:%d\n",clickState[Left_Click],absX,absY);
    							break;
    						case Right_Click:
    							absX += miceBuf[1];
    							absY += miceBuf[2];
    							printf("%s\tabsX:%d\tabsY:%d\n",clickState[Right_Click],absX,absY);
    							break;
    						case Left_Right_Click:
    							absX += miceBuf[1];
    							absY += miceBuf[2];
    							printf("%s\tabsX:%d\tabsY:%d\n",clickState[Left_Right_Click],absX,absY);
    							break;
    						case Middle_Click:
    							absX += miceBuf[1];
    							absY += miceBuf[2];
    							printf("%s\tabsX:%d\tabsY:%d\n",clickState[Middle_Click],absX,absY);
    							break;
    						case Middle_Left_Click:
    							absX += miceBuf[1];
    							absY += miceBuf[2];
    							printf("%s\tabsX:%d\tabsY:%d\n",clickState[Middle_Left_Click],absX,absY);
    							break;
    						case Middle_Right_Click:
    							absX += miceBuf[1];
    							absY += miceBuf[2];
    							printf("%s\tabsX:%d\tabsY:%d\n",clickState[Middle_Right_Click],absX,absY);
    							break;
    						case All_Click:
    							absX += miceBuf[1];
    							absY += miceBuf[2];
    							printf("%s\tabsX:%d\tabsY:%d\n",clickState[All_Click],absX,absY);
    							break;
    						default:break;
    					}
    				}
    			}
    		}
    	}
    
    	close(mice_fd);
    	close(key_fd);
    	return ret;
    }
    int main(int argc, char **argv) {
    	printf("---This is a key and mouse event test!---\n");
    
    	sysKeyAndMouseScan();
    
    	printf("exit");
    	return 0;
    }
    
    

    实现的功能:

    1、键盘和鼠标检测

    2、按键时长检测

    3、鼠标移动绝对位置检测

    (第一次鼠标左击确定原点位置)

    展开全文
  • 前面的方法能够即时地反馈按键信息,但是有一个问题就是当组合按键的时候,比如通过方向键盘组合控制小车的时候,需要检测多个键盘按下的状态,这个时候已经按下的键盘不会持续发送键盘输入,不能被检测到,需要另外...

    在需要同时监听多个按键按下状态的情况下,可以通过监听/dev/input/event事件的方法来判断按键的状态。比如对于通过键盘控制小车时,有可能多个方向键同时按下,需要同时监测到,通过前面文章的方法可以有效监控单个按键的消息,但是不能同时监控多个按键同时按下的信息。需要通过记录键盘的按下和释放事件来确定当前键盘的状态,以方向键盘组合按键为例,示例程序如下:

    #include <stdio.h>  
    #include <unistd.h>
    #include <linux/input.h>  
    #include <sys/types.h>  
    #include <sys/stat.h>  
    #include <fcntl.h>  
    
    int main()  
    { 
        int keys_fd;  
        input_event t;
    
        char device[] = "/dev/input/event6";
    
        keys_fd = open(device, O_RDONLY);  
        if(keys_fd <= 0)  
        { 
            printf("Open %s device error!\n", device);  
            return -1;  
        }
    
        bool up = 0, down = 0, left = 0, right = 0;     //true for pressed, flase for released
        double vel = 0, yaw = 0;
        while(1)  
        {  
            if(read(keys_fd, &t, sizeof(t)) != sizeof(t)) continue;
    
    	if(t.type != EV_KEY) continue;
    
            if (t.code == KEY_ESC) break;
    
            if (t.code == KEY_LEFT) left = t.value;
            if (t.code == KEY_RIGHT) right = t.value;
            if (t.code == KEY_UP) up = t.value;
            if (t.code == KEY_DOWN) down = t.value;
    
            yaw = left ? -1 : right ? 1 : 0;
            vel = up ? 1 : down ? -1 : 0;
    
            printf("Control vel %.1lf, yaw %.1lf\n", vel, yaw);
        }  
    
        close(keys_fd);  
        return 0;  
    }

    如上,监听键盘输入对应的事件(本机为/dev/input/event6),记录方向键的按下和释放事件,从而确定各个方向键的按下状态,从而确定相应的遥控指令(vel, yaw)。

    不同的机器键盘对应的事件名称不一定一样,可以通过

    $ cat /proc/bus/input/devices

    来查看键盘对应的事件。

    展开全文
  • 纯干货: #include #include #include #include #include #include static struct termios initial_settings, new_settings; static int peek_character = -1; void init_keyboard();...in

    纯干货:

    #include <stdio.h>
    #include <stdlib.h>
    #include <termios.h>
    #include <curses.h>
    #include <unistd.h>
    #include <term.h>
    
    static struct termios initial_settings, new_settings;
    static int peek_character = -1;
    void init_keyboard();
    void close_keyboard();
    int kbhit();
    int readch();
    
    int main()
    {
    	int ch = 0;
    	
    	init_keyboard();
    	while(ch != 'q')
    	{
    		printf("looping\n");
    		sleep(1);
    		if(kbhit())
    		{
    			ch = readch();
    			printf("you hit %c\n",ch);
    		}
    	}
    	close_keyboard();
    	exit(0);
    }
    
    void init_keyboard()
    {
    	tcgetattr(0, &initial_settings);
    	new_settings = initial_settings;
    	new_settings.c_lflag &= ~ICANON;
    	new_settings.c_lflag &= ~ECHO;
    	new_settings.c_lflag &= ~ISIG;
    	new_settings.c_cc[VMIN] = 1;
    	new_settings.c_cc[VTIME] = 0;
    	tcsetattr(0,TCSANOW, &new_settings);
    }
    
    void close_keyboard()
    {
    	tcsetattr(0,TCSANOW, &initial_settings);
    }
    
    int kbhit()
    {
    	char ch;
    	int nread;
    	
    	if(peek_character != -1)
    	{
    		return -1;
    	}
    	new_settings.c_cc[VMIN] = 0;
    	tcsetattr(0, TCSANOW, &new_settings);
    	nread = read(0, &ch, 1);
    	new_settings.c_cc[VMIN] = 1;
    	tcsetattr(0,TCSANOW, &new_settings);
    
    	if(nread == 1)
    	{
    		peek_character = ch;
    		return 1;
    	}
    	return 0;
    }
    
    int readch()
    {
    	char ch;
    	if(peek_character != -1)
    	{
    		ch = peek_character;
    		peek_character = -1;
    		return ch;
    	}
    	read (0, &ch, 1);
    	return ch;
    }

    实现的效果如下:


    展开全文
  • 本文是笔者在学习51单片机的笔记心得。这篇着重介绍C51单片机是如何检测独立按键以及矩阵键盘操作。
  • C语言键盘检测

    万次阅读 2018-05-15 15:11:58
    在日常的应用里面,程序难免会跟用户进行互动,尤其是小游戏程序,需要实时的检测按键来判断用户的操作。那么,键盘检测如何通过代码实现呢。 下面这段代码是用来实现输入一个按键并输出对应按键ASCII码键值的程序...
  • 雷电战机-BETA版本 ... 更新内容:真实随机+界面enter+键盘读入优化(支持双按键) 最想说的还是 “C语言检测某键是否被按下(监视热键)[G...
  • 下面是我之前写的一个按键检测的框架,适合比较多的按键操作,从信号接收、滤波、最好处理按键任务,大体上没什么问题,不过没具体测试过到时可能会有bug。 1 /**********************************************...
  • 检测按键,C

    2015-12-03 16:32:45
    检测按键,c语言程序,适用于51单片机等
  • 需要一个函数,大概功能是在游戏界面按下某个键后程序能够检测到。 在网上搜到的很多函数必须在程序界面才能响应。 希望有高手能指点一下,提供几个函数原型,最好有用法举例,网上搜到很多函数搞不清用法。
  • 主要问题在于C语言里面的移位操作数为负数的时候,不清楚、 key.h  /*板上按键GPH2_0-GPH2_3 ,GPH3_0-GPH3_3 其中GPH2_0 标注back GPH2_1 标注home GPH2_2 标注menu*/ #ifndef _KEY_H_ #define _...
  • 本软件模块实现按键的单次按下、单次释放、按下状态、释放状态、故障(卡滞)状态的检测。 单次按下:按键从无效电平到有效电平跳变 单次释放:按键从有效电平到无效电平跳变 按下状态:按键处于按下状态 释放...
  • 在嵌入式系统尤其是单片机系统中经常用到按键检测和处理,这里提供一个标准的驱动函数模块MultiButton,能够提供按下、弹起、单击、双击、连击、长按等按键事件。 MultiButton 是一个小巧简单易用的事件驱动型按键...
  • 矩阵键盘检测 按键号对应显示的数字 方便修改成其他功能的键盘控制
  • 基于51单片机,三个数码管显示,独立按键控制加减, 按键检测使用外部中断。 c语言程序
  • PCR 是由金属轴、导电泡沫橡胶层、电阻层、保护层构成,负责为 OPC 表面充电。... 本 PCR 电阻检测系统实现的功能如下: 50V ~ 500V高压可调产生电路、电流取样电路及调理、矩阵按键实现、上位机通信及调试信息显示
  • 题目:使用汇编或者C语言,编写一个单片机程序。 P2.0控制LED灯(0为亮,1为灭),P3.1为...分析:使用定时器中断,在主循环中一直检测按键是否按下 程序如下: #include <reg51.h> #define uint unsig...
  • 基于51单片机,实现了按键检测功能,主要使用c语言编程。
  • while((i)&&(K1==0)) //检测按键是否松开 { Delay10ms(); i++; } i=0; } if(K2==0) //检测按键K2是否按下 { Delay10ms(); //消除抖动 if(K2==0) { ...
  • C语言keypad scan

    2012-12-26 22:47:06
    本程序是基于AVR 单片机的C语言,本程序是检测键盘的按键情况
  • (1)设置4个红外报警区域,检测到红外报警时,发出对应的声音,并在LCD显示屏显示报警时间。 (2)按下取消按键,静音、灭灯。 (3)在发出声音的同时,对应的指示灯闪亮。 (4)上电开机时保持静音状态。
  • 基于Proteus的矩阵键盘按键检测单个数码管显示,三个文件,两种循环方式实现矩阵按键检测,一种非循环方式显示按键。 有动画原理显示和三个c语言文件。
  • 检测长按 短按 连击等各种状态按键检测程序,使用C语言编写
  • 贪吃蛇C语言

    2021-05-11 05:45:42
    有趣的小游戏,实现关键点有光标移动,按键检测,状态转移,随机数生成。欢迎讨论! #include<stdio.h> #include<windows.h> #include<time.h> #include<conio.h> #define UP 'w' #define ...
  • C语言——2048

    2018-08-17 13:06:49
    背景 昨天给自己放了个假,除了睡觉贼无聊,然后就开始找事情做了。 搜了一下c语言新手项目,看到2048就开始做了。   ...用一维数组存储数字,每次操作通过对...按键检测在main函数里面实现; a.按键处理 1)通...
  • 大概花了我一个礼拜的时间,幸好我的C语言学得还可以,最后还是让我搞出来了,真是高兴,我是采用STC-52单片机和DS18B20数字温度传感器做的一个温度检测系统:实现的主要功能是:能够通过按键设置报警温度,报警温度...
  • //好不容易调好的4*4按键识别程序//通过按键相应显示0-F/*心得:初次调试时 按键后总是无反应 通过观察硬件电路选择好相应的I/O接口 烧入程序观察 还是无反应,又不断检测电路 反复调试 结果还是一样。折腾了半天,...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 140
精华内容 56
关键字:

c语言检测按键

c语言 订阅