历史上的今天
返回首页

历史上的今天

今天是:2025年01月09日(星期四)

正在发生

2019年01月09日 | stm32按键轮循点灯

2019-01-09 来源:eefocus

一、实验描述及工程文件清单


1.实验描述:



按键-引脚连接:KEY1-PC5  KEY2-PC2  KEY3-PC3


LED-引脚连接:LED1-PB5  LED2-PD6  LED3-PD


用扫描的方式查询是否有按键按下:key1按下时,LED1状态取反;key2按下时,LED2状态取反;KEY3按下时,LED3状态取反。


3.库文件、用户文件:



4.USER文件: main.c、led.c、key.c、stm32f10x_it.c


二、这是我的流程图



三、代码编写


1.main.C


/****************************************************************************

*Copyright: (C)2018 武汉凌云嵌入式实验室 www.emblinux.com

*Author:luoyiran  QQ: 969303624

*Description: 本例在奋斗STM32 V5开发板上调通过;

*按键      灯

*KEY1-PC5  LED1-PB5

*KEY2-PC2  LED2-PD6

*KEY3-PC3  LED3-PD3

*文件名:main.c

*描述:按键点灯

*版本号    日期        作者      

*V1.0.0   2018.4.24   LUOYIRAN  

****************************************************************************/

#include "stm32f10x_gpio.h"

#include "stm32f10x_rcc.h"

#include "led.h"

#include "key.h"

void  delay_ms(u16 time);

int main(void)  

{  

    SystemInit();

    init_led_gpio();

    Key_GPIO_Config();


    /* turn_led(LED1,ON);

    turn_led(LED2,ON);

  turn_led(LED3,ON); */

      

    while (1)  

    {  

        if (KeyScan(GPIOC,GPIO_Pin_5) == KEY_ON)  

        {  

            /* LED1反转 读取GPIOB 5端口位的值并用1减去之后再写入此位即LED1的控制位 */  

            GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))); 

           

        }  


          

        if (KeyScan(GPIOC,GPIO_Pin_2) == KEY_ON)  

        {  

            /* LED2反转 读取GPIOD 6端口位的值并用1减去之后再写入此位即LED2的控制位 */  

            GPIO_WriteBit(GPIOD,  GPIO_Pin_6,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_6)));

           

        } 

  


         if (KeyScan(GPIOC,GPIO_Pin_3) == KEY_ON)  

        {  

            /* LED3反转 读取GPIOD 3端口位的值并用1减去之后再写入此位即LED3的控制位 */  

            GPIO_WriteBit(GPIOD,  GPIO_Pin_3,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_3)));

           

        }

 

    }  


}

 


2.led.c


/****************************************************************************

* Copyright: (C)2018 武汉凌云嵌入式实验室 www.emblinux.com

* Description: 在奋斗STM32 V5开发板上调通过; 

*LED1-PB5  

*LED2-PD6

*LED3-PD3

*版本号     日期       作者          说明

* V1.0.0   2018.4.21   LUOYIRAN   配置灯的模式

****************************************************************************/

#include "stm32f10x.h"

#define ON 1 

#define OFF 0   

 

enum 

{

  LED1 = 0,

LED2,

LED3,

MAX_LED,

};

 

typedef struct led_gpio_s

{

int                 num;    /* LED编号 */

GPIO_TypeDef        *group; /* LED使用的GPIO在哪一组: GPIOB or GPIOD */

  uint16_t            pin;    /* LED使用的GPIO组中的那一个pin: GPIO_Pin_x */

} led_gpio_t;

 

 

led_gpio_t        leds_gpio[MAX_LED] =

{

{LED1, GPIOB, GPIO_Pin_5}, /* LED1 用的GPB5 */

{LED2, GPIOD, GPIO_Pin_6}, /* LED2 用的GPD6 */

{LED3, GPIOD, GPIO_Pin_3}, /* LED3 用的GPD3 */

};

 

/*LED的初始化*/

void init_led_gpio(void)

{

int                i;

GPIO_InitTypeDef   GPIO_InitStructure;

 

/* 使能PB和PD组 GPIO的时钟 */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD , ENABLE);


