第一步:初始化GPIO口(该初始化基于STM32F412单片机开发,该按键程序在其他stm32f单片机上使用只需修改GPIO口初始化)
GPIO_InitTypeDef GPIO_InitStruct;
AHB1_GRP1_EnableClock(AHB1_GRP1_PERIPH_GPIOB);//时钟初始化
GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_6|GPIO_PIN_9;//IO口
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//IO口模式
GPIO_InitStruct.Pull = GPIO_PULL_UP;
GPIO_Init(GPIOB, &GPIO_InitStruct);
第二步:按键类似位操作读取
u8 B_KEY_JC;
u8 R_KEY_timMax;
vu8 R_KEY_timi;
u8 Key_LB_value;
static u8 Key_LB_i;
static u8 Key_LB_data;
static u8 Key_LB_data_Q;
static u8 Key_LBUnstable_i;
#define KEY_1_RinBit GPIOB->IDR&GPIO_PIN_9==GPIO_PIN_9;
#define KEY_2_RinBit GPIOB->IDR&GPIO_PIN_3==GPIO_PIN_3;
#define KEY_3_RinBit GPIOB->IDR&GPIO_PIN_6==GPIO_PIN_6;
void KEY_Filter_processing(void)
{
Key_LB_data=0;
if(!KEY_1_RinBit)
Key_LB_data |= 0x01;
if(!KEY_2_RinBit)
Key_LB_data |= 0x02;
if(!KEY_3_RinBit)
Key_LB_data |= 0x04;
if(Key_LB_data_Q==Key_LB_data)//如果前后两次按键相同
{
if(Key_LB_i<10)
Key_LB_i++;
else
{
Key_LB_value=Key_LB_data;
Key_LBUnstable_i=0;
}
}
else
{
Key_LB_i=0;
Key_LB_data_Q=Key_LB_data;
if(Key_LBUnstable_i<20)
Key_LBUnstable_i++;
else
Key_LB_value=Key_LB_data;
}
}
第三步:读取按键情况
void Key_scan(void) // uint8
{
// static u8 key_delay=0;//按键去抖动寄存器
// static u8 key_value0=0;//前一次按键值寄存器
static u8 key_value1=0; //按键释放后的按键值寄存器
static u8 key_value2=0; //按键释放后的按键值寄存器
static u8 key_longtime=0;//长按时间累积寄存器1
static u8 key_longtime1=0;//长按时间累积寄存器2
static u8 key_super_longtime=0; //超长按时间累积寄存器
static u8 F_longkey=0;//长按
static u8 F_super_longkey=0;//超长按
static u8 f_onkey=0;
static u8 Key_Hda;
static u8 KEY_data=0;
static u8 B_anxiaOpen_EN=0;
static u8 B_f_onkey=0;
key_value=Key_LB_value;
{
{
if(key_value>0)
{
if(!f_onkey)
{
f_onkey=1;
if(key_value!=key_value2)
{
KEY_data=0;
}
Key_Hda=0;
if(key_value2==KEY_M && KEY_data==4)
{
KEY_data=5;
R_key_5C=KEY_M;
}
if(!B_Key_release)
R_key_anxia=key_value;
key_value1=key_value;
key_value2=key_value;
}
else
{//按键长按
if(key_longtime<15)//
{
key_longtime++;
if(key_value1!=key_value)
{
R_key_anxia=key_value;
key_longtime1=0;
B_anxiaOpen_EN=1;
}
key_value1=key_value;
key_value2=key_value;
}
if(key_value==key_value1 && key_value2==key_value)
{
if(!F_longkey)
{
if(++key_longtime1>=20)
{
key_longtime1=0;//
F_longkey=1;
//长按按键处理程序
KEY_data=0;
if(!B_Key_release)
R_key_keep=key_value;
}
}
else
{
if(!B_Key_release)
R_key_anzhu=key_value1;
if(!F_super_longkey)
{
if(++key_super_longtime>=15)
{
key_super_longtime=0;//
F_super_longkey=1;
//超长按按键处理程序
if(!B_Key_release)
R_key_super_keep=key_value1;
}
}
key_value2=key_value;
}
}
else if((key_value&key_value1)==0)
{
if(F_longkey)
{
if(!B_Key_release)
R_key_anzhuOpen=key_value1;
}
key_longtime=0;
key_longtime1=0;//3????
key_super_longtime=0;
key_value1=key_value;
key_value2=key_value;
}
else if((key_value&key_value1) &&(key_value!=key_value1))
{
key_value2=key_value;
}
}
}
else
{
B_Smoking_mark_Q=0;
key_longtime=0;
key_longtime1=0;
key_super_longtime=0;
if(F_longkey)
{//长按按键释放
KEY_data=0;
F_super_longkey=0;
if(!B_Key_release)
R_key_anzhuOpen=key_value1;
B_f_onkey=0;
}
else if(f_onkey)
{//短按按键释放
B_f_onkey=1;
if(!B_Key_release)
{
if(key_value1>0)
{
if(KEY_data<5)
{
KEY_data++;
}
}
}
if(!B_Key_release && !B_anxiaOpen_EN)
R_key_anxiaOpen=key_value1;
}
if(key_value2>0)
{
if(Key_Hda<15)
{
Key_Hda++;
}
else
{
if(!B_Key_release && B_f_onkey)
{
switch(KEY_data)
{
case 1: R_key_1C=key_value2;break;
case 3: R_key_3C=key_value2;break;
//case 5: R_key_5C=key_value2;break;
}
R_key_XC=key_value2;
R_key_XC_Data=KEY_data;
}
KEY_data=0;
key_value2=0;
}
}
f_onkey=0;
F_longkey=0;
if(!B_Key_release)
R_key_Open=key_value1;
else
{
B_Key_release=0;
KEY_data=0;
}
B_anxiaOpen_EN=0;
key_value1=0;
}
}
}
第四步:按键加减
//加减操作 //xh=0:加减不做循环 xh=1:加减到最大再次按下循环 xh=2:循环
u16 KEY_R_ADD_SUB(u8 *KEY,s16 R,u8 KADD,u8 KSUB,s16 max,s16 min,s8 bu,u8 xh,u8 tim)
{
static u8 B;
if((R==max || R==min)&&xh==1)
{
if(R_key_anxia==KADD || R_key_anxia==KSUB)
B=1;
}
else
{
B=0;
}
if(*KEY==KADD)
{
if(R<max)
{
R+=bu;
R_Bright_screen_Time=R_Bright_screen_TimeMAX;
}
else if(xh)
{
R=min;
}
}
else if(*KEY==KSUB)
{
if(R>min)
{
R-=bu;
R_Bright_screen_Time=R_Bright_screen_TimeMAX;
}
else if(xh)
{
R=max;
}
}
if(R_key_anzhu==KADD)
{
if(!R_KEY_timi)
{
if(R_KEY_timMax>tim)
{
R_KEY_timMax-=5;
}
R_KEY_timi=R_KEY_timMax;
if(R<max)
{
R+=bu;
R_Bright_screen_Time=R_Bright_screen_TimeMAX;
}
else if(xh==2 || B)
{
R=min;
}
}
}
else if(R_key_anzhu==KSUB)
{
if(!R_KEY_timi)
{
if(R_KEY_timMax>tim)
{
R_KEY_timMax-=5;
}
R_KEY_timi=R_KEY_timMax;
if(R>min)
{
R-=bu;
R_Bright_screen_Time=R_Bright_screen_TimeMAX;
}
else if(xh==2 || B)
{
R=max;
}
}
}
else if(!R_key_anzhu)
{
R_KEY_timMax=150;
}
if(R>max)
R=max;
else if(R<min)
R=min;
return R;
}
/*KEY.h*/
extern u8 B_KEY_JC;
extern u8 R_KEY_timMax;
extern vu8 R_KEY_timi;
extern u8 R_key_anxia;
extern u8 R_key_Open;
extern u8 R_key_anxiaOpen;
extern u8 R_key_anzhuOpen;
extern u8 R_key_keep;
extern u8 R_key_super_keep;
extern u8 R_key_1C;
extern u8 R_key_3C;
extern u8 R_key_5C;
extern u8 R_key_XC;
extern u8 R_key_XC_Data;
extern u8 R_key_anzhu;
extern u8 key_value;
extern u8 B_Key_Clean_xC;
extern u8 B_Key_release;
extern u8 B_USB_RinBit;
extern u8 B_USB_Low;
extern u8 B_testing_IC;
extern u16 R_testing_IC_Tim;
extern u8 B_InterfaceGOTO;
typedef enum KEY_bit
{
KEY_M=0x01,
KEY_ADD=0x04,
KEY_SUB=0x02,
KEY_M_ADD=0x05,
KEY_M_SUB=0x03,
KEY_ADD_SUB=0x06,
KEY_NOP=0xFF,
}KEY_bit;

STM32fxx 按键相关推荐

  1. 中断(STM32FXX系列单片机)

    中断概述 1.1 什么是中断? 1.2 中断的作用 中断的实现 2.1 中断的入口 2.2 中断优先级 ARM单片机中断体系 3.1 NVIC优先级说明 3.2 NVIC优先级分配方式 3.3 STM ...

  2. LeetCode简单题之按键持续时间最长的键

    题目 LeetCode 设计了一款新式键盘,正在测试其可用性.测试人员将会点击一系列键(总计 n 个),每次一个. 给你一个长度为 n 的字符串 keysPressed ,其中 keysPressed ...

  3. android 隐藏底部虚拟按键

    隐藏底部虚拟按键,但是如果你在底部网上滑动还是显示的出来的, 我在项目中写在了BaseActivity里面,大致如下 ,我这用在贩卖机上面,手机上的app开发还真没用过, 下面测试可以使用,已经使用在 ...

  4. ucgui下制作漂亮按键

    源:ucgui下制作漂亮按键 转载于:https://www.cnblogs.com/LittleTiger/p/10313161.html

  5. 51单片机 小车 L298N pwm调速 串口控制 按键控制

    难点:1.串口定时器T1,和T0定时器优先级 2.pwm频率与占空比的设置 按键控制 按键1--前进 按键2--后退 按键3--加速 按键4--减速 (板子上只有四个按键) 串口控制 '1'--前进 ...

  6. Python 字典创建、更新、按键值排序、取最大键值对等操作

    1. 字典创建 In [1]: d = {}In [2]: d Out[2]: {}In [3]: d = dict()In [4]: d Out[4]: {}In [5]: dict(a=1,b=2 ...

  7. MFC之按键消息(长按处理)

    想要实现长按键的一些控制,查了查可以通过捕获键盘事件,然后处理按键时需要进行的操作.下面简单的实现左右按键界面更新数值加减.  1. 重载PreTranslateMessage(MSG* pMsg)函 ...

  8. linux 内核按键抖动,Tiny4412 Linux驱动之按键(定时器防抖动) | 技术部落

    按键抖动示意图 我们平常所用的按键为机械弹性开关,由于触点的弹性作用,按键在闭合时不会马上稳定的接通,而是有一段时间的抖动,在断开时也不会立即断开.抖动时间由按键的机械特性所决定,一般为5ms~10m ...

  9. 三星 arm9 linux,基于arm9内核三星s3c2410平台下linux四键按键驱动程序

    #ifndef __kernel__ #define __kernel__ #endif #ifndef module #define module #endif#include #include # ...

最新文章

  1. Spring boot 参数校验
  2. 皮一皮:中国好邻居!
  3. DataGridView的DataGridViewComboBoxColumn列点击一次,自动处于编辑状态
  4. 谈谈利用JavaScript结合相对单位rem实现自适应布局的简单而实用的方法
  5. js 错误/异常处理
  6. 扩展entity framework core实现默认字符串长度,decimal精度,entity自动注册和配置
  7. 电脑很卡~~~~为什么???
  8. Intel超线程技术 Hyper-Threading Technology (3) - 处理器资源与超线程(复制的资源)
  9. PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 34 章 大对象_34.2. 实现特性
  10. pandas 空字符串与na区别_pandas中对nan空值的判断
  11. luogu P3810 【模板】三维偏序(陌上花开)
  12. Ubuntu18.04开机卡在“starting Gnome Display Manager”的解决方法
  13. 蘑菇街直播实战技巧带你解决直播开发难题
  14. 新益华基层医疗系统使用方法_MongoDB for VS Code:使用Mongo的新方法
  15. DirectShow 基础教程
  16. selenium页面跳转问题-QQ邮箱登录之后找不到元素
  17. eclipse使用maven新建类目录时,提示The folder is already a source folder
  18. java-php-net-python-宠物网站..-.计算机毕业设计程序
  19. 我在周日凌晨执意顶着困意喝酒
  20. 技术干货| 详解AI国际顶会NeurIPS 2020的黑盒优化竞赛冠军算法——HEBO算法

热门文章

  1. 置信区间 confidence interval
  2. unity应用开发实战案例_Unity3D游戏引擎开发实战从入门到精通
  3. 三菱FX2NPLC 定时器和计数器(2)
  4. 【报告分享】中国数字经济全景白皮书-易观智库(附下载)
  5. 一、本地安装ANTLR4并编译G4文件
  6. sap根据采购申请查询询价
  7. 2017年家电圈的人工智能化
  8. MATLAB查看连续小波的形态和中心频率
  9. OTA【空中下载】简介
  10. 3990 中国余数定理 2[一中数论随堂练]