打印
[MM32软件]

【MM32 eMiniBoard测评报告】按键例程适配

[复制链接]
744|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaoyang9992006|  楼主 | 2020-4-21 07:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gaoyang9992006 于 2020-4-21 10:52 编辑

官方提供的开发包里面的例子与本开发板不符,另外要注意原理图的按键不能明确看出来内部连接,需要测试。
K1,K2,K3,K4默认悬空,按下后K1连接高电平,K2,K3,K4连接到低电平。所以作为按键使用上模式有区别,首先都要是输入模式,其次
K1,应该配置下拉保证没有按下时候是低电平,其他三个按键要设置为上拉模式,确保按下产生下降沿。
好了,原理图细节分析到此,奉上我修改后的例程工程。
按下K1,点亮或者关闭LED1,……,按下K4,点亮或者关闭LED4
IOKey.zip (523.71 KB)
注释已更新

使用特权

评论回复
沙发
gaoyang9992006|  楼主 | 2020-4-21 07:20 | 只看该作者
#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);       
        }
    }
}



使用特权

评论回复
板凳
gaoyang9992006|  楼主 | 2020-4-21 07:21 | 只看该作者
以上是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;// 无按键按下
}






使用特权

评论回复
地板
gaoyang9992006|  楼主 | 2020-4-21 07:22 | 只看该作者
#include "led.h"

/********************************************************************************************************
**函数信息 :LED_Init(void)                        
**功能描述 :LED初始化
**输入参数 :无
**输出参数 :无
********************************************************************************************************/
void LED_Init(void)
{
   
    GPIO_InitTypeDef  GPIO_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();
}

使用特权

评论回复
5
gaoyang9992006|  楼主 | 2020-4-21 07:22 | 只看该作者
也就是要将例子中用到的管脚与实际的管脚要对应,模式要符合开发板的实际需求。

使用特权

评论回复
6
gaoyang9992006|  楼主 | 2020-4-21 07:23 | 只看该作者
备注我没有全部修改,请有选择的看备注,

使用特权

评论回复
7
gaoyang9992006|  楼主 | 2020-4-21 07:30 | 只看该作者
等我不忙了,修改一下备注重新发

使用特权

评论回复
8
天灵灵地灵灵| | 2020-4-22 13:14 | 只看该作者
非常NICE的例子。

使用特权

评论回复
9
paotangsan| | 2020-5-9 17:16 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
10
renzheshengui| | 2020-5-9 17:16 | 只看该作者
直接拿过来能用吗

使用特权

评论回复
11
wakayi| | 2020-5-9 17:17 | 只看该作者
程序和哪个板子是匹配的啊

使用特权

评论回复
12
wowu| | 2020-5-9 17:17 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
13
xiaoqizi| | 2020-5-9 17:17 | 只看该作者
太好了 我下载去看看

使用特权

评论回复
14
gaoyang9992006|  楼主 | 2020-5-9 17:32 | 只看该作者
wakayi 发表于 2020-5-9 17:17
程序和哪个板子是匹配的啊

论坛活动送的这个板子是配套的,好像是板子编号是023

使用特权

评论回复
15
gaoyang9992006|  楼主 | 2020-5-9 17:32 | 只看该作者

是的,直接用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2005

主题

16118

帖子

213

粉丝