/*设置 PB5(LED1), PD6(LED2), PD3(LED3)为 GPIO 输出推免模式,口线翻转速度为50MHz */

for(i=0; i

{

/*设置 PB5(LED1)为 GPIO 输出推免模式,口线翻转速度为50MHz */

GPIO_InitStructure.GPIO_Pin = leds_gpio[i].pin;      

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(leds_gpio[i].group, &GPIO_InitStructure);

  }

}

  /*使LED在初始化后处于全灭状态*/

void turn_led(int which, int cmd)

{

   if(which

return ;

 

if(OFF == cmd)

GPIO_ResetBits(leds_gpio[which].group, leds_gpio[which].pin);

else

GPIO_SetBits(leds_gpio[which].group, leds_gpio[which].pin);

 }

 


led.H


 


#ifndef __LED_H

#define __LED_H 

 

#include "stm32f10x.h"

/*定义0-ON  1-OFF*/

#define ON 0

#define OFF 1

 


extern void LED_GPIO_Config(void);

extern void init_led_gpio(void);

 

#endif /*__LED_H*/

 


3.key.C


 


/*

*函数名: KEY_GPIO_Config()

*描述:配置按键用到的I/O口

*KEY1-PC5  

*KEY2-PC2  

*KEY3-PC3

*输入:无

*输出:无*/

 

#include "stm32f10x.h"

#include "key.h"

 

void delay_ms(u16 time)     

{    

  u16 i=0;    

  while(time--)   

  {    

    i=12000;    

    while(i--);    

  }    

}  

 

 

void Key_GPIO_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;


RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC,ENABLE);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_2 |GPIO_Pin_3;

//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHZ;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;


GPIO_Init (GPIOC,&GPIO_InitStructure);


}


/* 

  * @brief  : 按键按下检测 

  * @param  : 端口 : GPIOx  端口位 : GPIO_Pin_x 

  * @retval : 按键的状态 : 按下 弹起 

  */  

uint8_t KeyScan( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin_x )  

{  

    /* 检测是否有按键按下 */  

    if ( GPIO_ReadInputDataBit( GPIOx, GPIO_Pin_x ) == KEY_ON )  

    {  

        /* 延时消抖 延时大约5ms */  

        delay_ms(5);  

        if ( GPIO_ReadInputDataBit( GPIOx, GPIO_Pin_x ) == KEY_ON )  

        {  

            while ( GPIO_ReadInputDataBit( GPIOx, GPIO_Pin_x ) == KEY_ON ); /* 等待按键释放 */  

            return KEY_ON;  

        }  

        else  

        {  

            return KEY_OFF;  

        }  

    }  

    return KEY_OFF;


}

KEY.H


#ifndef __KEY_H_

#define __KEY_H_

 

#define  KEY_ON 1 

#define  KEY_OFF 0 

 

extern void delay_ms(u16 time);

extern void Key_GPIO_Config(void);

extern uint8_t KeyScan( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin_x );

 

#endif

 

推荐阅读

史海拾趣

Hoffman_Enclosures__Inc.公司的发展小趣事

随着时间的推移,Hoffman公司不断拓展其产品线,从最初的安全保护装置逐渐扩展到包括标准机箱机柜、冷却产品及各种定制化电气方案。为了满足全球客户的需求,Hoffman在多个地区建立了生产基地和研发中心,特别是在亚太地区,青岛的研发及制造中心成为公司全球化战略的重要一环。这一布局不仅提升了公司的生产效率,也确保了产品在全球范围内的快速响应和高质量服务。

Bals Elektrotechnik GmbH & Co KG公司的发展小趣事

随着公司业务的不断扩展,Bals Elektrotechnik开始寻求国际化的发展道路。1990年代,公司决定在中国昆山设立工厂,以便更好地服务亚洲市场。这一决策不仅提高了公司的生产效率和市场竞争力,也为其在全球范围内的业务拓展提供了有力支持。

C&K Components公司的发展小趣事

进入60年代,随着计算机和电子行业的迅猛发展,C&K敏锐地捕捉到了微型开关市场的巨大潜力。公司果断进行业务重组,将重心转向计算机和电子行业的微型开关生产。这一转型不仅使C&K在技术上取得了重大突破,也使其在市场上获得了更多的机会。凭借对客户需求的深入理解和优质服务的提供,C&K迅速赢得了客户的信赖,并逐渐成为行业内的佼佼者。

