1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
大部分同学在学习STM32时都是通过硬件厂商提供的学习视频(如野火,正点原子等),在观看学习视频后对按键函数有了一个比较初步的了解,但在运用的过程可能会觉得运用起来不能得心应手,下面来分享本人在开发过程中的一些思路。
KEY.H文件 #ifndef _KEY_H #define _KEY_H #include "stm32f4xx.h" //厂商封装好的头文件,M4系列使用 #include "sys.h" //包含对下面的PAin(0)等的宏定义的头文件,同样是厂商封装好的 void KEYPinInit(void); u8 KEYScan1(void); u8 KEYScan2(void); u8 KEYScan3(void); u8 KEYScan4(void); #define KEY1 (PAin(0))//此处要按照自己的单片机原理图修改引脚 #endif 头文件的编写几乎千篇一律,如果对这些代码不太熟悉建议回顾一下基础。 KEY.C文件 关于这个扫描函数的编写主要有两种逻辑,一种是只要按下就触发一次,另一种则是只要按下不松开的情况下是触发多次。关于这两个逻辑的在正点原子的视频里也有介绍,支持连按的版本使用的比较少,所以在这里介绍比较常见的不支持连按的。 #include "KEY.H" static void delay(u32 ms)//u32 == unsigned int { u32 i = 168 * 1000 / 4 * ms; while(i--) { ; } } void KEYPinInit(void) { //管脚工作模式:输入 00 GPIOA->MODER &= ~(0X3 << 0); //上拉/下拉寄存器:00浮空(引脚参考电平由外部电路提供) GPIOA->PUPDR &= ~(0X3 << 0); //读取输入数据寄存器,读到0按键没有按下,读到1按下 } u8 KEYScan1(void) { u8 key = 0;//按键是否按下 static u8 key_up = 1;//按键抬起标志位 if(key_up && !KEY1) //判断按键是否按下 { //按键消抖 delay(10); //再判断按键是否按下 if(!KEY1) key = 1;//按键按下 //按键抬起标志位清0 key_up = 0; } //按键抬起 if(KEY1) key_up = 1; //按键抬起标志位置1 return key; } MAIN函数 这个时候可能就有人会陷入迷惑了,如果只是用简单的IF函数当KEYscan函数返回值为1时触发,这个思路是大家开发时最容易想到的条件判断。但如果只用这个条件来进行判断的话实际产品设计起来比较受限,因为一个按键只能对应一个功能,但我们日常生活中很多消费电子产品比如台灯的话都是通过一个按键,根据按的次数不同来改变功能,下面我来简单介绍一下根据上面这个keyscan扫描函数设计的一个程序,此处以驱动LED灯设计一个简单的程序,按一下亮,按第二下灭。 int main(void) { KEYPinInit();//按键管脚初始化 int pressnum=0; int mode=0; while (1) { if(KEYScan1()) { pressnum=pressnum+1; mode=pressnum%2; if(mode) LED2=0;; else LED2=1; } } } 此处使用了一个pressnum的形参对按键按下的次数进行计数,此处示例时针对两个功能进行设计的,故pressnum对2进行求余,如果为余数1则为触发,余数为2则为不触发。 |
|
|
|
只有小组成员才能发言,加入小组>>
3311 浏览 9 评论
2994 浏览 16 评论
3493 浏览 1 评论
9058 浏览 16 评论
4087 浏览 18 评论
1178浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 02:21 , Processed in 1.186044 second(s), Total 79, Slave 60 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号