【蓝桥杯】STM32三行按键详解 长按 短按

用的是国信长天的嵌入式方向的开发板,使用的芯片是STM32F103RBT6,基于stm32f1的固件库编程。
当初写下这篇博客的本意也是让自己的知识更加巩固,希望大家看完后能有所收获。话不多说,直接上代码!

目录

  • 【蓝桥杯】STM32三行按键详解 长按 短按
    • 按键宏定义
    • 按键扫描函数
    • 按键扫描函数解析
    • 按键短按
    • 按键短按+长按函数

程序思路:
程序每1ms进入一次滴答定时器中断函数,函数内的key_count为按键计数变量,当key_count = 20时,即20ms时,令blKEY_Flag = 1;

当blKEY_Flag = 1时,key_proc函数中的uckey_times变量开始计数,当计数值大于40时,为长按。当计数值大于0小于20时,为短按.

具体代码如下:

按键宏定义

unsigned char ucTrg  = 0;
unsigned char ucCont = 0;
unsigned char uckey_times = 0;
unsigned char uckey_num = 0;
_Bool blKey_Flag = 0;#define KEY1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)
#define KEY3 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)
#define KEY4 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)#define KEYPORT KEY1 | (KEY2 << 1) | (KEY3 << 2) | (KEY4 << 3) | 0xf0

按键扫描函数

//按键扫描
void key_scan(void)
{unsigned char ucRead = 0;ucRead = (KEYPORT) ^ 0xff;ucTrg = ucRead & (ucRead ^ ucCont);ucCont = ucRead;
}

按键扫描函数解析

理解不了三行按键代码的同学,可以像如下代码一样,将具体值代入变量中,再去一步一步的往下推,一两遍过后,相信你一定可以理解的!

//未按下:KEYPORT = 0xff;ucRead  = (KEYPORT) ^ 0xff = 0xff ^ 0xff = 0x00;ucTrg   = ucRead & (ucRead ^ ucCount) = 0x00 & (0x00 ^ 0x00) = 0x00;ucCount = ucRead = 0x00;//第一次按下KEY1:KEYPORT = 0xfe;ucRead  = (KEYPORT) ^ 0xff = 0xfe ^ 0xff = 0x01;ucTrg   = ucRead & (ucRead ^ ucCount) = 0x01 & (0x01 ^ 0x00) = 0x01 & 0x01 = 0x01;ucCount = ucRead = 0x01;//持续按下KEY1:KEYPORT = 0xfe;ucRead  = (KEYPORT) ^ 0xff = 0xfe ^ 0xff = 0x01;ucTrg   = ucRead & (ucRead ^ ucCount) = 0x01 & (0x01 ^ 0x01) = 0x00;ucCount = ucRead = 0x01;

按键短按

这个函数只有短按的功能,对于一般的题目该函数已经足够了,如果题目要求要用到按键长按,那么请直接跳到后面的长按。