FCI / Amphenol公司的发展小趣事

1997年,Amphenol公司经历了一次重要的转折点。当时,公司被KKR(一家具有传奇色彩的美国纽约的私人股权投资公司)以杠杆收购的方式收购。KKR的收购为Amphenol公司注入了新的活力,公司开始进行一系列的战略调整和业务转型。在KKR的助力下,Amphenol公司不仅保留了大部分现有的管理团队,还引入了更大的财务杠杆,使得公司能够更加灵活地应对市场变化和挑战。这一收购和转型不仅为Amphenol公司带来了新的发展机遇,也为其在全球连接器市场上的地位奠定了更加坚实的基础。

FEIG ELECTRONIC公司的发展小趣事

FEIG ELECTRONIC始终将技术创新作为企业发展的核心动力。公司不断投入大量资源进行技术研发和产品升级,以保持其在RFID领域的领先地位。近年来,FEIG推出了多款具有高性能、高可靠性、高安全性的RFID产品,如长距离读写器、智能门禁系统等。这些产品的推出不仅满足了客户的多样化需求,还进一步巩固了FEIG在RFID领域的市场地位。

以上五个故事大纲简要概述了FEIG ELECTRONIC在电子行业中的发展历程和关键事件。虽然每个故事的具体细节可能有所不同,但它们共同展示了FEIG在技术创新、市场拓展、合作创新、战略合作和持续创新方面的努力和成就。

GCi Technologies公司的发展小趣事
如手机、平板电脑、移动电源等。

问答坊 | AI 解惑

转发一篇 设计小技巧

有关设计技巧方面的资料,非常好的,希望对初学者有所帮助!…

查看全部问答>

怎么看一个单片机是否可以在线编程?

是从一个仪器上拆下来的一块完整的单片机,没有任何资料,芯片是atmel的89c51,双串口的,看起来像是能够通过串口在线编程。请教下怎么去测试它是否可以在线编程呢,需要尝试些什么软件呢,我从前没有用过能在线编程的c51,所以一点不懂这个呵呵…

查看全部问答>

开发办执行摄像头采集程序加载共享库出错

# ./v4l ./v4l: error while loading shared libraries: cannot open shared object file: can not load shared object file: No such file or directory 我的lib里面已经包含: # cd lib # ls ld-2.2.3.so        ...…

查看全部问答>

求助:嵌入式网络视频监控问题

我现在做的课题是嵌入式网络视频监控系统,在网络传输部分,我用的是tcp协议,客户端是IE浏览器,当我下载代码跑起来时,在浏览器输入ip时,希望把网页发送到客户端,但显示的界面是完全空白,是接受到了数据?还是网页(我写了一个简单的)解析不 ...…

查看全部问答>

求解:ucos下,关于TFT6758显示和蜂鸣器任务

在ucos操作系统下,利用ZLGGUI和TFT6758在smartarm2200上做个实验,总共建立了两个任务:汉字显示和蜂鸣器响。main函数如下: int main (void) {  GUI_Initialize();      // 初始化液晶     GUI_Set ...…

查看全部问答>

C8051F060 16位AD 精度能达到多少 ?

想问下 大家   C8051F060  16位AD的精度可以做到多少。…

查看全部问答>

电脑为什么用2年就慢?

我家有台电脑用了8年了,运行很慢,即使重装系统,安装版的当年XP系统,还是很慢,DDR?不是,硬盘?在网上搜了下,一盘硬盘寿命2-3万小时,所以我的硬盘基本算报销了。又参考一消息有服务器商一家公司就有几万块硬盘,每月都有换下的硬盘。。。 ...…

查看全部问答>

本人参加活动得到蓝牙耳机,求互换

想入手一块FPGA板子,谁有可互换…

查看全部问答>

AD9852四个输出口有什么差别?

AD9852四个输出口有什么差别?是不是IOUT1是余弦输出,IOUT2是DAC控制输出,需要设置DAC控制寄存器?…

查看全部问答>