OpenEdv-开源电子网

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

按键输入实验有问题?

[复制链接]

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
发表于 2014-6-4 16:22:10 | 显示全部楼层 |阅读模式
5金钱
最近在看原子的战舰板,感觉很好用。现在做到按键输入实验,key.c中有个函数不是很明白
[mw_shl_code=c,true]u8 KEY_Scan(u8 mode) { static u8 key_up=1; if(mode) key_up=1; if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1)) { delay_ms(10); key_up=0; if(KEY0==0) return KEY_RIGHT; else if(KEY1==0) return KEY_DOWN; else if(KEY2==0) return KEY_LEFT; else if(KEY3==1) return KEY_UP; } else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0) key_up=1; return 0; } [/mw_shl_code]
这个函数中,哪里能体现出mode:1支持连按和mode:0不支持连按?
main函数中这样调用,MODE=0;KEY_Scan(MODE).
我是这样理解的:无论MODE为何值,每一次调用,执行到 [mw_shl_code=c,true]if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))[/mw_shl_code] [mw_shl_code=c,true]这一行,key_up总是为1,子函数也没有循环,所以两种模式根本体现不出来,求指教。。。[/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code]

最佳答案

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

static静态局部变量,只会执行一次初始化。
本人新人,各位多包涵!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-6-4 16:22:11 | 显示全部楼层
static静态局部变量,只会执行一次初始化。
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

8

主题

222

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2013-11-21
在线时间
0 小时
发表于 2014-6-4 16:35:23 | 显示全部楼层
当mode等于1 时,每次都执行了key_up = 1;然后才判断哪个按键;
mode等于0时,因为没有按键的时候key_up是等于1 的;然后执行完if判断后,key_up=0了。按键没松开时,key_up一直都是0;
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-4 16:48:25 | 显示全部楼层
回复【2楼】西门吹雪:
--------------------------------
static变量不是每次循环都执行吗?
本人新人,各位多包涵!
回复

使用道具 举报

8

主题

222

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2013-11-21
在线时间
0 小时
发表于 2014-6-4 16:50:31 | 显示全部楼层
回复【3楼】x1213378204:
---------------------------------
那你去看看static的用法了
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-4 16:52:29 | 显示全部楼层
回复【4楼】西门吹雪:
---------------------------------
哈哈,看了,果然是只赋一次初值
本人新人,各位多包涵!
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-4 16:53:05 | 显示全部楼层
回复【5楼】Admin:
---------------------------------
恩恩,果然是。
初学编程,好多不懂得!
本人新人,各位多包涵!
回复

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
发表于 2014-6-4 16:54:13 | 显示全部楼层
是不是不知道static的作用 
用 static 修饰的局部变量 只会初始化一次 
比如
int test()
{
    static int a=2;
    int b=3;
    a++;
    b++;
    rutern a+b;
}

int main()
{
     int c;
     c=test();
     printf("FIRST c=%d",c);
     c=test();
    printf("SECONG c=%d",c);
    return 0;
}
运行结果将会是 
FIRST c=6;
SECOND c=7;(a只初始化一次 第二次调用时 a++为4 b++依然是3)
我是一只摔不死的蚂蚁!
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-4 16:54:48 | 显示全部楼层
回复【8楼】_tank_:
---------------------------------
恩恩,刚才查了资料,现在懂了,哈哈
本人新人,各位多包涵!
回复

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
发表于 2014-6-4 16:55:39 | 显示全部楼层
我发现我太慢了啊
我是一只摔不死的蚂蚁!
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-4 17:11:40 | 显示全部楼层
回复【10楼】_tank_:
---------------------------------
哈哈,比我快!!
我还有个问题请教!
main函数调用其他.c文件中函数的过程是怎么的?
本人新人,各位多包涵!
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-4 17:14:16 | 显示全部楼层
回复【10楼】_tank_:
---------------------------------
虽然main函数中和.c文件中都有.h声明,但是main怎么知道.c在哪的?
本人新人,各位多包涵!
回复

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
发表于 2014-6-4 22:34:53 | 显示全部楼层
回复【12楼】x1213378204:
---------------------------------
我没有明确的查过相关资料哈 谈一下我的理解

一般我们会把我们的程序分成很多模块 比如原子的例程中 有LED.c     KEY.c    BEEP.c等等 
你同时应该会发现 每个.c文件都会有一个相同名字的.h文件  在这个.h文件里会有.c文件的 函数声明和变量声明 (以及头文件的调用)
然后当我们在main.c中添加#include"xxxx.h" 就可以调用相应.c文件中的函数 因为.h文件中已经做了声明 

所以.h文件其实就是做的一个中间桥梁的作用 连接两个文件 方便调用相应函数 变量(这句话是核心观点) 

另外.h文件的名字一定要与相应.c相同吗 不一定 
但是只有相同了 我们才能在main.c中清楚知道想要调用哪个.c中的函数 就直接把相应.h头文件条件进来就可以 (这是名字相同的好处)

这是.h文件的作用
我是一只摔不死的蚂蚁!
回复

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
发表于 2014-6-4 22:53:16 | 显示全部楼层
回复【12楼】x1213378204:
---------------------------------
另外还有一点 你说为什么main函数中和.c文件中都有.h声明
main.c中调用.h 我上一个回复说了 
.c中添加了相同的.h 有两个好处  
比如LED.c中调用led.h
1、因为led.h中添加了#include"stm32f10x.h"    stm32f10x.h中又有#include"stm32f10x_conf.h"   
 stm32f10x_conf.h中又有#inlcude"stm32f10x_gpio.h" 所以你才能使用 库函数中的GPIO的相关函数 
