OpenEdv-开源电子网

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

[F1开发板通用] 分享:关于static的用法

[复制链接]

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-14 16:15:51 | 显示全部楼层 |阅读模式
本帖最后由 1208 于 2019-4-17 15:15 编辑

Static申明的局部变量,存储在静态存储区。
它在函数调用结束之后,不会被释放。它的值会一直保留下来。
所以可以说static申明的局部变量,具有记忆功能
1)int getValue(void)
{
  int  flag=0;
  flag++;
  return flag;
}
这个flag每次进来flag=1;

2)int getValue(void)
{
  static int  flag=0;
  flag++;
  return flag;
}
这个flag一直加1往上增,如同阶梯;


3)按键扫描支持连续按 mode=1,
支持连续按
u8 KEY_Scan(void)
    {
      if(KEY按下)
     {
           delay_ms(10);//延时10-20ms,防抖。
           if(KEY确实按下)
            {
               return KEY_Value;
             }
          return 无效值;
     }
    }
按键处于按压状态时,不断执行KEY_Value


4)按键扫描不支持连续按  
mode=0,
不支持连续按
u8 KEY_Scan(void)
    {
     static u8 key_up=1;
      if(key_up &&  KEY按下)
      {
        delay_ms(10);//延时,防抖
        key_up=0;//标记这次key已经按下
        if(KEY确实按下)
          {
           return KEY_VALUE;
          }
        }else if(KEY没有按下)  key_up=1;
       return 没有按下
    }
为什么不支持呢~
必须满足两个条件key up=1和KEY按下
按键才能从key_up=1按键未按下变成处于按下状态key_up=0,
如果这时手不松开的话,还是处于
key_up=0(static申明的局部变量,具有记忆功能)
当手松开时,说明函数已执行完毕

5)mode:0,不支持连续按;1,支持连续按;
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//
按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
{
delay_ms(10);//
去抖动
key_up=0;
if(KEY0==0)return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(WK_UP==1)return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
return 0;//
无按键按下
}
具体用法可以参考:https://blog.csdn.net/keyeagle/article/details/6708077

支持长按,你长按后松开就会翻转;
不支持长按,你长按后松开就不会翻转


先判断io口状态只要是按下为零条件真的,
它是先判断KEY电平满足为0,这个成立等于1
if(1)满足可以输出







业精于勤荒于嬉;行成于思毁于随!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

3

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2018-8-11
在线时间
2 小时
发表于 2018-8-14 16:28:56 | 显示全部楼层
这是C语言里的基本常识,
回复 支持 反对

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14287
金钱
14287
注册时间
2018-8-3
在线时间
1147 小时
发表于 2018-8-14 16:32:21 | 显示全部楼层
翟光 发表于 2018-8-14 16:28
这是C语言里的基本常识,


赞赞赞。。
啊哈~加油!!
回复 支持 反对

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
发表于 2018-8-14 20:35:18 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2018-11-27 17:11:43 | 显示全部楼层
不支持连续按
uint8_t ReadKeyVol(void)
{
        uint8_t key1=0,key2;
        key1=key_scan();
        if(key1!=0)
        {
                Delay_LCD(10);
                key2=key_scan();
                if(key2==key1)
                {
                        return key1;
                }
        }
       
        return 0;
}

uint8_t key_scan(void)
{
        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)
                return 1;
        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==0)
                return 2;
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
                return 3;
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==0)
                return 4;
       
        return 0;
}
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2018-11-27 17:51:08 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

109

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2019-1-29
在线时间
4 小时
发表于 2019-2-20 15:06:15 | 显示全部楼层
谢谢分享!辛苦了
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2019-2-20 15:25:09 | 显示全部楼层

有心了
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2019-2-19
在线时间
74 小时
发表于 2019-2-21 09:12:39 | 显示全部楼层
谢谢分享,,,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 22:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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