//短按
void key_func(void)
{if (blKey_Flag){blKey_Flag = 0; //在滴答定时器中计时,每20ms使 blKey_Flag=1key_scan();switch (ucTrg){case 0x01: led_control(0x01);break;case 0x02: led_control(0x04);break;case 0x04: led_control(0x10);break;case 0x08: led_control(0x40);break;   }   }
}

按键短按+长按函数

该函数同时具有短按和长按的功能,uckey_times是判断长短按的关键,uckey_times > 40是长按,uckey_times < 20是短按。

//短按+长按
void key_proc(void)
{if (blKey_Flag){blKey_Flag = 0;key_scan();/*长按部分*/switch (ucCont){case 0x01: uckey_times++, uckey_num = 1; if (uckey_times > 40) led_control(0x55);break;case 0x02: uckey_times++, uckey_num = 2; if (uckey_times > 40) led_control(0xaa);break;case 0x04: uckey_times++, uckey_num = 3; if (uckey_times > 40) led_control(0x55);break;case 0x08: uckey_times++, uckey_num = 4; if (uckey_times > 40) led_control(0xaa);break;}/*短按部分*/if (ucTrg == 0x00 && ucCont == 0x00){if (uckey_times > 0 && uckey_times < 20){switch (uckey_num){case 1: led_control(0x01);break;case 2: led_control(0x04);break;case 3: led_control(0x10);break;case 4: led_control(0x40);break;     }  }uckey_times = 0; }  }
}

systick.c
可以看到我是通过轮询的思想来写的代码,通过中断函数的计时变量来控制多久执行一次我的按键程序,该思想也可以用于ADC,LCD显示,USART打印等…

unsigned char key_count = 0;void SysTick_Handler(void)
{TimingDelay_Decrement();// lcd_count++;
//  if (lcd_count > 200) lcd_count = 0,LCD_Flag  = 1;
//  key_count++;if (key_count > 20) key_count = 0,blKEY_Flag  = 1;// ADC_count++;
//  if (ADC_count > 800) ADC_count = 0,blADC_Flag  = 1;
//
//  ucUSART_Times++;
//  if (ucUSART_Times > 50) ucUSART_Times = 0,RxCounter  = 0,memset(RxBuffer2,0,3);
}

第一次写博客,如有不对的地方,欢迎大家在评论区指正。

STM32超级简便的按键代码 只需三行 可实现短按+长按相关推荐

  1. python封装sql脚本 github_Github 大牛封装 Python 代码,实现自动发送邮件只需三行代码...

    原标题:Github 大牛封装 Python 代码,实现自动发送邮件只需三行代码 在运维开发中,使用 Python 发送邮件是一个非常常见的应用场景.今天一起来探讨一下,GitHub 的大牛门是如何使 ...

  2. Python第三方库巧用,制作图片验证码只需三行代码

    现在验证码的种类真的是越来越多,短信验证码.语音验证码.图片验证码.滑块验证码 - 我们在 PC 的网页端或者手机上的 app 进行登录或者注册时,应该总会遇见图片验证码,比如下面这类: 上面这些图片 ...

  3. Sweetviz:让你只需三行代码实现Python探索性数据分析

    Sweetviz 是一个开源 Python 库,它只需三行代码就可以生成漂亮的高精度可视化效果来启动EDA(探索性数据分析).输出一个HTML.文末提供技术交流群,喜欢点赞支持,收藏. 如上图所示,它 ...

  4. 只需三行代码轻松实现酷炫gif动图转换为mp4视频

    前两天有同学在群里发问如何把自己的gif动图转换成mp4视频格式,据她说转换软件太麻烦,我想万能的python或许可以一战,查了一番资料后发现只需三行代码即可实现,以下为具体方法. 安装第三方包mov ...

  5. python怎样实现封装_大牛教你如何封装 Python 代码,实现自动发送邮件只需三行代码...

    在运维开发中,使用 Python 发送邮件是一个非常常见的应用场景.今天一起来探讨一下,GitHub 的大牛门是如何使用 Python 封装发送邮件代码的. 一般发邮件的方式 SMTP是发送邮件的协议 ...

  6. Github 大牛封装 Python 代码,实现自动发送邮件只需三行代码

    在运维开发中,使用 Python 发送邮件是一个非常常见的应用场景.今天一起来探讨一下,GitHub 的大牛门是如何使用 Python 封装发送邮件代码的. 一般发邮件方法 SMTP是发送邮件的协议, ...

  7. python几行代码识别验证码_Python有多强?文字识别(验证码识别)只需三行代码!...

    不要说这都是在借用其它语言的代码,其实这些东西真的无关紧要.何为Python高级语言,黑猫白猫能捉到老鼠的就是好猫!如果真的有那么高冷,那么任何程序你都要敲代码而不用任何模块? 再开个玩笑,要不用0和 ...

  8. PywebIO 轻松制作一个数据大屏,代码只需100行

    今天我给大家分享一个制作数据大屏的工具,非常的好用,100行的Python代码就可以制作出来一个完整的数据大屏,并且代码的逻辑非常容易理解. PywebIO介绍 Python当中的PywebIO模块可 ...

  9. 只需一个技巧,短视频就可以一键在多个平台同时发布!

    越来越多的人开始尝试在上发布自己的内容,但是发布的过程却并不是那么的简单和方便,每个平台都有自己的发布规则和流程,需要用户一个一个地发布,这不仅费时费力,还容易出现错误.这时候,元引擎的功能就变得非常 ...

最新文章

  1. (DOM艺术) 实用的动画
  2. 粤桂粤黔谋定现代农业产业园 林裕豪:从玉农业一县一园签约
  3. Actor-ES框架:Ray--事件(Event)编写说明
  4. Quartz 定时任务(Scheduler)的 3 种实现方式
  5. Vjudge 2016-5-10 math test
  6. translucent 属性
  7. 实测哈啰电动车A80探索版:一辆带你行走的聪明“小神兽”
  8. 多目标跟踪(MOT)最新综述,一文快速入门
  9. 计算机和自动化结合的专业,自动化转计算机?你可以选择这个专业!
  10. 获取列表的最后一个元素
  11. 技术文件服务器搭建,搭建文件服务器_mob604756e49326的技术博客_51CTO博客
  12. 多元统计之因子分析模型及Python分析示例
  13. 【SQL】字符串去空格解决方法
  14. 树莓派CM4的6路串口测试
  15. 外虚内实是什么意思_俗语“五虚令人贫,五实人富贵”是什么意思?有道理吗?...
  16. The resource identified by this request is only capable of generating respon
  17. 解锁商业新模式,神奇AR为IP内容“添把火”
  18. 【云原生】还不会使用linux?快看这里,在window快速安装centos系统
  19. 视频教程-微信小程序商城15天从零实战课程-微信开发
  20. 浅谈MOSFET驱动电路

热门文章

  1. Linux主机下连接远程postgresql数据库、容器版postgresql数据库
  2. Oracle卸载教程
  3. python如何设置rgb颜色_Python 转换RGB颜色值的示例代码
  4. 计算机睡眠后黑屏,电脑睡眠唤醒后一直是黑屏状态怎么办?
  5. 2021-11-3 软件模拟IIC时序,并和EEPROM存储芯片24C02双向通信以及显示功能
  6. RH850从0搭建Autosar开发环境系列讲解 - 总目录
  7. 北京市重点区域5G网络实测分析
  8. mysql 实现日期格式化(date_format)
  9. MYSQL 时间格式化
  10. Java和c的一些不同(一)