我想实现的功能是当按键KEY2按下时,LED2亮(STM32f107开发板),软件运行没错,但是下载后灯不亮

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想实现的功能是当按键KEY2按下时,LED2亮(STM32f107开发板),软件运行没错,但是下载后灯不亮相关的知识,希望对你有一定的参考价值。

#include "stm32f10x.h"
#include <stdio.h>
void Delay(u32 nCount) //通过不断for循环nCount次,达到延时的目的

for(; nCount != 0; nCount--);

LED_init()

RCC->APB2ENR |= RCC_APB2Periph_GPIOD; /* 使能APB2总线的时钟,对GPIO的端口D时钟使能 */
GPIOD->CRL |= 0x00003000; /*** 设置GPIOD的PD3配置为通用推挽模式输出50MHZ ***/

/*******************************/
void Key_init()

RCC->APB2ENR|=RCC_APB2Periph_GPIOB; //使能PORTB时钟
GPIOB->CRH|=0X00000800;
GPIOB->ODR|=0x00000400; //PB10设置成输入上拉模式

/*******************************/
u8 scan_key(void)//扫描函数

GPIOB->IDR=0x0000FFFF;
if((GPIOB->IDR&GPIO_Pin_10)==0x0000FFBF)
return 2;
else
return 0;

/**********************************/
int main(void)

u8 KeyNum = 0;
LED_init(); //LED初始化配置
Key_init(); //初始化控制按键的PA0端口

while (1)

KeyNum=scan_key();
switch(KeyNum)

case 2: GPIOD->BRR = GPIO_Pin_3;break;
default: GPIOD->BSRR = GPIO_Pin_3;break;


void Key_init()

RCC->APB2ENR|=RCC_APB2Periph_GPIOB; //使能PORTB时钟
GPIOB->CRH|=0X00000800;
GPIOB->ODR|=0x00000400; //PB10设置成输入上拉模式


这个函数中的GPIOB->CRH|=0X00000800; 这句话有问题。我猜想你本来是想把Bit11-8设置成1000,但实际效果并不是,
因为执行该语句只是把Bit11位置1,只是如此。改正方法是:先将Bit11-8清零,再设置。应该这样写: GPIOB->CRH &= 0XFFFFF0FF;GPIOB->CRH |= 0X00000800;或者你就直接赋值GPIOB->CRH=0X00000800; 有些寄存器的复位值并不是0x00000000,所以要注意一下这方面。
参考技术A 不需要这么麻烦的程序吧,我去。。。。
程序貌似没错,你查看下硬件吧,有米有上拉电阻,延时时间够长不,追问

程序是有点长,单个按键的话,可以不写延迟函数。(我是为了再增添其他三个按键才这么写的)我觉得问题是不是出在scan_key这个函数那个地方?就是换成简单的,也是每次都在扫描函数那儿出错(软件可以通过,就是下载下来后在板子上没效果),如果让你写的话,你会怎么写按键扫描那块?注:KEY1-4四个按键分别与PC4、PB10、PC13和PA0四个GPIO管脚连接,现在我只使用按键2

追答

我去,我2了,刚没仔细看,你的break是会跳出循环的,你改成continue试试

追问

不好意思,我试过了,还是不行

参考技术B e bu zhi dao lai zuo ren wu you cuo me ?追问

为什么不打汉字呢?我听不懂

51单片机按键控制LED灯状态

前言

今天更新按键模块的编程

先看电路图

可以看到,K1,K2,K3未按下时,KEY1,KEY2,KEY3三个接口处与vcc联通,处于高电平状态。
当K1,K2,K3按下时,vcc与大地接通,KEY1,KEY2,KEY3处都为低电平。
综上可知,按下开关接口处为0,松开开关为1。

我们的目的是要用开k1,k2,k3分别控制LED灯L0,L1,L2的亮灭,按下开关对应的灯亮起,松开开关灯灭。

我们再看下LED的电路图

LED的详细介绍再上一篇文章中,这里就不过多介绍了。
下面看一下代码:

#include <STC15F2K60S2.H>
sbit LedSel=P2^3;
sbit Key1=P3^2;
sbit Key2=P3^3;
sbit Key3=P1^7;
void Init()
	P2M0=0x08;
	P2M1=0x00;
	
	P0M0=0xff;
	P0M1=0x00;
	
	LedSel=1;
	P0=0;


void main()
	Init();
	while(1)
		if(Key1==0)  
        P0=0x01;  
			else P0=0;
       
    if(Key2==0)  
        P0=0x02; 
			else P0=0;
       
    if(Key3==0)  
        P0 = 0x04; 
			else P0=0;
			 

	

代码也没什么晦涩难懂的地方,就是要注意一定要写else,不然灯亮了之后不会熄灭了。

下面是代码跑出来的效果:

VID_20220719_093750

后记
按键模块就到此为止了,如果有疑问欢迎来交流
未完待续······

以上是关于我想实现的功能是当按键KEY2按下时,LED2亮(STM32f107开发板),软件运行没错,但是下载后灯不亮的主要内容,如果未能解决你的问题,请参考以下文章

FPGA实验按键控制流水灯

按键被按下时如何增加速度变量?

2440 无法进入按键中断服务函数怎么办

如何在按键被按下时触发事件?

AVR单片机教程——数字输入

ARM实验5 —— 按键中断实验