OpenEdv-开源电子网

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

菜鸟求教,按一下按键LED灯亮,再按一下灭。求大神看看程序有什么问题

[复制链接]

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-7-31
在线时间
32 小时
发表于 2016-8-26 09:25:49 | 显示全部楼层 |阅读模式
5金钱
#define key_state_0   0   
#define key_state_1    1
#define key_state_2    2
unsigned char read_key(void);
u8 Key_Timer=10;
unsigned char Key_Number = 0;


void RCC_Config(void);
void GPIO_Config(void);
void SysTick_Configuration(void);

int main(void)
{   

    SystemInit();
    SysTick_Configuration();
    RCC_Init();
    GPIO_Config();
    GPIO_SetBits(GPIOC,GPIO_Pin_4);

    while(1)
    {
        if(!Key_Timer)
        {
          Key_Timer=10;
          Key_Number=read_key();
          if(Key_Number==1)
          {
             GPIO_ResetBits(GPIOC,GPIO_Pin_4);
           }  
          else
          {
            GPIO_SetBits(GPIOC,GPIO_Pin_4);
          }
        }
    }
}      
unsigned char read_key(void)
{
  static char key_state = 0; //摁键的状态
  unsigned char key_press; //按键是否被按下
  unsigned char key_return = 0;//按键返回值
  key_press = GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3);// 读按键I/O电?
  switch (key_state)
  {
  case key_state_0:// 按键初始态
  if (!key_press)
  key_state = key_state_1;// 键被按下,状态转换到键确认态? ?? ?? ?? ?? ?
  break;
  case key_state_1: // 按键确认态
  if (!key_press)
  {  
    key_return = 1;// 按键仍按下,按键确认输出为“1”
    key_state = key_state_2;// 状态转换到键释放态
  }
  else
  key_state = key_state_0; // 按键已抬起,转换到按键初始态
  break;
  case key_state_2:
  if (key_press)
  key_state = key_state_0;//按键已释放,转换到按键初始
  break;

  }
  return key_return;

}
void SysTick_Configuration(void)

{

     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//72M
     SysTick_Config(72000);             //这条语句最后一句话又将时钟源设为72mM的了
}
void RCC_Init()
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
}
void GPIO_Config(void)
{
    /*----------------------LED--------------------------*/
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //LED5 PC4
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//KEY2
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-7-31
在线时间
32 小时
 楼主| 发表于 2016-8-28 14:39:52 | 显示全部楼层
求大神帮忙看看,万分感谢。:
回复

使用道具 举报

56

主题

1237

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2643
金钱
2643
注册时间
2014-2-13
在线时间
518 小时
发表于 2016-8-28 18:15:12 | 显示全部楼层
同样功能的程序,可以参考下原子的教程,里面有详细讲解
技术交流,Sell 中颖单片机,欢迎私信骚扰
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-8-28 23:01:46 | 显示全部楼层
Stephanie 发表于 2016-8-28 14:39
求大神帮忙看看,万分感谢。:

很明显的问题啦,你的就是按下后有个key_return,其他状态的key_return 呢?
回复

使用道具 举报

3

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-6-22
在线时间
56 小时
发表于 2016-8-29 13:58:28 | 显示全部楼层
有一个比较老土的方法 就是在前面定义一个sum,然后:
if(Key_Number==1)
          {
            sum++;
            if(sum==1)
             GPIO_ResetBits(GPIOC,GPIO_Pin_4);
            if(sum==2){  
            GPIO_SetBits(GPIOC,GPIO_Pin_4); sum=0;}
          }
虽然我没试过 ,但应该可以用的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 13:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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