请教一个stm32程序:我写了一个按键控制LED灯翻转,调试成功的程序如下:

/*
程序名称:按键KEY4控制LED翻转(不含中断)
硬件连接:KEY4------GPIOB.10
LED-------GPIOF.6~9
*/
#include "stm32f10x.h"

void Delay (uint32_t nCount)
{
for(;nCount!=0;nCount--);
}

GPIO_InitTypeDef GPIO_InitStructure;

int main(void)
{
u8 ReadValue;
char a=0;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); //初始化GPIOF时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_ResetBits(GPIOF,GPIO_Pin_6 | GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9); //将GPIOF.6~9复位,关掉LED灯

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //初始化GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);

while (1)
{
//GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10);
if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)) //发现按键KEY4被按下
{
Delay(0xfffff); //延时消斗
if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10))//再次检测按键是否仍然被按下
{
while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10));//等待按键被放开
a^=0x01;
if(a==0)
GPIO_WriteBit(GPIOF, GPIO_Pin_6, Bit_RESET);
//GPIO_ResetBits(GPIOF,GPIO_Pin_6 | GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
else if(a==1)
GPIO_WriteBit(GPIOF, GPIO_Pin_6, Bit_SET);
//GPIO_SetBits(GPIOF,GPIO_Pin_6 | GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
}

}
}
}
但如果改成如下,就有问题了

while (1)
{
u8 ReadValue=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10);
if(!ReadValue)//发现按键KEY4被按下
{
Delay(0xfffff); //延时消斗
if(!ReadValue)//再次检测按键是否仍然被按下
{
while(!ReadValue);//等待按键被放开
a^=0x01;
if(a==0)
GPIO_WriteBit(GPIOF, GPIO_Pin_6, Bit_RESET);
//GPIO_ResetBits(GPIOF,GPIO_Pin_6 | GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
else if(a==1)
GPIO_WriteBit(GPIOF, GPIO_Pin_6, Bit_SET);
//GPIO_SetBits(GPIOF,GPIO_Pin_6 | GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
}

}
}
}

有问题的那个程序
u8 ReadValue=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10);
只在上面那条指令采集了一次按键数据。
等到执行到 while(!ReadValue);//等待按键被放开 这条指令时
数据仍然是上次采集到的那个值代表按键按下,(!ReadValue)这个值永远成立,所以无法代表按键断开。所以程序一直卡死在这条指令上。如果要通过就必须在判据里重新读取按键状态,像正确的程序那样用这样的指令
while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10));//等待按键被放开

另外因为你只读取了一次按键状态,所以下面那么多一堆软件消除抖动的程序白写了。

综上,正确的程序在每个判断的时刻都要重新读取下按键状态。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-06-22

函数调用错了   这个引脚是输出  

试试这个

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

本回答被网友采纳
第2个回答  2012-06-15
学习中
相似回答