OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3759|回复: 8

按键实验中遇到MDK编译不过的问题

[复制链接]

3

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
金钱
371
注册时间
2015-6-23
在线时间
112 小时
发表于 2015-9-19 09:09:52 | 显示全部楼层 |阅读模式
5金钱

大家好,我没有学过C,只是从51AVR走到STM32

我在做按键实验时候,遇到了一个不明白的问题,向大家请教。

我根据教程,做了全固件库版的和位带版的按键实验,很顺利,在做寄存器版时候,同样的按键扫描函数就是编译不过去,现象如下图:

问题出在下面这句代码中,报错在最后一个小括号,我用红色标记了。

if(key_up && (KEY0_GET()==0 || KEY1_GET() ==0 || KEY2_GET() ==0 || WK_UP_GET()==1))

{

}

如果去掉这个右括的小括号,编译就能通过了,


如果这样,小括号就不匹配了,不知知道为什么?
由于无法将截图附上,说的不是很明白。


最佳答案

查看完整内容[请看2#楼]

请楼主仔细啊: #define KEY0 (1<<4)    //定义按键0端口  E4 #define KEY1 (1<<3)    //定义按键1端口  E3 #define KEY2 (1<<2)    //定义按键2端口  E2 #define WK_UP (1<<0))  //定义按键3端口(WK_UP)  A0 这里多了个括号呢。。。   #define WK_UP (1<<0)  //定义按键3端口(WK_UP)  A0
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2015-9-19 09:09:53 | 显示全部楼层
请楼主仔细啊:

#define KEY0 (1<<4)    //定义按键0端口  E4
#define KEY1 (1<<3)    //定义按键1端口  E3
#define KEY2 (1<<2)    //定义按键2端口  E2
#define WK_UP (1<<0))  //定义按键3端口(WK_UP)  A0

这里多了个括号呢。。。
 
#define WK_UP (1<<0)  //定义按键3端口(WK_UP)  A0

我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-9-19 11:50:32 | 显示全部楼层
把if语句拆分几次多测试几下看有没有问题,慢慢找原因

你说的红色标记在哪,为什么不能将截图附上,这些可能是问题的线索所在
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

12

主题

336

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1576
金钱
1576
注册时间
2015-8-9
在线时间
625 小时
发表于 2015-9-19 14:41:11 | 显示全部楼层
建议楼主把程序截图下来,直眼看过去不知道你说的红点在哪
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2015-9-19 16:57:20 | 显示全部楼层
请贴出完整代码
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

3

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
金钱
371
注册时间
2015-6-23
在线时间
112 小时
 楼主| 发表于 2015-9-20 11:20:05 | 显示全部楼层

这是第一张截图,在if语句最后面有一点点红色波浪线。


下面是我按要求去掉小括号后的截图,并进行了编译,能通过,因为程序没有写完,没有上机实验。
这是key.h文件内容
/*
日期:2015/08/30
作者:dengming
功能:初始化按键
*/

#ifndef __KEY_H
#define __KEY_H

#include "stm32f10x.h"

#define KEY0 (1<<4)    //定义按键0端口  E4
#define KEY1 (1<<3)    //定义按键1端口  E3
#define KEY2 (1<<2)    //定义按键2端口  E2
#define WK_UP (1<<0))  //定义按键3端口(WK_UP)  A0

#define KEY0_PRES 1   //定义按键0键值
#define KEY1_PRES 2   //定义按键1键值
#define KEY2_PRES 3   //定义按键2键值
#define WKUP_PRES 4   //定义按键3键值

#define KEY0_GET()  ((GPIOE->IDR & (KEY0)) ? 1 : 0)     //读取按键0  E4
#define KEY1_GET()  ((GPIOE->IDR & (KEY1)) ? 1 : 0)     //读取按键1  E3
#define KEY2_GET()  ((GPIOE->IDR & (KEY2)) ? 1 : 0)     //读取按键2  E2
#define WK_UP_GET() ((GPIOA->IDR & (WK_UP)) ? 1 : 0)    //读取按键3(WK_UP)  A0

void KEY_Init(void);  //按键初始化函数
u8 KEY_Scan(u8);      //按键扫描函数

#endif

下面是key.c文件
/*
日期:2015/08/31
作者:dengming
功能:用寄存器完成按键驱动
连接:KEY0--PE4  --GND
         KEY1--PE3  --GND
         KEY2--PE2  __GND
         WK UP--PA0  --VCC
*/

#include "stm32f10x.h"
#include "key.h"
#include "delay.h"

//按键初始化函数
void KEY_Init()
{
RCC->APB2ENR |= 1<<2;           //使能PA端口时钟
RCC->APB2ENR |= 1<<6;           //使能PE端口时钟

GPIOA->CRL &= 0xFFFFFFF0;       //清PA0端口原来设置
GPIOA->CRL |= 0x00000008;        //设置PA0端口为带输入默认下拉

GPIOE->CRL &= 0xFFF0000FF;       //清PE2、3、4端口原来设置
GPIOE->CRL |= 0x000888800;        //设置PE2、3、4端口为带上拉下拉输入
GPIOE->ODR |= 7<<2;                 //设置PE2、3、4端口为上拉
}

//按键处理函数,返回键值
/* 定义一个入口参数为:mode 其值为 0 时不支持连续按,为 1 时支持连续按
   返回键值:  0   没有按键按下
               1   KEY0按下 
               2   KEY1按下
               3   KEY2按下 
               4   KEY3(WK UP)按下
   各键优先级: KEY0 > KEY1 > KEY2 > KEY3 
*/
u8 KEY_Scan(u8 mode)
{
static u8 key_up = 1;                                            //定义一个静态变量记忆往次按键状态
if(mode) key_up = 1;                                            //区分是否支持连续按

if(key_up && (KEY0_GET()==0 || KEY1_GET() ==0 || KEY2_GET() ==0 || WK_UP_GET()==1)
{
}

/*
if(key_up  && (KEY0_GET()==0 || KEY1_GET()==0 || KEY2_GET()==0 || WK_UP_GET()==1))       //判断是否有按键按下
{
delay_ms(10);                                                                   //延时消抖

if(KEY0_GET() == 0) return KEY0_PRES;                                //按键0按下,返回键值1
else if(KEY1_GET() == 0) return KEY1_PRES;                          //按键1按下,返回键值2
else if(KEY2_GET() == 0) return KEY2_PRES;                          //按键2按下,返回键值3
else if(WK_UP_GET() == 1) return WKUP_PRES;                     //按键3按下,返回键值4
key_up = 0;                                                                      //有按键按下,标记位置0
}
else if(KEY0_GET()==1 && KEY1_GET()==1 && KEY2_GET()==1 && WK_UP_GET()==0) key_up = 1;   //没有按键按下标记位置1
return 0;                                                                          //没有按键按下,返回0
*/
}
注释掉的是按钮扫描代码,因为if语句编译不过,将其注释掉,单独实验if语句。

回复

使用道具 举报

3

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
金钱
371
注册时间
2015-6-23
在线时间
112 小时
 楼主| 发表于 2015-9-20 11:23:34 | 显示全部楼层
这是第二张截图,我去掉了红色波浪线处的小括号后进行编译,能通过,因为程序没有写完,没有上机实验。

回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2015-9-20 16:45:08 | 显示全部楼层
我把按键实验宏定义修改为:
#define KEY0_GET() PEin(4) //PE4
#define KEY1_GET() PEin(3) //PE3 
#define KEY2_GET()  PEin(2) //PE2
#define WK_UP_GET()  PAin(0) //PA0  WK_UP即KEY_UP

代码里面用:
if(key_up&&(KEY0_GET()==0||KEY1_GET()==0||KEY2_GET()==0||WK_UP_GET()==1))
没有发现问题啊
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

3

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
金钱
371
注册时间
2015-6-23
在线时间
112 小时
 楼主| 发表于 2015-9-20 17:00:45 | 显示全部楼层
如果用位带操作,就不是纯寄存器版了,这个在位带操作时候实验用了。 谢谢老师帮我查出端口定义问题,我将到电脑上再实验,以后遇到问题一定看远点,不能总在一个地方找。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 21:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表