J1anbean 发表于 2023-5-5 16:25

<p>好的哈&nbsp; 我是看国民官方历程照着加个按键控制 还没学到状态机</p>

J1anbean 发表于 2023-5-5 16:28

<p></p>

<p>这段代码是按键控制LED1的亮灭,也是按键没反应,上电瞬间按下按键才有反应,上电后再次按下led的状态不变的&nbsp;</p>

lugl4313820 发表于 2023-5-5 16:33

J1anbean 发表于 2023-5-5 16:28
这段代码是按键控制LED1的亮灭,也是按键没反应,上电瞬间按下按键才有反应,上电后再次按下led的状态 ...

<p>你那个delay这样写不行的。按键检测不能这么写死的。特别是消抖的应用,一定要有状态机的思维来写。晚上我回去给你写个demo吧,主要我还没有写到中断的作业,到时录个视频。这样就容易接受一些。</p>

lugl4313820 发表于 2023-5-5 16:59

<p>我这里用状态机写大概写了一下检测的伪代码,你可以根据这样的思路写一下:</p>

<p>按键检测:</p>

<p>//假设 按键是上拉输入</p>

<p>#define 按下 0</p>

<p>#define 抬起 1</p>

<p>#define 消抖时间 10毫秒</p>

<p>typedef enum_按键状态{</p>

<p>抬起状态,</p>

<p>消抖状态,</p>

<p>按下状态,</p>

<p>};</p>

<p>&nbsp;</p>

<p>int 按键检测(void)</p>

<p>{</p>

<p>static int 按键状态=抬起;</p>

<p>int 按键值;</p>

<p>static int 消抖计时=0;</p>

<p>if( 按键值 == 按下) //说明按键按下了</p>

<p>if ((按键状态 == 抬起装态)&amp;&amp; (消抖计时&lt;消抖时间))</p>

<p>按键状态 = 消抖状态</p>

<p>计时开始</p>

<p>else if ((按键状态 == 消抖状态)&amp;&amp; (消抖计时&gt;=消抖时间))</p>

<p>按键状态 = 按下状态</p>

<p>else if (( 按键值 == 抬起) &amp;&amp; (按键状态 == 消抖状态)&amp;&amp;(消抖计时&lt;消抖时间))</p>

<p>按键状态 = 消抖状态</p>

<p>else</p>

<p>按键装态 = 抬起状态;</p>

<p>消抖计时 停止;</p>

<p>消抖计时=0</p>

<p>}</p>

<p>&nbsp;</p>

<p>main</p>

<p>{</p>

<p>while(1)</p>

<p>{</p>

<p>if 开始计时</p>

<p>消抖计时++</p>

<p>else</p>

<p>消抖计时 = 0;</p>

<p>if 按键状态 == 按下状态</p>

<p>做什么</p>

<p>else if 按键状态 == 抬起状态</p>

<p>按什么</p>

<p>&nbsp;</p>

<p>//while里面最好不要加过多的延时</p>

<p>}</p>

<p>}</p>

<p><br />
&nbsp;</p>

lugl4313820 发表于 2023-5-5 17:00

<pre>
<code>按键检测:
//假设 按键是上拉输入
#define 按下   0
#define 抬起   1
#define 消抖时间 10毫秒
typedef enum_按键状态{
    抬起状态,
    消抖状态,
    按下状态,
};

int   按键检测(void)
{
    static int 按键状态=抬起;
    int 按键值;
    static int 消抖计时=0;
    if( 按键值 == 按下)   //说明按键按下了
      if ((按键状态 == 抬起装态)&amp;&amp; (消抖计时&lt;消抖时间))
            按键状态 = 消抖状态
            计时开始
      else if ((按键状态 == 消抖状态)&amp;&amp; (消抖计时&gt;=消抖时间))
            按键状态 = 按下状态
    else if(( 按键值 == 抬起)&amp;&amp;(按键状态 == 消抖状态)&amp;&amp;(消抖计时&lt;消抖时间))
      按键状态 = 消抖状态
    else
      按键装态 = 抬起状态;
      消抖计时 停止;
      消抖计时=0
}

