STM32超级简便的按键代码 只需三行 可实现短按+长按
【蓝桥杯】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超级简便的按键代码 只需三行 可实现短按+长按相关推荐
- python封装sql脚本 github_Github 大牛封装 Python 代码,实现自动发送邮件只需三行代码...
原标题:Github 大牛封装 Python 代码,实现自动发送邮件只需三行代码 在运维开发中,使用 Python 发送邮件是一个非常常见的应用场景.今天一起来探讨一下,GitHub 的大牛门是如何使 ...
- Python第三方库巧用,制作图片验证码只需三行代码
现在验证码的种类真的是越来越多,短信验证码.语音验证码.图片验证码.滑块验证码 - 我们在 PC 的网页端或者手机上的 app 进行登录或者注册时,应该总会遇见图片验证码,比如下面这类: 上面这些图片 ...
- Sweetviz:让你只需三行代码实现Python探索性数据分析
Sweetviz 是一个开源 Python 库,它只需三行代码就可以生成漂亮的高精度可视化效果来启动EDA(探索性数据分析).输出一个HTML.文末提供技术交流群,喜欢点赞支持,收藏. 如上图所示,它 ...
- 只需三行代码轻松实现酷炫gif动图转换为mp4视频
前两天有同学在群里发问如何把自己的gif动图转换成mp4视频格式,据她说转换软件太麻烦,我想万能的python或许可以一战,查了一番资料后发现只需三行代码即可实现,以下为具体方法. 安装第三方包mov ...
- python怎样实现封装_大牛教你如何封装 Python 代码,实现自动发送邮件只需三行代码...
在运维开发中,使用 Python 发送邮件是一个非常常见的应用场景.今天一起来探讨一下,GitHub 的大牛门是如何使用 Python 封装发送邮件代码的. 一般发邮件的方式 SMTP是发送邮件的协议 ...
- Github 大牛封装 Python 代码,实现自动发送邮件只需三行代码
在运维开发中,使用 Python 发送邮件是一个非常常见的应用场景.今天一起来探讨一下,GitHub 的大牛门是如何使用 Python 封装发送邮件代码的. 一般发邮件方法 SMTP是发送邮件的协议, ...
- python几行代码识别验证码_Python有多强?文字识别(验证码识别)只需三行代码!...
不要说这都是在借用其它语言的代码,其实这些东西真的无关紧要.何为Python高级语言,黑猫白猫能捉到老鼠的就是好猫!如果真的有那么高冷,那么任何程序你都要敲代码而不用任何模块? 再开个玩笑,要不用0和 ...
- PywebIO 轻松制作一个数据大屏,代码只需100行
今天我给大家分享一个制作数据大屏的工具,非常的好用,100行的Python代码就可以制作出来一个完整的数据大屏,并且代码的逻辑非常容易理解. PywebIO介绍 Python当中的PywebIO模块可 ...
- 只需一个技巧,短视频就可以一键在多个平台同时发布!
越来越多的人开始尝试在上发布自己的内容,但是发布的过程却并不是那么的简单和方便,每个平台都有自己的发布规则和流程,需要用户一个一个地发布,这不仅费时费力,还容易出现错误.这时候,元引擎的功能就变得非常 ...
最新文章
- (DOM艺术) 实用的动画
- 粤桂粤黔谋定现代农业产业园 林裕豪:从玉农业一县一园签约
- Actor-ES框架:Ray--事件(Event)编写说明
- Quartz 定时任务(Scheduler)的 3 种实现方式
- Vjudge 2016-5-10 math test
- translucent 属性
- 实测哈啰电动车A80探索版:一辆带你行走的聪明“小神兽”
- 多目标跟踪(MOT)最新综述,一文快速入门
- 计算机和自动化结合的专业,自动化转计算机?你可以选择这个专业!
- 获取列表的最后一个元素
- 技术文件服务器搭建,搭建文件服务器_mob604756e49326的技术博客_51CTO博客
- 多元统计之因子分析模型及Python分析示例
- 【SQL】字符串去空格解决方法
- 树莓派CM4的6路串口测试
- 外虚内实是什么意思_俗语“五虚令人贫,五实人富贵”是什么意思?有道理吗?...
- The resource identified by this request is only capable of generating respon
- 解锁商业新模式,神奇AR为IP内容“添把火”
- 【云原生】还不会使用linux?快看这里,在window快速安装centos系统
- 视频教程-微信小程序商城15天从零实战课程-微信开发
- 浅谈MOSFET驱动电路