请各位大神帮我看看为什么在探索者stm32f407里我输入这些代码之后会出现这些问题
本人初学stm32,作为一个大一新生,由于学校未开设C语言课程,因此对于编程知识一知半解,所以我一般通过根据复刻实验例程这种方式来培养自己编写程序的熟练度,但是就是在我试着复刻stm32单片机的独立按键程序的时侯我遇到了困难。
在我用我对程序和C语言的理解对试验例程复刻了之后,我发现我编写出来的程序并不能达到标注例程所能达到的效果,不仅如此,还出现了不知原因的故障,希望各位好心的编程大佬帮我看看我的程序哪里出错了。
由于之前已经复刻过蜂鸣器和跑马灯的程序,所以在独立按键工程里面我将试验例程里的led.h/c和beep.h/c文件拿来直接运用到我自己编写的工程里面,所以问题应该出在我自己编写的key.c/h里面。
下面是标准例程里面的程序:
key.h:
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F407开发板
//按键输入驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2014/5/3
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
#define KEY0 PEin(4) //PE4
#define KEY1 PEin(3) //PE3
#define KEY2 PEin(2) //P32
#define WK_UP PAin(0) //PA0
#define KEY0_PRES 1 //KEY0按下
#define KEY1_PRES 2 //KEY1按下
#define KEY2_PRES 3 //KEY2按下
#define WKUP_PRES 4 //KEY_UP按下(即WK_UP)
void KEY_Init(void); //IO初始化
u8 KEY_Scan(u8); //按键扫描函数
#endif
key.c:
#include "key.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F407开发板
//按键输入驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2014/5/3
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//按键初始化函数
void KEY_Init(void)
{
RCC->AHB1ENR|=1<<0; //使能PORTA时钟
RCC->AHB1ENR|=1<<4; //使能PORTE时钟
GPIO_Set(GPIOE,PIN2|PIN3|PIN4,GPIO_MODE_IN,0,0,GPIO_PUPD_PU); //PE2~4设置上拉输入
GPIO_Set(GPIOA,PIN0,GPIO_MODE_IN,0,0,GPIO_PUPD_PD); //PA0设置为下拉输入
}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下
//4,KEY_UP按下 即WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY_UP!!
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);//去抖动
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==1)return 4;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0;// 无按键按下
}
主程序:#include "sys.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
//ALIENTEK 探索者STM32F407开发板 实验3
//按键输入实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{
u8 key;
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
delay_init(168); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
BEEP_Init(); //初始化蜂鸣器IO
KEY_Init(); //初始化与按键连接的硬件接口
LED0=0; //先点亮红灯
while(1)
{
key=KEY_Scan(1); //得到键值
if(key)
{
switch(key)
{
case WKUP_PRES: //控制蜂鸣器
BEEP=!BEEP;
break;
case KEY2_PRES: //控制LED0翻转
LED0=!LED0;
break;
case KEY1_PRES: //控制LED1翻转
LED1=!LED1;
break;
case KEY0_PRES: //同时控制LED0,LED1翻转
LED0=!LED0;
LED1=!LED1;
break;
}
}else delay_ms(10);
}
}
然后这些就是我自己编写的出问题的工程程序了:
key.h:
#ifndef __KEY_H
#define __KEY_H
#include<sys.h>
#define KEY0 PEin(4)
#define KEY1 PEin(3)
#define KEY2 PEin(2)
#define WK_UP PEin(4)
#define KEY0PRES 1
#define KEY1PRES 2
#define KEY2PRES 3
#define WK_UPPRES 4
void KEY_Init(void);
u8 KEY_Scan(u8);
#endif
key.c
:
#include<key.h>
#include<delay.h>
void KEY_Init(void)
{
RCC->AHB1ENR=1<<0;
RCC->AHB1ENR=1<<4;
GPIO_Set(GPIOE,PIN2|PIN3|PIN4,GPIO_MODE_IN,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_Set(GPIOA,PIN0,GPIO_MODE_IN,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PD);
}
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;
if(mode)
{
key_up=1;
}
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(50);
key_up=0;
if(KEY0==0)
{
return 1;
}
if(KEY1==0)
{
return 2;
}
if(KEY2==0)
{
return 3;
}
if(WK_UP==1)
{
return 4;
}
}
else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)
{
key_up=1;
}
return 0;
}
主程序:
#include<sys.h>
#include<beep.h>
#include<led.h>
#include<key.h>
#include<delay.h>
int main(void)
{
u8 key;
delay_init(168);
LED_Init();
BEEP_Init();
KEY_Init();
LED0=0;
while(1)
{
key=KEY_Scan(0);
if(key)
{
switch(key)
{
case WK_UPPRES:BEEP=!BEEP;break;
case KEY2PRES:LED0=!LED0;break;
case KEY1PRES:LED1=!LED1;break;
case KEY0PRES:LED0=!LED0;LED1=!LED1;break;
}
}
else
{
delay_ms(50);
}
}
}
这套程序不知道什么原因,打开电源之后无论是支持连按还是不支持连按没有一个灯亮起来,按下按键也没有反应,无论是灯还是蜂鸣器都没有变化。在这里我注意到一个小细节,就是在电源键打开和复位键一松手的一瞬间灯闪了一下,我属实很感到莫名其妙不知道为什么啊,希望各位大佬给我解答解答。
在编写这个工程之前我按照自己的印象自己编写出来了一个有反应,但是反应并不是我想要的,程序如下;
key.h:
#ifndef __KEY_H
#define __KEY_H
#include<sys.h>
#define KEY0 PEin(4)
#define KEY1 PEin(3)
#define KEY2 PEin(2)
#define WK_UP PAin(0)
void KEY_Init(void); //
u8 KEY_Scan(u8); //
#endif
key.c:
#include<key.h>
#include<delay.h>
void KEY_Init(void) //
{
RCC->AHB1ENR|=1<<0; //
RCC->AHB1ENR|=1<<4;
GPIO_Set(GPIOE,PIN2|PIN3|PIN4,GPIO_MODE_IN,GPIO_SPEED_100M,GPIO_OTYPE_PP,GPIO_PUPD_PU);//
GPIO_Set(GPIOA,PIN0,GPIO_MODE_IN,GPIO_SPEED_100M,GPIO_OTYPE_PP,GPIO_PUPD_PU);//
}
//
//mode
//
u8 KEY_Scan(u8 mode)
{
static u8 key=1; //
if(mode) //
{
key=1;
}
if(key&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);
key=0;
if(KEY0==0) return 1;
else if(KEY1==0) return 2;
else if(KEY2==0) return 3;
else if(WK_UP==1) return 4;
}
else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)
{
key=1;
}
return 0;
}
主程序:
#include<sys.h>
#include<led.h>
#include<beep.h>
#include<delay.h>
#include<key.h>
int main(void)
{
u8 u;
delay_init(168);//
LED_Init();//
KEY_Init();//
BEEP_Init();//
LED1=0;
while(1)
{
u=KEY_Scan(0);
if(u)
{
switch(u)
{
case 4:BEEP=!BEEP;break;
case 3:LED1=!LED1;break;
case 2:LED0=!LED0;break;
case 1:LED0=!LED0;LED1=!LED1;break;
}
}
else delay_ms(50);
}
}
这个更加离谱,在连按的条件下,我不动,蜂鸣器会响一下停一下重复循环,按键能正常使用。但是在非连按的情况下,蜂鸣器会一直响。按什么按键都不会有反应,懵了二连。
各位大佬有看出我的程序问题出在哪里的嘛,有的话帮忙指出错误好吗,在下谢谢各位了。
新人第一次发帖有点不好看请多多包含