野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8971|回复: 7

按键控制led灯没有反应,帮我看看按键程序有什么问题

[复制链接]
发表于 2017-12-2 14:29:01 | 显示全部楼层 |阅读模式
//============================
//主程序
//led-> PA8
//===========================
#include "stm32f10x.h"
#include "key.h"
#include "led.h"
//===========================
int main(void)
{
       
        LED_GPIO_Config();
        KEY_GPIO_Config();
        while(1)                           
        {          
                if( Key_Sacn() == 1 )
                {
                        GPIO_ResetBits(GPIOA,GPIO_Pin_8);       
                }
                else GPIO_SetBits(GPIOA,GPIO_Pin_8);       
        }
}

//============================
//key.c
//=============================
/*按键驱动程序*/
/*KEY1 -> PC13 低电平有效*/
//======================
#include "key.h"
//=================================================================
void KEY_GPIO_Config(void)
{
        /* 定义GPIO初始化结构体 */
        GPIO_InitTypeDef GPIO_InitStruct;
       
        /*打开外设时钟*/
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC , ENABLE);
       
        /* 配置GIPO相关外设结构体 */
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;    //上拉输入
        GPIO_Init(GPIOC,&GPIO_InitStruct);             //GPIOC 初始化
}
//===============================================================
int Key_Sacn()
{
        static int num = 0;
        if(key == 0)
        {
                while(key == 0);
                num++;
        }
        if(num!=0&&num%2==1) return 1;
        else return 0;
}

//led程序没有问题,请问我的按键 检测程序有问题吗,

回复

使用道具 举报

发表于 2017-12-2 16:20:32 | 显示全部楼层
本帖最后由 wqy_1000 于 2017-12-2 16:22 编辑

int main(void)
{
        
        LED_GPIO_Config();
        KEY_GPIO_Config();
        while(1)                           
        {         
                if( Key_Sacn() == 1 )
                {
                        GPIO_ResetBits(GPIOA,GPIO_Pin_8);        
                }
                else GPIO_SetBits(GPIOA,GPIO_Pin_8);        
        }
}

这里的写法错了
回复 支持 反对

使用道具 举报

发表于 2017-12-2 16:24:40 | 显示全部楼层
wqy_1000 发表于 2017-12-2 16:20
int main(void)
{
        

int main(void)
{
        u8 flag = 0;
        LED_GPIO_Config();
        KEY_GPIO_Config();
        while(1)                           
        {         
                if( Key_Sacn() == 1 )
                {
                        flag = ~flag;     
                }
               
               if(flag ) GPIO_ResetBits(GPIOA,GPIO_Pin_8);
              else      GPIO_SetBits(GPIOA,GPIO_Pin_8);
        }
}

可以这样写
回复 支持 反对

使用道具 举报

发表于 2017-12-2 21:25:28 | 显示全部楼层
那样为什么错了?
回复 支持 反对

使用道具 举报

发表于 2017-12-2 21:35:24 | 显示全部楼层
你以前的写法是这样的:当检测到按键时,你是把LED等点亮了,但是while的速度太快,接着下一次检测的时候,又把led熄灭了,这个时间很短,以至于看不到LED等点亮
回复 支持 1 反对 0

使用道具 举报

发表于 2017-12-3 18:34:39 | 显示全部楼层
ljcllr 发表于 2017-12-2 21:35
你以前的写法是这样的:当检测到按键时,你是把LED等点亮了,但是while的速度太快,接着下一次检测的时候, ...

按键扫描里   while(key == 0); 不是有检测按键释放吗?
回复 支持 反对

使用道具 举报

发表于 2017-12-5 13:51:00 | 显示全部楼层
没见你的读取函数呀?(key == 0)KEY值是怎么读取出来的?看你的LED亮灭不像用的位带操作
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-10 02:10:21 | 显示全部楼层
ljcllr 发表于 2017-12-2 21:35
你以前的写法是这样的:当检测到按键时,你是把LED等点亮了,但是while的速度太快,接着下一次检测的时候, ...

谢谢,我大概知道问题了,我觉得是我的板子上的按键 有问题,很松动,我换成电容按键 就可以了
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-20 08:52 , Processed in 0.030779 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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