第一步:初始化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. 看直播拿证书 | 12 天,0 基础晋级 Serverless 高手
  2. jsch连接mysql_求用jsch网络工具包通过ssh连接远程oracle数据库并发送sql操作语句(数据库在unix上)java代码例子...
  3. 在置信区间下置信值的计算_使用自举计算置信区间
  4. MYSQL重置密码遇到ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using passwor:yes)问题
  5. 怎样在MyEclipse中连接Oracle数据库
  6. 8月28日服务器例行维护公告,天涯明月刀8月28日更新了什么-8月28日更新内容介绍...
  7. Linux服务器配置——安装CentOS以及源配置
  8. 在html中生成动态表格数据,JavaScript实现网页动态生成表格
  9. 基于FPGA的映射调制实现
  10. Ant Design Pro学习记录—默认主题配色修改
  11. 操作系统-复习-考题预测及解析-期中考试
  12. spring 演变_团队的演变
  13. Al-learing数学基础,平均差,方差,协方差
  14. antd3.x版本table使用fixed错位问题修复
  15. 董明珠用 3.1 亿的带货成绩,刷新了许多人对直播电商的认知
  16. 废旧手机安装Syncthing作为文件服务器之2-文件同步
  17. My97DatePicker与angular一起使用时,监测不到值的变化
  18. RTSP安防网络摄像头/海康大华硬盘录像机网页无插件直播方案EasyNVR之主要功能模块及相关技术特点与性能指标分析
  19. C PUZZLES中的一道题
  20. js绘制超炫酷3D化学元素周期表

热门文章

  1. Winner 赢家 (2A - Winner) map
  2. 【转】零基础理解卷积神经网络
  3. 复选框的全选和取消全选
  4. oracle求部门请假类别合计_oracle数据库题目
  5. 【设计】用户体验地图
  6. 日语学习计划(转载)
  7. mysql 日常管理及维护
  8. 电机控制原理及其理论讲解
  9. ASEMI代理FGH60N60SMD安森美ON原装原厂IGBT
  10. 开源阅读书源_阅读3.20.0518追书神器 海量书源 免费开源无广告