打印
[应用相关]

STM32F103(按键控制流水灯方向)

[复制链接]
683|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雨果喝水|  楼主 | 2021-2-25 22:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1:要求   用按键控制流水灯方向

2:基于Stm32F103RB


3:型号CT117E

使用特权

评论回复
沙发
雨果喝水|  楼主 | 2021-2-25 22:20 | 只看该作者
/*STM32库头文件*/
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x.h"
#include "core_cm3.h"
#include "misc.h"

使用特权

评论回复
板凳
雨果喝水|  楼主 | 2021-2-25 22:21 | 只看该作者
GPIO口的设置,还有宏的定义

#define LED0    GPIO_Pin_8
#define LED1    GPIO_Pin_9
#define LED2    GPIO_Pin_10
#define LED3    GPIO_Pin_11
#define LED4    GPIO_Pin_12
#define LED5    GPIO_Pin_13
#define LED6    GPIO_Pin_14
#define LED7    GPIO_Pin_15
#define LED_ALL (LED0 | LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7)
#define LED_PORT GPIOC
#define N_LE        GPIO_Pin_2
#define N_LE_PORT        GPIOD
#define SWN        4       
#define N_K1        GPIO_Pin_0
#define N_K2        GPIO_Pin_8
#define N_K3        GPIO_Pin_1
#define N_K4        GPIO_Pin_2
#define N_K1C        GPIOA
#define N_K2C        GPIOA
#define N_K3C        GPIOB
#define N_K4C        GPIOB
/*宏*/
#define LED_OUT(x)         GPIO_SetBits(LED_PORT,LED_ALL), \
                        GPIO_ResetBits(LED_PORT, x<<8), \
                        GPIO_SetBits(N_LE_PORT,N_LE), \
                        GPIO_ResetBits(N_LE_PORT,N_LE)

使用特权

评论回复
地板
雨果喝水|  楼主 | 2021-2-25 22:22 | 只看该作者
定义数组和一些标记

typedef enum
{
        FALSE = 0,
          TRUE
}y_bool;
static y_bool led_t = TRUE;        //发光标记
static y_bool rl = TRUE;        //左移右移标记
static y_bool key_t = FALSE;        //按键的检测

使用特权

评论回复
5
雨果喝水|  楼主 | 2021-2-25 22:28 | 只看该作者
void SystemInit()
{
//SystemInit为空为了骗过编译器,没有任何作用
}

使用特权

评论回复
6
雨果喝水|  楼主 | 2021-2-25 22:29 | 只看该作者
/*主函数*/

int main()
{       
        uint8_t key_dn;
        init();       
        while(1)
        {
                if(led_t)
                {
                        led_t = FALSE;
                        Led();                //
                }
                if(key_t)
                {
                        key_t = FALSE;
                        key_dn = key_c();//按键检测
                }
               
                if(key_dn)
                {
                        key_d(key_dn);//按键处理
                        key_dn = 0x00;
                }
        }
}

使用特权

评论回复
7
雨果喝水|  楼主 | 2021-2-25 22:30 | 只看该作者


   
     void init()//GPIO口的初始化
{
 GPIO_InitTypeDef GPIO_InitStructure;
 //
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);    
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);    
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
   
   
      //LED
 GPIO_InitStructure.GPIO_Pin = LED_ALL ;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_Init(LED_PORT , &GPIO_InitStructure);
   
   
      /*N_LE*/
 GPIO_InitStructure.GPIO_Pin=N_LE;
 GPIO_Init(N_LE_PORT , &GPIO_InitStructure);
 
 /*        */
 GPIO_InitStructure.GPIO_Pin =  N_K1 | N_K2;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(N_K1C , &GPIO_InitStructure);
 GPIO_InitStructure.GPIO_Pin =  N_K3 | N_K4;
 GPIO_Init(N_K3C , &GPIO_InitStructure);
   
   
     
 /*滴答定时器初始*/
    SysTick_Config(8000);
}
  

使用特权

评论回复
8
雨果喝水|  楼主 | 2021-2-25 22:30 | 只看该作者

//SysTick 中断
void SysTick_Handler()    
{
 static uint16_t i = 0;
 if(++i >= 1000)       
  i = 0;
 if(i % 20 == 0)
  key_t = TRUE;
 if(i%500 == 0)
  led_t = TRUE;
}

使用特权

评论回复
9
雨果喝水|  楼主 | 2021-2-25 22:31 | 只看该作者
/*Led显示*/
void Led()
{
        static uint8_t led_b = 0x01;
        LED_OUT(led_b);//数据的输出
        if(rl)//判断左移还是右移
        {
                if((led_b <<= 1) == 0x00)
                        led_b = 0x01;
        }
        else
        {
                if((led_b >>= 1) == 0x00)
                        led_b = 0x80;
        }
}

使用特权

评论回复
10
雨果喝水|  楼主 | 2021-2-25 22:32 | 只看该作者

/*按键检测函数*/
uint8_t key_c()
{
        static uint8_t key_o = 0x0f;
        uint8_t i, key_n, x;
        const uint16_t key_pin[SWN] = {N_K1, N_K2, N_K3, N_K4};                //各个按键的引脚
        const GPIO_TypeDef* key_port[SWN] = {N_K1C, N_K2C, N_K3C, N_K4C};//各个按键的端口
        for(key_n = 0, i = 0; i < SWN; i++)//当按键按下赋值到key_n中
        {
                key_n <<= 1;
                if(GPIO_ReadInputDataBit((GPIO_TypeDef*)key_port[i], key_pin[i]))
                        key_n |= 0x01;
        }
        x = (key_n ^ key_o) & key_o;//检测有无按键按下
        key_o = key_n;//与下一次值比较
        return x;
}

使用特权

评论回复
11
雨果喝水|  楼主 | 2021-2-25 22:35 | 只看该作者
//按键的处理

void key_d(uint8_t x)
{
        if(x & 0x08)
                rl = !rl;
}

使用特权

评论回复
12
雨果喝水|  楼主 | 2021-2-25 22:36 | 只看该作者
//按键的处理

void key_d(uint8_t x)
{
        if(x & 0x08)
                rl = !rl;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

86

主题

1165

帖子

0

粉丝