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