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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教一个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));//等待按键被放开

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

综上,正确的程序在每个判断的时刻都要重新读取下按键状态。
参考技术A

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

试试这个

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

参考技术B 学习中

arduino蓝牙控制呼吸灯无法熄灭的问题

请教大佬,我在使用安卓发送0x02时,LED正常打开,呼吸灯代码工作,但是发送0x03的时候,LED灯无法熄灭。请问是什么问题。我尝试过不加呼吸灯的代码,只是控制LED灯的开关的话,发送0x02,LED打开正常,发送0x03时,LED熄灭正常。我不知道具体问题出在哪里,代码如下,

char data;
void setup()

Serial.begin(9600);
pinMode(9, OUTPUT);



void loop()


if (Serial.available())

data = Serial.read();

switch(data)

case 0x02:

for (int a = 0 ; a < 255; a=a-1)
analogWrite(9, a);
delay(10);

for (int a = 255; a>0; a=a-1)
analogWrite(9, a);
delay(10);


break;
case 0x03 :

digitalWrite(9, LOW);
break;
default:
break;


参考技术A 这个可能跟程序的顺序有关,试把switch() case语句放在if (Serial.available())的else里面,意思是先接受蓝牙信息,装在data里面,当接受完后再根据信号做相应的动作,还有每做完一次case建议把data = 0; 。如果还不行,可以用SoftwareSerial 程序库,在GitHub上可以免费下载

以上是关于请教一个stm32程序:我写了一个按键控制LED灯翻转,调试成功的程序如下:的主要内容,如果未能解决你的问题,请参考以下文章

stm32呼吸灯,两个led灯,一个快闪一个慢闪

PROTUSE 仿真STM32按键控制LED,按键不起作用

利用Proteus仿真STM32实现按键控制LED灯设计

利用Proteus仿真STM32实现按键控制LED灯设计

stm32单片机单led模块的作用

STM32怎么实现单片机控制LED灯常亮10S后熄灭?