历史上的今天
今天是: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
史海拾趣
|
是从一个仪器上拆下来的一块完整的单片机,没有任何资料,芯片是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操作系统下,利用ZLGGUI和TFT6758在smartarm2200上做个实验,总共建立了两个任务:汉字显示和蜂鸣器响。main函数如下: int main (void) { GUI_Initialize(); // 初始化液晶 GUI_Set ...… 查看全部问答> |
|
我家有台电脑用了8年了,运行很慢,即使重装系统,安装版的当年XP系统,还是很慢,DDR?不是,硬盘?在网上搜了下,一盘硬盘寿命2-3万小时,所以我的硬盘基本算报销了。又参考一消息有服务器商一家公司就有几万块硬盘,每月都有换下的硬盘。。。 ...… 查看全部问答> |




