5 进阶任务:按键控制_第1页
5 进阶任务:按键控制_第2页
5 进阶任务:按键控制_第3页
5 进阶任务:按键控制_第4页
5 进阶任务:按键控制_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2 进阶任务:按键控制1教学目标掌握基于库函数的程序开发方式掌握硬件抽象层的设计思想和实现方法了解库函数的设计思想2进阶任务1任务目标掌握CubeMX软件配置GPIO外设的方法2任务内容GPIO采用轮询方式检测某开发板(MCU为STM32F407ZET6)上有4个按键:KEY0(RightKey)、KEY1(DownKey)、KEY2(LeftKey)和WK_UP(UpKey),分别连接到PE4、PE3、PE2、PA0上,电路原理如图2-14所示。编写按键检测程序,输出每个按键按下的次数。进阶任务:按键控制3按键电路按键按下,引脚读到低电平按键释放,引脚读到高电平上拉式按键(Key0~Key2)GPIO4按键按下,引脚读到高电平按键释放,引脚读到低电平下拉式按键(KEY_UP)按键波形GPIO前沿抖动5~10ms后沿抖动5~10ms按键抖动问题按键的机械特性造成按键的抖动真正的有效按键时间按键的抖动会导致一次按键动作被当成多次按键,为确保MCU对按键的一次闭合仅作一次处理,必须消除按键的抖动,在按键处于稳定状态时读取按键的状态。整个按键周期零点几秒到几秒5按键消抖GPIO硬件消抖,①

检测出按键闭合后执行延时程序,延时时间为5ms~10ms,用于去掉前沿抖动;②

再次检测按键状态,如果保持闭合状态才认为按下,并执行相应的按键任务;③

按键的释放可以采用延时或者循环检测的方式去掉后沿抖动;软件消抖利用RC低通滤波器滤掉抖动两种按键消抖方法6--

南昌大学“卓越”辅导员培养工程建设GPIO小贴士对于同一个应用电路的不同任务而言,目标选择、时钟配置和工程配置等步骤的设置都是相同,因此后续的任务实现步骤中将重点介绍引脚分配、外设配置以及程序编写等步骤。1.

目标选择2.

引脚分配3.

外设配置4.

时钟配置5.

工程配置6.

程序编写7引脚分配GPIO步骤二:引脚分配8四个按键UpKey(WK_UP)、LeftKey(Key2)、DownKey(Key1)及RigthKey(Key0)引脚分配、上拉模式、GPIOmode分配如图所示。外设配置GPIO步骤三:USART1外设配置9①②③④⑤⑥⑦10编写程序GPIO由CubeMX生成的基础工程如下,在MDK-ARM的同级目录下创建KEY文件夹,在KEY文件夹下新建Key.h和Key.c文件。步骤六:程序编写11Key.h文件代码如下:#ifndef__KEY_H#define__KEY_H#include

"main.h"#defineUpKeyHAL_GPIO_ReadPin(UpKey_GPIO_Port,UpKey_Pin)//UpKey#defineDownKeyHAL_GPIO_ReadPin(DownKey_GPIO_Port,DownKey_Pin)//DownKey#defineLeftKeyHAL_GPIO_ReadPin(LeftKey_GPIO_Port,LeftKey_Pin)//LeftKey#defineRightKeyHAL_GPIO_ReadPin(RightKey_GPIO_Port,RightKey_Pin)//RightKey#defineUpKey_OnGPIO_PIN_SET#defineUpKey_OffGPIO_PIN_RESET#defineDownKey_OnGPIO_PIN_RESET#defineDownKey_OffGPIO_PIN_SET#defineLeftKey_OnGPIO_PIN_RESET#defineLeftKey_OffGPIO_PIN_SET#defineRightKey_OnGPIO_PIN_RESET#defineRightKey_OffGPIO_PIN_SET#defineUpKeyRet1#defineDownKeyRet2#defineLeftKeyRet3#defineRightKeyRet4uint8_tKEY_Scan(uint8_tmode);//mode=0,不支持连按按键,mode=1,支持连续按键#endif12Key.c文件,代码如下:#include

"key.h"uint8_tKEY_Scan(uint8_tmode){staticuint8_tkey_up=1;//按键松开标志if(mode==1)key_up=1;if(key_up&&((UpKey==UpKey_On)||(DownKey==DownKey_On)||(LeftKey==LeftKey_On)||(RightKey==RightKey_On))){HAL_Delay(10);key_up=0;if(UpKey==UpKey_On)returnUpKeyRet;else

if(DownKey==DownKey_On)returnDownKeyRet;else

if(LeftKey==LeftKey_On)returnLeftKeyRet;else

if(RightKey==RightKey_On)returnRightKeyRet;}else

if((UpKey==UpKey_Off)&&(DownKey==DownKey_Off)&&(LeftKey==LeftKey_Off)&&(RightKey==RightKey_Off))key_up=1;return0;}13添加组GPIO按“F2”编辑右击14配置编译包含文件GPIO单击

,在弹出的菜单中,选择C/C++标签页,单击“IncludePath”栏后“…”,15编写程序GPIO(1)打开usart.h,添加如下头文件。/*USERCODEBEGINIncludes*/#include

