【MM32 eMiniBoard测评报告】按键例程适配
本帖最后由 gaoyang9992006 于 2020-4-21 10:52 编辑官方提供的开发包里面的例子与本开发板不符,另外要注意原理图的按键不能明确看出来内部连接,需要测试。
K1,K2,K3,K4默认悬空,按下后K1连接高电平,K2,K3,K4连接到低电平。所以作为按键使用上模式有区别,首先都要是输入模式,其次
K1,应该配置下拉保证没有按下时候是低电平,其他三个按键要设置为上拉模式,确保按下产生下降沿。
好了,原理图细节分析到此,奉上我修改后的例程工程。
按下K1,点亮或者关闭LED1,……,按下K4,点亮或者关闭LED4
注释已更新
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "key.h"
/********************************************************************************************************
**函数信息 :main(void)
**功能描述 :
**输入参数 :无
**输出参数 :无
********************************************************************************************************/
int main(void)
{
u8 t=0;
delay_init();
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
while(1)
{
t=KEY_Scan(0); //得到键值
switch(t)
{
case KEY1_PRES: //K1默认不连PC13,默认连接reset复位按键,所以按下K1会复位
LED1_TOGGLE();
break;
case KEY2_PRES:
LED2_TOGGLE();
break;
case KEY3_PRES:
LED3_TOGGLE();
break;
case KEY4_PRES:
LED4_TOGGLE();
break;
default:
delay_ms(10);
}
}
}
以上是main.h
主要是修改硬件配置
#include "key.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//开发板
//按键输入 驱动代码
//////////////////////////////////////////////////////////////////////////////////
//按键初始化函数
//PB1、PB2、PB10、PB11对应K1,K2,K3,K4
//K1端口特殊,按下后为高电平,松手为悬空。因此配置上K1,设置为下拉输入,
//K2,K3,K4按下后为低电平,松手为悬空,所以配置上应设置为上拉输入。
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);//使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_2|GPIO_Pin_10|GPIO_Pin_11;//PB2,PB10,PB11(K2,K3,K4)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA0设置成上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10,11
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_1;//PB1,K1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB1设置成下输入
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.1
}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//返回值:
//0,没有任何按键按下
//KEY1_PRES,KEY1按下
//WKUP_PRES,WK_UP按下
//KEY3_PRES,KEY3按下
//KEY4_PRES,KEY4按下
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键按松开标志
if(mode)key_up=1;//支持连按
if(key_up&&(KEY1==1||KEY2==0||KEY3==0||KEY4==0))
{
delay_ms(10);//去抖动
key_up=0;
if(KEY1==1)return KEY1_PRES;
if(KEY2==0)return KEY2_PRES;
if(KEY3==0)return KEY3_PRES;
if(KEY4==0)return KEY4_PRES;
}else if(KEY1==0&&KEY2==1&&KEY3==1&&KEY4==1)key_up=1;
return 0;// 无按键按下
}
#include "led.h"
/********************************************************************************************************
**函数信息 :LED_Init(void)
**功能描述 :LED初始化
**输入参数 :无
**输出参数 :无
********************************************************************************************************/
void LED_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB, ENABLE);//开启GPIOA,GPIOB时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
LED1_ON();
LED2_ON();
LED3_ON();
LED4_ON();
}
也就是要将例子中用到的管脚与实际的管脚要对应,模式要符合开发板的实际需求。 备注我没有全部修改,请有选择的看备注, 等我不忙了,修改一下备注重新发 非常NICE的例子。 非常感谢楼主分享 直接拿过来能用吗 程序和哪个板子是匹配的啊 非常感谢楼主分享 太好了 我下载去看看 wakayi 发表于 2020-5-9 17:17
程序和哪个板子是匹配的啊
论坛活动送的这个板子是配套的,好像是板子编号是023 renzheshengui 发表于 2020-5-9 17:16
直接拿过来能用吗
是的,直接用。
页:
[1]