总之一句话 .h文件可以嵌套调用 且不会出现重复定义 因为.h中只是声明  声明多少次都没有关系 
这样 同名的.c添加同名的.h 看起来也更有条理 
2、如果在XXX.c中你定义了一个函数
void test()
{
    ……
    fun();
    ……
}
如果fun()这个函数是在test()之后定义的  那么你必须在test()定义之前声明void fun(void);   
此时因为我们有添加XXX.h的头文件 在这个头文件中有fun()的声明 所以省去.c中的声明

这就是我的一些理解
我是一只摔不死的蚂蚁!
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-5 09:22:48 | 显示全部楼层
回复【14楼】_tank_:
---------------------------------
//文件名:ss.c
#include <stdio.h>
#include <stdlib.h>
#include "les.h"
int main()
{
float i,j,nu;
scanf("%f %f",&i,&j);
nu=sum(i,j);
printf("log%.1f,%.1f = %.1f\n",i,j,nu);
system("pause");
return 0;
}


//文件名:les.c
#include "math.h"
#include "les.h"
 float sum(float x,float y)
{
float s;
s=log(y)/log(x);
return s;
}

//文件名:les.h
#ifndef __les_h
#define __les_h
float sum(float x,float y);
#endif

在VC环境运行,为什么会连接错误呢?
这三个文件在同一个目录下。
本人新人,各位多包涵!
回复

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
发表于 2014-6-5 12:10:43 | 显示全部楼层
回复【15楼】x1213378204:
---------------------------------
没有配置头文件路径吗
我是一只摔不死的蚂蚁!
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-5 13:03:05 | 显示全部楼层
回复【16楼】_tank_:
---------------------------------
VC环境也要配置吗?
本人新人,各位多包涵!
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-5 13:07:16 | 显示全部楼层
回复【16楼】_tank_:
---------------------------------
路径配置了,还是不行,不知道什么原因
本人新人,各位多包涵!
回复

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
发表于 2014-6-5 20:42:28 | 显示全部楼层
回复【18楼】x1213378204:
---------------------------------
这我就不清楚了 VC不是怎么懂 去发个新帖问问
我是一只摔不死的蚂蚁!
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-8-13
在线时间
0 小时
发表于 2014-8-13 14:25:49 | 显示全部楼层
回复【2楼】西门吹雪:
---------------------------------
那么请问主程序一开始就让mode=0,可是在KEY_SCAN 函数中并不能反应出不支持连续按这一特点啊 我知道局部静态变量的作用 可是对于第一次执行key.c程序 那Mode=0 跟MODE=1 又有什么区别呢 总归一开始key_up=1 然后之后才会被赋值0 并不会再被初始化 那么Mode的出现就没有意义了 
实在觉得这程序不对劲 急求答复
回复

使用道具 举报

8

主题

222

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2013-11-21
在线时间
0 小时
发表于 2014-8-13 14:46:18 | 显示全部楼层
回复【20楼】初成长:
---------------------------------
如果mode =0 的话 ,第一次扫描按键时,就把key_up置0 了,那么下次就进入不了按键判断了
回复

使用道具 举报

28

主题

303

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2014-8-14
在线时间
67 小时
发表于 2015-3-31 19:54:19 | 显示全部楼层
回复【8楼】_tank_:
---------------------------------
6666666666666666
这个世界上还有很多很多的人,但你不认识他们,他们也不属于你的世界。这个世界上还有很多好吃的好玩的好看的东西,可真正属于你的世界其实是很小的,只是你去过的地方吃过的东西和见过的落日,还有会在乎你死活的朋友。”——《龙族》
回复

使用道具 举报

28

主题

303

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2014-8-14
在线时间
67 小时
发表于 2015-3-31 20:28:01 | 显示全部楼层
回复【8楼】_tank_:
---------------------------------
大哥  是第一次  是  7  第二次 是8  
害我苦苦探索呀  恩恩
这个世界上还有很多很多的人,但你不认识他们,他们也不属于你的世界。这个世界上还有很多好吃的好玩的好看的东西,可真正属于你的世界其实是很小的,只是你去过的地方吃过的东西和见过的落日,还有会在乎你死活的朋友。”——《龙族》
回复

使用道具 举报

28

主题

303

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2014-8-14
在线时间
67 小时
发表于 2015-3-31 20:39:26 | 显示全部楼层
回复【21楼】西门吹雪:
---------------------------------
正解
这个世界上还有很多很多的人,但你不认识他们,他们也不属于你的世界。这个世界上还有很多好吃的好玩的好看的东西,可真正属于你的世界其实是很小的,只是你去过的地方吃过的东西和见过的落日,还有会在乎你死活的朋友。”——《龙族》
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-4-11
在线时间
4 小时
发表于 2017-8-4 15:46:06 | 显示全部楼层
_tank_ 发表于 2014-6-4 16:54
是不是不知道static的作用&nbsp;
用&nbsp;static&nbsp;修饰的局部变量&nbsp;只会初始化一次&nbsp;
比如
int ...

不对吧,带哥。第二次调用时a++为4,b依然是3吧
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-4-11
在线时间
4 小时
发表于 2017-8-4 16:05:02 | 显示全部楼层
西门吹雪 发表于 2014-8-13 14:46
回复【20楼】初成长:
---------------------------------
如果mode&nbsp;=0&nbsp;的话&nbsp;,第一次扫描按 ...

当你松开按键的那个时刻,key_up就又变为1了
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2015-4-11
在线时间
4 小时
发表于 2017-8-4 16:07:58 | 显示全部楼层
初成长 发表于 2014-8-13 14:25
**** 作者被禁止或删除 内容自动屏蔽 ****

只要不松开按键,key_up一直就是0
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-20 05:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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