[MM32软件] 【MM32 eMiniBoard测评报告】按键例程适配

[复制链接]
 楼主| 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, 下载次数: 6)
注释已更新

 楼主| gaoyang9992006 发表于 2020-4-21 07:20 | 显示全部楼层
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "led.h"
  4. #include "key.h"
  5. /********************************************************************************************************
  6. **函数信息 :main(void)                       
  7. **功能描述 :
  8. **输入参数 :无
  9. **输出参数 :无
  10. ********************************************************************************************************/
  11. int main(void)
  12. {
  13.     u8 t=0;
  14.    
  15.     delay_init();       
  16.     LED_Init();                                       //初始化与LED连接的硬件接口
  17.     KEY_Init();                      //初始化与按键连接的硬件接口
  18.    
  19.     while(1)
  20.     {
  21.         t=KEY_Scan(0);                    //得到键值

  22.         switch(t)
  23.         {                                 
  24.         case KEY1_PRES:         //K1默认不连PC13,默认连接reset复位按键,所以按下K1会复位
  25.             LED1_TOGGLE();  
  26.             break;
  27.         case KEY2_PRES:
  28.             LED2_TOGGLE();
  29.             break;
  30.         case KEY3_PRES:                               
  31.             LED3_TOGGLE();
  32.             break;
  33.         case KEY4_PRES:                               
  34.             LED4_TOGGLE();
  35.             break;
  36.         default:
  37.             delay_ms(10);       
  38.         }
  39.     }
  40. }



 楼主| gaoyang9992006 发表于 2020-4-21 07:21 | 显示全部楼层
以上是main.h
主要是修改硬件配置
  1. #include "key.h"
  2. #include "delay.h"
  3. //////////////////////////////////////////////////////////////////////////////////         
  4. //开发板
  5. //按键输入 驱动代码                  
  6. //////////////////////////////////////////////////////////////////////////////////         

  7. //按键初始化函数
  8. //PB1、PB2、PB10、PB11对应K1,K2,K3,K4
  9. //K1端口特殊,按下后为高电平,松手为悬空。因此配置上K1,设置为下拉输入,
  10. //K2,K3,K4按下后为低电平,松手为悬空,所以配置上应设置为上拉输入。
  11. void KEY_Init(void)
  12. {
  13.    
  14.     GPIO_InitTypeDef GPIO_InitStructure;
  15.    
  16.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);//使能GPIOB时钟
  17.    
  18.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_10|GPIO_Pin_11;//PB2,PB10,PB11(K2,K3,K4)
  19.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA0设置成上拉输入
  20.     GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10,11

  21.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;//PB1,K1
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB1设置成下输入
  23.     GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.1       
  24. }
  25. //按键处理函数
  26. //返回按键值
  27. //mode:0,不支持连续按;1,支持连续按;
  28. //返回值:
  29. //0,没有任何按键按下
  30. //KEY1_PRES,KEY1按下
  31. //WKUP_PRES,WK_UP按下
  32. //KEY3_PRES,KEY3按下
  33. //KEY4_PRES,KEY4按下
  34. u8 KEY_Scan(u8 mode)
  35. {         
  36.     static u8 key_up=1;//按键按松开标志
  37.     if(mode)key_up=1;  //支持连按                  
  38.     if(key_up&&(KEY1==1||KEY2==0||KEY3==0||KEY4==0))
  39.     {
  40.         delay_ms(10);//去抖动
  41.         key_up=0;
  42.          if(KEY1==1)return KEY1_PRES;
  43.          if(KEY2==0)return KEY2_PRES;
  44.          if(KEY3==0)return KEY3_PRES;
  45.          if(KEY4==0)return KEY4_PRES;
  46.     }else if(KEY1==0&&KEY2==1&&KEY3==1&&KEY4==1)key_up=1;              
  47.     return 0;// 无按键按下
  48. }






 楼主| gaoyang9992006 发表于 2020-4-21 07:22 | 显示全部楼层
  1. #include "led.h"

  2. /********************************************************************************************************
  3. **函数信息 :LED_Init(void)                        
  4. **功能描述 :LED初始化
  5. **输入参数 :无
  6. **输出参数 :无
  7. ********************************************************************************************************/
  8. void LED_Init(void)
  9. {
  10.    
  11.     GPIO_InitTypeDef  GPIO_InitStructure;
  12.    
  13.    
  14.    
  15.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB, ENABLE);  //开启GPIOA,GPIOB时钟
  16.    
  17.    
  18.     GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_15;
  19.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  20.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  21.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  22.    
  23.     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
  24.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  26.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  27.    
  28.     LED1_ON();
  29.     LED2_ON();
  30.     LED3_ON();
  31.     LED4_ON();
  32. }

 楼主| gaoyang9992006 发表于 2020-4-21 07:22 | 显示全部楼层
也就是要将例子中用到的管脚与实际的管脚要对应,模式要符合开发板的实际需求。
 楼主| gaoyang9992006 发表于 2020-4-21 07:23 | 显示全部楼层
备注我没有全部修改,请有选择的看备注,
 楼主| gaoyang9992006 发表于 2020-4-21 07:30 | 显示全部楼层
等我不忙了,修改一下备注重新发
天灵灵地灵灵 发表于 2020-4-22 13:14 | 显示全部楼层
非常NICE的例子。
paotangsan 发表于 2020-5-9 17:16 | 显示全部楼层
非常感谢楼主分享
renzheshengui 发表于 2020-5-9 17:16 | 显示全部楼层
直接拿过来能用吗
wakayi 发表于 2020-5-9 17:17 | 显示全部楼层
程序和哪个板子是匹配的啊
wowu 发表于 2020-5-9 17:17 | 显示全部楼层
非常感谢楼主分享
xiaoqizi 发表于 2020-5-9 17:17 | 显示全部楼层
太好了 我下载去看看
 楼主| gaoyang9992006 发表于 2020-5-9 17:32 | 显示全部楼层
wakayi 发表于 2020-5-9 17:17
程序和哪个板子是匹配的啊

论坛活动送的这个板子是配套的,好像是板子编号是023
 楼主| gaoyang9992006 发表于 2020-5-9 17:32 | 显示全部楼层

是的,直接用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2046

主题

16351

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2046

主题

16351

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部