"stdio.h"/*USERCODEENDIncludes*/(2)打开usart.c,添加如下代码。/*USERCODEBEGIN0*/intfputc(intch,FILE*fp){HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,HAL_MAX_DELAY);

returnch;}/*USERCODEEND0*/16编写程序GPIO打开main.c文件,在对应位置输入如下代码:/*USERCODEBEGINIncludes*/#include

"key.h"/*USERCODEENDIncludes*//*USERCODEBEGINPV*/uint8_tkeyval=0;uint16_tUpCnt=0;uint16_tDownCnt=0;uint16_tLeftCnt=0;uint16_tRightCnt=0;/*USERCODEENDPV*/

/*USERCODEBEGIN3*/keyval=KEY_Scan(0);switch(keyval){caseUpKeyRet:UpCnt++;printf("UpKeyPressed%dTimers\r\n",UpCnt);break;caseDownKeyRet:DownCnt++;printf("DownKeyPressed%dTimers\r\n",DownCnt);break;caseLeftKeyRet:LeftCnt++;printf("LeftKeyPressed%dTimers\r\n",LeftCnt);break;caseRightKeyRet:RightCnt++;printf("RightKeyPressed%dTimers\r\n",RightCnt);break;default: break;}HAL_Delay(200);

}

/*USERCODEEND3*/17编译程序GPIO将程序编译链接,生成可执行代码,通过ST-Link仿真器下载到开发板(MCU为STM32F407ZET6),可观察到:四个按键各自每按下一次,对应的计数器加1(没有多加,去抖动成功),如图所示,达到设计预期效果。3 挑战任务:8只LED的流水灯设计18挑战任务1任务目标掌握CubeMX软件配置GPIO外设的方法2任务内容GPIO控制STM32F407ZGT6连接的8只LED灯实现花样显示。198只LED灯由引脚PC0~PC7控制,PC0~PC7输出高电平,熄灭对应的LED灯,输出低电平,点亮对应的LED灯。20仿真电路GPIO21GPIOCubeMX配置1.

目标选择2.

引脚分配3.

外设配置4.

时钟配置5.

工程配置6.

程序编写--

南昌大学“卓越”辅导员培养工程建设GPIO程序设计22生成MDK工程后,进行应用程序的编写。这里我们将main函数呈现给大家。1/*USERCODEENDHeader*/2/*Includes-------------------------------------------*/3#include

"main.h"4#include

"gpio.h"5/*Privateincludes-----------------------------------*/6/*Privatefunctionprototypes-------------------------*/7/*USERCODEBEGINPFP*/8voidLed_Flower_L2R_move(void);9voidLed_Flower_R2L_move(void);10voidLed_Flower_LR2M_move(void);11/*USERCODEENDPFP*/12/*Privateusercode----------------------------------*/13intmain(void)14{15HAL_Init();16/*USERCODEBEGINInit*/1718/*USERCODEENDInit*/19/*Configurethesystemclock*/20SystemClock_Config();21/*USERCODEBEGINSysInit*/2223/*USERCODEENDSysInit*/24/*Initializeallconfiguredperipherals*/25MX_GPIO_Init();26/*USERCODEBEGIN2*/2728/*USERCODEEND2*/29/*Infiniteloop*/30/*USERCODEBEGINWHILE*/31/*USERCODEBEGINWHILE*/32while(1)33{34/*USERCODEENDWHILE*/35/*USERCODEBEGIN3*/36 Led_Flower_L2R_move();37 HAL_Delay(100);38 Led_Flower_R2L_move();2339 HAL_Delay(100);40 Led_Flower_LR2M_move();41 HAL_Delay(100);42}43/*USERCODEEND3*/44}4546/*USERCODEBEGIN4*/47voidLed_Flower_L2R_move(void)48{49 uint16_ttemp;50 uint8_ti;51 temp=0x100;52 for(i=1;i<=8;i++)53 { HAL_GPIO_WritePin(GPIOC,0xff,GPIO_PIN_SET);54 HAL_GPIO_WritePin(GPIOC,temp>>i,GPIO_PIN_RESET);55 HAL_Delay(10);//200ms56 }5758}59voidLed_Flower_R2L_move(void)60{61 uint16_ttemp;62 uint8_ti;63 temp=0x01;64for(i=1;i<=8;i++)65{66 HAL_GPIO_WritePin(GPIOC,0xff,GPIO_PIN_SET);67 HAL_GPIO_WritePin(GPIOC,temp<<(i-1),GPIO_PIN_RESET);68 HAL_Delay(10);//200ms69}707172}2473voidLed_Flower_LR2M_move(void)74{75 uint16_ttemp,temp1;76 uint8_ti;77 temp=0x01;78 temp1=0x100;79for(i=1;i<=8;i++)80{81 HAL_GPIO_WritePin(GPIOC,0xff,GPIO_PIN_SET);82 HAL_GPIO_WritePin(GPIOC,(temp1>>i)|(temp<<(i-1)),GPIO_PIN_RESET);83 HAL_Delay(10);//200ms84}85} 86/*USERCODEEND4*/GPIO程序设计生成MDK工程后,进行应用程序的编写。这里我们将main函数呈现给大家。25GPIO运行效果将程序编译连接,生成可执行代码,下载程序到最小系统,搭建好8只LED灯与MCU的连接电

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论