<p></p>
<p>这段代码是按键控制LED1的亮灭,也是按键没反应,上电瞬间按下按键才有反应,上电后再次按下led的状态不变的 </p>
J1anbean 发表于 2023-5-5 16:28
这段代码是按键控制LED1的亮灭,也是按键没反应,上电瞬间按下按键才有反应,上电后再次按下led的状态 ...
<p>你那个delay这样写不行的。按键检测不能这么写死的。特别是消抖的应用,一定要有状态机的思维来写。晚上我回去给你写个demo吧,主要我还没有写到中断的作业,到时录个视频。这样就容易接受一些。</p>
<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> </p>
<p>int 按键检测(void)</p>
<p>{</p>
<p>static int 按键状态=抬起;</p>
<p>int 按键值;</p>
<p>static int 消抖计时=0;</p>
<p>if( 按键值 == 按下) //说明按键按下了</p>
<p>if ((按键状态 == 抬起装态)&& (消抖计时<消抖时间))</p>
<p>按键状态 = 消抖状态</p>
<p>计时开始</p>
<p>else if ((按键状态 == 消抖状态)&& (消抖计时>=消抖时间))</p>
<p>按键状态 = 按下状态</p>
<p>else if (( 按键值 == 抬起) && (按键状态 == 消抖状态)&&(消抖计时<消抖时间))</p>
<p>按键状态 = 消抖状态</p>
<p>else</p>
<p>按键装态 = 抬起状态;</p>
<p>消抖计时 停止;</p>
<p>消抖计时=0</p>
<p>}</p>
<p> </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> </p>
<p>//while里面最好不要加过多的延时</p>
<p>}</p>
<p>}</p>
<p><br />
</p>
<pre>
<code>按键检测:
//假设 按键是上拉输入
#define 按下 0
#define 抬起 1
#define 消抖时间 10毫秒
typedef enum_按键状态{
抬起状态,
消抖状态,
按下状态,
};
int 按键检测(void)
{
static int 按键状态=抬起;
int 按键值;
static int 消抖计时=0;
if( 按键值 == 按下) //说明按键按下了
if ((按键状态 == 抬起装态)&& (消抖计时<消抖时间))
按键状态 = 消抖状态
计时开始
else if ((按键状态 == 消抖状态)&& (消抖计时>=消抖时间))
按键状态 = 按下状态
else if(( 按键值 == 抬起)&&(按键状态 == 消抖状态)&&(消抖计时<消抖时间))
按键状态 = 消抖状态
else
按键装态 = 抬起状态;
消抖计时 停止;
消抖计时=0
}
main
{
while(1)
{
if 开始计时
消抖计时++
else
消抖计时 = 0;
if 按键状态 == 按下状态
做什么
else if 按键状态 == 抬起状态
按什么
//while里面最好不要加过多的延时
}
}
</code></pre>
<p> </p>
J1anbean 发表于 2023-5-5 16:28
这段代码是按键控制LED1的亮灭,也是按键没反应,上电瞬间按下按键才有反应,上电后再次按下led的状态 ...
<p>还有个中断函数的,我回去看看你的工程吧。</p>
<p>好的 就是实现上电LED1亮 然后按键PA5控制LED1的亮灭</p>
J1anbean 发表于 2023-5-5 15:33
#ifndef __MAIN_H__
#define __MAIN_H__
#ifdef __cplusplus
extern “C” {
#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>
<p> 这是开发板原理图中按键部分。</p>
<p>我有个帖子是,专门因为PA4、PA5配置成普通IO后下载不了固件的,你可以去看看。</p>
<p>但是我的开发板按键是PA4 PA5 PA6 </p>
<p>知道是什么问题了 是PA5按键有问题开发板 换成PA4 PA6就没问题能实现了</p>
J1anbean 发表于 2023-5-6 09:05
知道是什么问题了 是PA5按键有问题开发板 换成PA4 PA6就没问题能实现了
<p>可能这款芯片要验证一下吧,我感觉也有得特殊。</p>
lugl4313820 发表于 2023-5-6 09:48
可能这款芯片要验证一下吧,我感觉也有得特殊。
<p>N32G031C8L</p>
J1anbean 发表于 2023-5-6 09:59
N32G031C8L
<p>我的是N32WB031,不在一个频道呀。你可以到国民技术的论坛上提问题,他们的技术非常好的。</p>
lugl4313820 发表于 2023-5-6 10:03
我的是N32WB031,不在一个频道呀。你可以到国民技术的论坛上提问题,他们的技术非常好的。
<p>我想问问国民库函数Flash存储的读写函数是哪个啊</p>
J1anbean 发表于 2023-5-6 11:25
我想问问国民库函数Flash存储的读写函数是哪个啊
<p>有例程的呀, </p>
<p>这个函数? </p>
J1anbean 发表于 2023-5-8 13:42
这个函数?
<p>应该是吧。你看一下readme.txt说明文档。</p>
J1anbean 发表于 2023-5-5 16:28
这段代码是按键控制LED1的亮灭,也是按键没反应,上电瞬间按下按键才有反应,上电后再次按下led的状态 ...
<p>建议看看反汇编代码,国民的delay函数在c99规范下会被常规gcc编译器优化掉。我之前用他们的N32G45x,搭配gcc的时候就遇到过。</p>
页:
1
[2]