main
{
    while(1)
    {
      if 开始计时
         消抖计时++
      else
         消抖计时 = 0;
      if 按键状态 == 按下状态
         做什么
      else if 按键状态 == 抬起状态
         按什么

         //while里面最好不要加过多的延时
         
    }
}


    </code></pre>

<p>&nbsp;</p>

lugl4313820 发表于 2023-5-5 17:09

J1anbean 发表于 2023-5-5 16:28
这段代码是按键控制LED1的亮灭,也是按键没反应,上电瞬间按下按键才有反应,上电后再次按下led的状态 ...

<p>还有个中断函数的,我回去看看你的工程吧。</p>

J1anbean 发表于 2023-5-5 17:16

<p>好的 就是实现上电LED1亮&nbsp; 然后按键PA5控制LED1的亮灭</p>

lugl4313820 发表于 2023-5-6 06:45

J1anbean 发表于 2023-5-5 15:33
#ifndef __MAIN_H__
#define __MAIN_H__

#ifdef __cplusplus
extern &ldquo;C&rdquo; {
#endif

#i ...

<p>我回来看了一下你的代码:</p>

<p>#define KEY_INPUT_PORT GPIOA<br />
#define KEY_INPUT_PIN GPIO_PIN_5</p>

<p>PA5最后别配置给普通IO使用,要不会下载不了固件。开发板的按键 的IO是PB1、PB2。你换成PB1,PB2试一下。</p>

lugl4313820 发表于 2023-5-6 06:46

<p>&nbsp;这是开发板原理图中按键部分。</p>

<p>我有个帖子是,专门因为PA4、PA5配置成普通IO后下载不了固件的,你可以去看看。</p>

J1anbean 发表于 2023-5-6 09:00

<p>但是我的开发板按键是PA4 PA5 PA6&nbsp; &nbsp;&nbsp; &nbsp;</p>

J1anbean 发表于 2023-5-6 09:05

<p>知道是什么问题了&nbsp; 是PA5按键有问题开发板&nbsp; 换成PA4 PA6就没问题能实现了</p>

lugl4313820 发表于 2023-5-6 09:48

J1anbean 发表于 2023-5-6 09:05
知道是什么问题了&nbsp; 是PA5按键有问题开发板&nbsp; 换成PA4 PA6就没问题能实现了

<p>可能这款芯片要验证一下吧,我感觉也有得特殊。</p>

J1anbean 发表于 2023-5-6 09:59

lugl4313820 发表于 2023-5-6 09:48
可能这款芯片要验证一下吧,我感觉也有得特殊。

<p>N32G031C8L</p>

lugl4313820 发表于 2023-5-6 10:03

J1anbean 发表于 2023-5-6 09:59
N32G031C8L

<p>我的是N32WB031,不在一个频道呀。你可以到国民技术的论坛上提问题,他们的技术非常好的。</p>

J1anbean 发表于 2023-5-6 11:25

lugl4313820 发表于 2023-5-6 10:03
我的是N32WB031,不在一个频道呀。你可以到国民技术的论坛上提问题,他们的技术非常好的。

<p>我想问问国民库函数Flash存储的读写函数是哪个啊</p>

lugl4313820 发表于 2023-5-6 15:39

J1anbean 发表于 2023-5-6 11:25
我想问问国民库函数Flash存储的读写函数是哪个啊

<p>有例程的呀, &nbsp;</p>

J1anbean 发表于 2023-5-8 13:42

<p>这个函数? &nbsp;</p>

lugl4313820 发表于 2023-5-8 14:58

J1anbean 发表于 2023-5-8 13:42
这个函数? &nbsp;

<p>应该是吧。你看一下readme.txt说明文档。</p>

walker2048 发表于 2023-5-8 22:47

J1anbean 发表于 2023-5-5 16:28
这段代码是按键控制LED1的亮灭,也是按键没反应,上电瞬间按下按键才有反应,上电后再次按下led的状态 ...

<p>建议看看反汇编代码,国民的delay函数在c99规范下会被常规gcc编译器优化掉。我之前用他们的N32G45x,搭配gcc的时候就遇到过。</p>
页: 1 [2]
查看完整版本: 【国民技术N32WB031_STB开发板评测】GPIO之按键与LED灯